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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to