From f0c843b8076e49fdfa37c3e20102435d544815ba Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 31 Jan 2014 16:31:05 +0100 Subject: [PATCH] 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 --- .../binding/codegen/impl/SingletonHolder.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) 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); - } - } -- 2.36.6