X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fbinding%2Fcodegen%2Fimpl%2FSingletonHolder.java;h=4141bba2d44ec1ec13502c984efc36e282f4f912;hp=ac26445bf408677b6e397c9fbb77bcf4fcaa19de;hb=31b7a44c89d1057489338492fcf62a64147bea24;hpb=567792806ed799ac649cc125bffb4debde40d254 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 ac26445bf4..4141bba2d4 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 @@ -33,6 +33,8 @@ public class SingletonHolder { public static final int CORE_NOTIFICATION_THREADS = 4; public static final int MAX_NOTIFICATION_THREADS = 32; + // block caller thread after MAX_NOTIFICATION_THREADS + MAX_NOTIFICATION_QUEUE_SIZE pending notifications + public static final int MAX_NOTIFICATION_QUEUE_SIZE = 10; public static final int NOTIFICATION_THREAD_LIFE = 15; private static ListeningExecutorService NOTIFICATION_EXECUTOR = null; @@ -47,19 +49,15 @@ public class SingletonHolder { public static synchronized final ListeningExecutorService getDefaultNotificationExecutor() { if (NOTIFICATION_EXECUTOR == null) { - // Overriding the queue since we need an unbounded queue - // and threadpoolexecutor would not create new threads if the queue is not full - BlockingQueue queue = new LinkedBlockingQueue() { + // Overriding the queue: + // ThreadPoolExecutor would not create new threads if the queue is not full, thus adding + // occurs in RejectedExecutionHandler. + // This impl saturates threadpool first, then queue. When both are full caller will get blocked. + BlockingQueue queue = new LinkedBlockingQueue(MAX_NOTIFICATION_QUEUE_SIZE) { @Override public boolean offer(Runnable r) { - if (size() <= 1) { - // if the queue is empty (or has just 1), no need to rampup the threads - return super.offer(r); - } else { - // if the queue is not empty, force the queue to return false. - // threadpoolexecutor will spawn a new thread if the queue.offer returns false. - return false; - } + // ThreadPoolExecutor will spawn a new thread after core size is reached only if the queue.offer returns false. + return false; } }; @@ -74,7 +72,8 @@ public class SingletonHolder { try { executor.getQueue().put(r); } catch (InterruptedException e) { - e.printStackTrace(); + Thread.currentThread().interrupt();// set interrupt flag after clearing + throw new IllegalStateException(e); } } });