Restrict MD-SAL data operations to a single thread 70/5070/3
authorRobert Varga <rovarga@cisco.com>
Fri, 31 Jan 2014 15:31:05 +0000 (16:31 +0100)
committerRobert Varga <rovarga@cisco.com>
Mon, 3 Feb 2014 12:13:33 +0000 (13:13 +0100)
MD-SAL does not give us transaction ordering guarantees, which mean that
data may hit the data store than what the application intended. Change
the model to single-threaded until proper transaction ordering APIs are
defined.

Change-Id: I6c6375480082b94c614ab2602a2857e0f4779ee8
Signed-off-by: Robert Varga <rovarga@cisco.com>
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java

index e5cf8e6c45e1d00b56530c2b713db756111401c7..244e3503439612fb7211dd9307c191e73f048120 100644 (file)
@@ -38,9 +38,23 @@ public class SingletonHolder {
         return NOTIFICATION_EXECUTOR;
     }
 
         return NOTIFICATION_EXECUTOR;
     }
 
+    /**
+     * @deprecated This method is only used from configuration modules and thus callers of it
+     *             should use service injection to make the executor configurable.
+     */
+    @Deprecated
     public static synchronized final ListeningExecutorService getDefaultCommitExecutor() {
         if (COMMIT_EXECUTOR == null) {
     public static synchronized final ListeningExecutorService getDefaultCommitExecutor() {
         if (COMMIT_EXECUTOR == null) {
-            COMMIT_EXECUTOR = createNamedExecutor("md-sal-binding-commit-%d");
+            ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat("md-sal-binding-commit-%d").build();
+           /*
+            * FIXME: this used to be newCacheThreadPool(), but MD-SAL does not have transaction
+            *        ordering guarantees, which means that using a concurrent threadpool results
+            *        in application data being committed in random order, potentially resulting
+            *        in inconsistent data being present. Once proper primitives are introduced,
+            *        concurrency can be reintroduced.
+            */
+            ExecutorService executor = Executors.newSingleThreadExecutor(factory);
+            COMMIT_EXECUTOR = MoreExecutors.listeningDecorator(executor);
         }
 
         return COMMIT_EXECUTOR;
         }
 
         return COMMIT_EXECUTOR;
@@ -50,7 +64,5 @@ public class SingletonHolder {
         ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat(format).build();
         ExecutorService executor = Executors.newCachedThreadPool(factory);
         return MoreExecutors.listeningDecorator(executor);
         ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat(format).build();
         ExecutorService executor = Executors.newCachedThreadPool(factory);
         return MoreExecutors.listeningDecorator(executor);
-
     }
     }
-
 }
 }