You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/04/17 15:30:43 UTC

[james-project] 09/16: JAMES-3146 Avoid batching single values

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit ea486bae41ed791e96ae923e2f6961ff7fead271
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sat Apr 11 20:47:48 2020 +0700

    JAMES-3146 Avoid batching single values
    
    Batches incurs a performance penalty for no isolation/transactionality
    when combined with lightweight transaction. We 'd better not pay this
    cost.
    
    Glowroot instrumentation showed adding an event to an aggregate took 40ms
---
 .../eventstore/cassandra/EventStoreDao.scala             | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/EventStoreDao.scala b/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/EventStoreDao.scala
index 9fda3a4..5921733 100644
--- a/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/EventStoreDao.scala
+++ b/event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/EventStoreDao.scala
@@ -51,10 +51,18 @@ class EventStoreDao @Inject() (val session: Session, val jsonEventSerializer: Js
   }
 
   private[cassandra] def appendAll(events: Iterable[Event]): SMono[Boolean] = {
-    val batch: BatchStatement = new BatchStatement
-    events.foreach((event: Event) => batch.add(insertEvent(event)))
-    SMono(cassandraAsyncExecutor.executeReturnApplied(batch))
-      .map(_.booleanValue())
+    SMono(cassandraAsyncExecutor.executeReturnApplied(appendQuery(events))
+      .map(_.booleanValue()))
+  }
+
+  private def appendQuery(events: Iterable[Event]) = {
+    if (events.size == 1)
+      insertEvent(events.head)
+    else {
+      val batch: BatchStatement = new BatchStatement
+      events.foreach((event: Event) => batch.add(insertEvent(event)))
+      batch
+    }
   }
 
   private def insertEvent(event: Event): BoundStatement = {


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org