bookkeeper-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From eolive...@apache.org
Subject bookkeeper git commit: BOOKKEEPER-1046: Avoid long to Long conversion in OrderedSafeExecutor task submit
Date Thu, 04 May 2017 18:54:25 GMT
Repository: bookkeeper
Updated Branches:
  refs/heads/master 5d282dcea -> 25c113f62


BOOKKEEPER-1046: Avoid long to Long conversion in OrderedSafeExecutor task submit

When submitting tasks to an OrderedSafeExecutor, most of the time a ledger id is being passed.
Given that the method accepts and Object, the primitive `long` is boxed into a `Long` allocated
on the heap.

Added specific method overload to directly accept longs as the key in the OrderedSafeExecutor.

Author: Matteo Merli <mmerli@yahoo-inc.com>

Reviewers: Enrico Olivelli <eolivelli@apache.org>

Closes #136 from merlimat/executor-long-conversion


Project: http://git-wip-us.apache.org/repos/asf/bookkeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/bookkeeper/commit/25c113f6
Tree: http://git-wip-us.apache.org/repos/asf/bookkeeper/tree/25c113f6
Diff: http://git-wip-us.apache.org/repos/asf/bookkeeper/diff/25c113f6

Branch: refs/heads/master
Commit: 25c113f62a40bff6ff91cf82f699fd1d35b102fb
Parents: 5d282dc
Author: Matteo Merli <mmerli@yahoo-inc.com>
Authored: Thu May 4 20:54:13 2017 +0200
Committer: Enrico Olivelli <eolivelli@apache.org>
Committed: Thu May 4 20:54:13 2017 +0200

----------------------------------------------------------------------
 .../bookkeeper/util/OrderedSafeExecutor.java    | 34 +++++++++++++++++---
 1 file changed, 30 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bookkeeper/blob/25c113f6/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/OrderedSafeExecutor.java
----------------------------------------------------------------------
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/OrderedSafeExecutor.java
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/OrderedSafeExecutor.java
index 7b4499f..05bd100 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/OrderedSafeExecutor.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/util/OrderedSafeExecutor.java
@@ -258,7 +258,15 @@ public class OrderedSafeExecutor {
         }
 
         return threads[MathUtils.signSafeMod(orderingKey.hashCode(), threads.length)];
+    }
+
+    ExecutorService chooseThread(long orderingKey) {
+        // skip hashcode generation in this special case
+        if (threads.length == 1) {
+            return threads[0];
+        }
 
+        return threads[MathUtils.signSafeMod(orderingKey, threads.length)];
     }
 
     private SafeRunnable timedRunnable(SafeRunnable r) {
@@ -383,13 +391,31 @@ public class OrderedSafeExecutor {
         return chooseThread(orderingKey).scheduleWithFixedDelay(command, initialDelay, delay,
unit);
     }
 
-    private long getThreadID(Object orderingKey) {
+    /**
+     * schedules a one time action to execute with an ordering guarantee on the key
+     * @param orderingKey
+     * @param r
+     */
+    public void submitOrdered(long orderingKey, SafeRunnable r) {
+        chooseThread(orderingKey).submit(r);
+    }
+
+    /**
+     * schedules a one time action to execute with an ordering guarantee on the key
+     * @param orderingKey
+     * @param r
+     */
+    public void submitOrdered(int orderingKey, SafeRunnable r) {
+        chooseThread(orderingKey).submit(r);
+    }
+
+    private long getThreadID(long orderingKey) {
         // skip hashcode generation in this special case
         if (threadIds.length == 1) {
             return threadIds[0];
         }
 
-        return threadIds[MathUtils.signSafeMod(orderingKey.hashCode(), threadIds.length)];
+        return threadIds[MathUtils.signSafeMod(orderingKey, threadIds.length)];
     }
 
     public void shutdown() {
@@ -415,14 +441,14 @@ public class OrderedSafeExecutor {
         private final Logger LOG = LoggerFactory.getLogger(OrderedSafeGenericCallback.class);
 
         private final OrderedSafeExecutor executor;
-        private final Object orderingKey;
+        private final long orderingKey;
 
         /**
          * @param executor The executor on which to run the callback
          * @param orderingKey Key used to decide which thread the callback
          *                    should run on.
          */
-        public OrderedSafeGenericCallback(OrderedSafeExecutor executor, Object orderingKey)
{
+        public OrderedSafeGenericCallback(OrderedSafeExecutor executor, long orderingKey)
{
             this.executor = executor;
             this.orderingKey = orderingKey;
         }


Mime
View raw message