You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/03/03 20:00:45 UTC

[1/5] ignite git commit: IGNITE-2745: Implemented.

Repository: ignite
Updated Branches:
  refs/heads/ignite-atomic-good-lock-bench 59f7afdde -> cfcb03f97


IGNITE-2745: Implemented.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6c51acee
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6c51acee
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6c51acee

Branch: refs/heads/ignite-atomic-good-lock-bench
Commit: 6c51acee174fde0936567a561760e29f9d3f2a95
Parents: 9200ec8
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Wed Mar 2 15:48:04 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Wed Mar 2 15:48:04 2016 +0300

----------------------------------------------------------------------
 .../managers/communication/GridIoManager.java   | 181 +++++++++++++++++--
 1 file changed, 170 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/6c51acee/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
index 36be9ec..aaaa95d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
@@ -37,6 +37,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.cluster.ClusterNode;
@@ -116,6 +117,12 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
     /** Listeners by topic. */
     private final ConcurrentMap<Object, GridMessageListener> lsnrMap = new ConcurrentHashMap8<>();
 
+    /** System listeners. */
+    private volatile GridMessageListener[] sysLsnrs;
+
+    /** Mutex for system listeners. */
+    private final Object sysLsnrsMux = new Object();
+
     /** Disconnect listeners. */
     private final Collection<GridDisconnectListener> disconnectLsnrs = new ConcurrentLinkedQueue<>();
 
@@ -201,6 +208,10 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
         discoDelay = ctx.config().getDiscoveryStartupDelay();
 
         marsh = ctx.config().getMarshaller();
