From: Robert Varga Date: Fri, 31 Jan 2014 15:31:05 +0000 (+0100) Subject: Restrict MD-SAL data operations to a single thread X-Git-Tag: autorelease-tag-v20140601202136_82eb3f9~534^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=refs%2Fchanges%2F70%2F5070%2F3 Restrict MD-SAL data operations to a single thread 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 --- diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java index e5cf8e6c45..244e350343 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java @@ -38,9 +38,23 @@ public class SingletonHolder { 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) { - 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; @@ -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); - } - }