+
+        synchronized (sysLsnrsMux) {
+            sysLsnrs = new GridMessageListener[GridTopic.values().length];
+        }
     }
 
     /**
@@ -733,7 +744,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
                 try {
                     threadProcessingMessage(true);
 
-                    GridMessageListener lsnr = lsnrMap.get(msg.topic());
+                    GridMessageListener lsnr = listenerGet0(msg.topic());
 
                     if (lsnr == null)
                         return;
@@ -810,7 +821,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
      */
     @SuppressWarnings("deprecation")
     private void processRegularMessage0(GridIoMessage msg, UUID nodeId) {
-        GridMessageListener lsnr = lsnrMap.get(msg.topic());
+        GridMessageListener lsnr = listenerGet0(msg.topic());
 
         if (lsnr == null)
             return;
@@ -823,6 +834,154 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
     }
 
     /**
+     * Get listener.
+     *
+     * @param topic Topic.
+     * @return Listener.
+     */
+    @Nullable private GridMessageListener listenerGet0(Object topic) {
+        if (topic instanceof GridTopic)
+            return sysLsnrs[systemListenerIndex(topic)];
+        else
+            return lsnrMap.get(topic);
+    }
+
+    /**
+     * Put listener if it is absent.
+     *
+     * @param topic Topic.
+     * @param lsnr Listener.
+     * @return Old listener (if any).
+     */
+    @Nullable private GridMessageListener listenerPutIfAbsent0(Object topic, GridMessageListener lsnr) {
+        if (topic instanceof GridTopic) {
+            synchronized (sysLsnrsMux) {
+                int idx = systemListenerIndex(topic);
+
+                GridMessageListener old = sysLsnrs[idx];
+
+                if (old == null)
+                    changeSystemListener(idx, lsnr);
+
+                return old;
+            }
+        }
+        else
+            return lsnrMap.putIfAbsent(topic, lsnr);
+    }
+
+    /**
+     * Remove listener.
+     *
+     * @param topic Topic.
+     * @return Removed listener (if any).
+     */
+    @Nullable private GridMessageListener listenerRemove0(Object topic) {
+        if (topic instanceof GridTopic) {
+            synchronized (sysLsnrsMux) {
+                int idx = systemListenerIndex(topic);
+
+                GridMessageListener old = sysLsnrs[idx];
+
+                if (old != null)
+                    changeSystemListener(idx, null);
+
+                return old;
+            }
+        }
+        else
+            return lsnrMap.remove(topic);
+    }
+
+    /**
+     * Remove listener if it matches expected value.
+     *
+     * @param topic Topic.
+     * @param expected Listener.
+     * @return Result.
+     */
+    private boolean listenerRemove0(Object topic, GridMessageListener expected) {
+        if (topic instanceof GridTopic) {
+            synchronized (sysLsnrsMux) {
+                return systemListenerChange(topic, expected, null);
+            }
+        }
+        else
+            return lsnrMap.remove(topic, expected);
+    }
+
+    /**
+     * Replace listener.
+     *
+     * @param topic Topic.
+     * @param expected Old value.
+     * @param newVal New value.
+     * @return Result.
+     */
+    private boolean listenerReplace0(Object topic, GridMessageListener expected, GridMessageListener newVal) {
+        if (topic instanceof GridTopic) {
+            return systemListenerChange(topic, expected, newVal);
+        }
+        else
+            return lsnrMap.replace(topic, expected, newVal);
+    }
+
+    /**
+     * Change system listener.
+     *
+     * @param topic Topic.
+     * @param expected Expected value.
+     * @param newVal New value.
+     * @return Result.
+     */
+    private boolean systemListenerChange(Object topic, GridMessageListener expected, GridMessageListener newVal) {
+        assert Thread.holdsLock(sysLsnrsMux);
+        assert topic instanceof GridTopic;
+
+        int idx = systemListenerIndex(topic);
+
+        GridMessageListener old = sysLsnrs[idx];
+
+        if (old != null && old.equals(expected)) {
+            changeSystemListener(idx, newVal);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Change systme listener at the given index.
+     *
+     * @param idx Index.
+     * @param lsnr Listener.
+     */
+    private void changeSystemListener(int idx, @Nullable GridMessageListener lsnr) {
+        assert Thread.holdsLock(sysLsnrsMux);
+
+        GridMessageListener[] res = new GridMessageListener[sysLsnrs.length];
+
+        System.arraycopy(sysLsnrs, 0, res, 0, sysLsnrs.length);
+
+        res[idx] = lsnr;
+
+        sysLsnrs = res;
+    }
+
+    /**
+     * Get index of a system listener.
+     *
+     * @param topic Topic.
+     * @return Index.
+     */
+    private int systemListenerIndex(Object topic) {
+        assert topic instanceof GridTopic;
+
+        return ((GridTopic)topic).ordinal();
+    }
+
+    /**
      * @param nodeId Node ID.
      * @param msg Ordered message.
      * @param plc Execution policy.
@@ -928,7 +1087,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
         if (isNew && set.endTime() != Long.MAX_VALUE)
             ctx.timeout().addTimeoutObject(set);
 
-        final GridMessageListener lsnr = lsnrMap.get(msg.topic());
+        final GridMessageListener lsnr = listenerGet0(msg.topic());
 
         if (lsnr == null) {
             if (closedTopics.contains(msg.topic())) {
@@ -1537,7 +1696,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
         GridMessageListener lsnrs;
 
         for (;;) {
-            lsnrs = lsnrMap.putIfAbsent(topic, lsnr);
+            lsnrs = listenerPutIfAbsent0(topic, lsnr);
 
             if (lsnrs == null) {
                 lsnrs = lsnr;
@@ -1550,7 +1709,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
             if (!(lsnrs instanceof ArrayListener)) { // We are putting the second listener, creating array.
                 GridMessageListener arrLsnr = new ArrayListener(lsnrs, lsnr);
 
-                if (lsnrMap.replace(topic, lsnrs, arrLsnr)) {
+                if (listenerReplace0(topic, lsnrs, arrLsnr)) {
                     lsnrs = arrLsnr;
 
                     break;
@@ -1561,7 +1720,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
                     break;
 
                 // Add operation failed because array is already empty and is about to be removed, helping and retrying.
-                lsnrMap.remove(topic, lsnrs);
+                listenerRemove0(topic, lsnrs);
             }
         }
 
@@ -1639,7 +1798,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
         if (lsnr == null) {
             closedTopics.add(topic);
 
-            lsnr = lsnrMap.remove(topic);
+            lsnr = listenerRemove0(topic);
 
             rmv = lsnr != null;
 
@@ -1650,7 +1809,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
         }
         else {
             for (;;) {
-                GridMessageListener lsnrs = lsnrMap.get(topic);
+                GridMessageListener lsnrs = listenerGet0(topic);
 
                 // If removing listener before subscription happened.
                 if (lsnrs == null) {
@@ -1670,7 +1829,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
 
                     if (!(lsnrs instanceof ArrayListener)) {
                         if (lsnrs.equals(lsnr)) {
-                            if (!lsnrMap.remove(topic, lsnrs))
+                            if (!listenerRemove0(topic, lsnrs))
                                 continue; // Retry because it can be packed to array listener.
 
                             empty = true;
@@ -1688,7 +1847,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
                             rmv = false;
 
                         if (empty)
-                            lsnrMap.remove(topic, lsnrs);
+                            listenerRemove0(topic, lsnrs);
                     }
 
                     // If removing last subscribed listener.
@@ -2132,7 +2291,7 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
         /** {@inheritDoc} */
         @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
         @Override public void onTimeout() {
-            GridMessageListener lsnr = lsnrMap.get(topic);
+            GridMessageListener lsnr = listenerGet0(topic);
 
             if (lsnr != null) {
                 long delta = 0;


[2/5] ignite git commit: Merge branch 'master' into ignite-2745

Posted by vo...@apache.org.
Merge branch 'master' into ignite-2745


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/091a39aa
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/091a39aa
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/091a39aa

Branch: refs/heads/ignite-atomic-good-lock-bench
Commit: 091a39aa582ca541621a7b04ea4f05cae17a7ce4
Parents: 6c51ace ee01b61
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Thu Mar 3 09:23:59 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Thu Mar 3 09:23:59 2016 +0300

----------------------------------------------------------------------
 .../internal/binary/BinaryEnumObjectImpl.java   |  41 ++++-
 .../internal/processors/cache/CacheObject.java  |   3 +
 .../binary/CacheObjectBinaryProcessorImpl.java  |   3 +-
 .../dht/GridDhtPartitionTopologyImpl.java       |  12 +-
 .../service/GridServiceProcessor.java           |   2 +-
 .../processors/service/GridServiceProxy.java    | 110 +++++++------
 .../ignite/internal/util/IgniteUtils.java       |  39 +++++
 .../util/StripedCompositeReadWriteLock.java     | 164 +++++++++++++++++++
 .../internal/binary/BinaryEnumsSelfTest.java    |  51 +++++-
 .../cache/CacheEnumOperationsAbstractTest.java  |  32 ++++
 ...idCacheReplicatedPreloadOffHeapSelfTest.java |   3 +-
 .../GridCacheReplicatedPreloadSelfTest.java     |  16 +-
 .../GridServiceProxyNodeStopSelfTest.java       | 105 ++++++++++++
 .../processors/service/inner/MyService.java     |  11 ++
 .../processors/service/inner/MyServiceImpl.java |  10 ++
 .../testsuites/IgniteKernalSelfTestSuite.java   |   4 +-
 16 files changed, 533 insertions(+), 73 deletions(-)
----------------------------------------------------------------------



[5/5] ignite git commit: Removed RW lock inside IO manager.

Posted by vo...@apache.org.
Removed RW lock inside IO manager.


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

Branch: refs/heads/ignite-atomic-good-lock-bench
Commit: cfcb03f9718ee2118db323d0d1556c397002f8d8
Parents: c6ce198
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Thu Mar 3 21:55:57 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Thu Mar 3 21:55:57 2016 +0300

----------------------------------------------------------------------
 .../ignite/internal/processors/cache/GridCacheIoManager.java     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/cfcb03f9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
index f6a775f..6cb3510 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
@@ -281,7 +281,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
     @SuppressWarnings({"unchecked", "ConstantConditions", "ThrowableResultOfMethodCallIgnored"})
     private void onMessage0(final UUID nodeId, final GridCacheMessage cacheMsg,
         final IgniteBiInClosure<UUID, GridCacheMessage> c) {
-        rw.readLock();
+        //rw.readLock();
 
         try {
             if (stopping) {
@@ -312,7 +312,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
             if (depEnabled)
                 cctx.deploy().ignoreOwnership(false);
 
-            rw.readUnlock();
+            //rw.readUnlock();
         }
     }
 


[3/5] ignite git commit: IGNITE-2745: Fixed.

Posted by vo...@apache.org.
IGNITE-2745: Fixed.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6f5dc2c3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6f5dc2c3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6f5dc2c3

Branch: refs/heads/ignite-atomic-good-lock-bench
Commit: 6f5dc2c3f14667e199e7f195fae92e758624326d
Parents: 091a39a
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Thu Mar 3 09:26:09 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Thu Mar 3 09:26:09 2016 +0300

----------------------------------------------------------------------
 .../ignite/internal/managers/communication/GridIoManager.java    | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/6f5dc2c3/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
index aaaa95d..232ec2e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
@@ -920,7 +920,9 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
      */
     private boolean listenerReplace0(Object topic, GridMessageListener expected, GridMessageListener newVal) {
         if (topic instanceof GridTopic) {
-            return systemListenerChange(topic, expected, newVal);
+            synchronized (sysLsnrsMux) {
+                return systemListenerChange(topic, expected, newVal);
+            }
         }
         else
             return lsnrMap.replace(topic, expected, newVal);


[4/5] ignite git commit: Merge branch 'ignite-2745' into ignite-atomic-good-lock-bench

Posted by vo...@apache.org.
Merge branch 'ignite-2745' into ignite-atomic-good-lock-bench


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

Branch: refs/heads/ignite-atomic-good-lock-bench
Commit: c6ce198d20781dd3b93bb87bcc518f1e8a950edb
Parents: 59f7afd 6f5dc2c
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Thu Mar 3 21:55:38 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Thu Mar 3 21:55:38 2016 +0300

----------------------------------------------------------------------
 .../managers/communication/GridIoManager.java   | 183 +++++++++++++++++--
 1 file changed, 172 insertions(+), 11 deletions(-)
----------------------------------------------------------------------