You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2017/04/14 15:13:46 UTC

[29/50] [abbrv] ignite git commit: Minor refactoring in GridH2Table locking logic.

Minor refactoring in GridH2Table locking logic.


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

Branch: refs/heads/ignite-4587
Commit: d4c5133273de227c91a0d4003bc64853c38ad941
Parents: 428f66d
Author: devozerov <vo...@gridgain.com>
Authored: Fri Apr 14 12:37:24 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Fri Apr 14 12:37:24 2017 +0300

----------------------------------------------------------------------
 .../processors/query/h2/opt/GridH2Table.java    | 73 +++++++++++++-------
 1 file changed, 47 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/d4c51332/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
index 94c8843..98d227c 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
@@ -38,7 +38,6 @@ import org.apache.ignite.internal.processors.query.h2.database.H2RowFactory;
 import org.apache.ignite.internal.processors.query.h2.database.H2TreeIndex;
 import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMemory;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.h2.api.TableEngine;
 import org.h2.command.ddl.CreateTableData;
@@ -159,7 +158,7 @@ public class GridH2Table extends TableBase {
 
         snapshotEnabled = desc == null || desc.snapshotableIndex();
 
-        lock = snapshotEnabled ? new ReentrantReadWriteLock() : null;
+        lock = new ReentrantReadWriteLock();
     }
 
     /**
@@ -233,7 +232,7 @@ public class GridH2Table extends TableBase {
 
         GridUnsafeMemory mem = desc.memory();
 
-        Lock l = lock(false, Long.MAX_VALUE);
+        lock(false);
 
         if (mem != null)
             desc.guard().begin();
@@ -252,7 +251,7 @@ public class GridH2Table extends TableBase {
             return true;
         }
         finally {
-            unlock(l);
+            unlock(false);
 
             if (mem != null)
                 desc.guard().end();
@@ -305,8 +304,6 @@ public class GridH2Table extends TableBase {
 
         Object[] snapshots;
 
-        Lock l;
-
         // Try to reuse existing snapshots outside of the lock.
         for (long waitTime = 200;; waitTime *= 2) { // Increase wait time to avoid starvation.
             snapshots = actualSnapshot.get();
@@ -318,9 +315,7 @@ public class GridH2Table extends TableBase {
                     return; // Reused successfully.
             }
 
-            l = lock(true, waitTime);
-
-            if (l != null)
+            if (tryLock(true, waitTime))
                 break;
         }
 
@@ -340,7 +335,7 @@ public class GridH2Table extends TableBase {
             }
         }
         finally {
-            unlock(l);
+            unlock(true);
         }
     }
 
@@ -352,39 +347,65 @@ public class GridH2Table extends TableBase {
     }
 
     /**
-     * @param l Lock.
+     * Acquire table lock.
+     *
+     * @param exclusive Exclusive flag.
      */
-    private static void unlock(Lock l) {
-        if (l != null)
-            l.unlock();
+    private void lock(boolean exclusive) {
+        Lock l = exclusive ? lock.writeLock() : lock.readLock();
+
+        try {
+            l.lockInterruptibly();
+        }
+        catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+
+            throw new IgniteInterruptedException("Thread got interrupted while trying to acquire table lock.", e);
+        }
+
+        if (destroyed) {
+            unlock(exclusive);
+
+            throw new IllegalStateException("Table " + identifier() + " already destroyed.");
+        }
     }
 
     /**
      * @param exclusive Exclusive lock.
      * @param waitMillis Milliseconds to wait for the lock.
-     * @return The acquired lock or {@code null} if the lock time out occurred.
+     * @return Whether lock was acquired.
      */
-    public Lock lock(boolean exclusive, long waitMillis) {
-        if (!snapshotEnabled)
-            return null;
-
+    private boolean tryLock(boolean exclusive, long waitMillis) {
         Lock l = exclusive ? lock.writeLock() : lock.readLock();
 
         try {
             if (!l.tryLock(waitMillis, TimeUnit.MILLISECONDS))
-                return null;
+                return false;
         }
         catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+
             throw new IgniteInterruptedException("Thread got interrupted while trying to acquire table lock.", e);
         }
 
         if (destroyed) {
-            unlock(l);
+            unlock(exclusive);
 
             throw new IllegalStateException("Table " + identifier() + " already destroyed.");
         }
 
-        return l;
+        return true;
+    }
+
+    /**
+     * Release table lock.
+     *
+     * @param exclusive Exclusive flag.
+     */
+    private void unlock(boolean exclusive) {
+        Lock l = exclusive ? lock.writeLock() : lock.readLock();
+
+        l.unlock();
     }
 
     /**
@@ -438,7 +459,7 @@ public class GridH2Table extends TableBase {
      * Destroy the table.
      */
     public void destroy() {
-        Lock l = lock(true, Long.MAX_VALUE);
+        lock(true);
 
         try {
             assert sessions.isEmpty() : sessions;
@@ -449,7 +470,7 @@ public class GridH2Table extends TableBase {
                 index(i).destroy();
         }
         finally {
-            unlock(l);
+            unlock(true);
         }
     }
 
@@ -572,7 +593,7 @@ public class GridH2Table extends TableBase {
         // getting updated from different threads with different rows with the same key is impossible.
         GridUnsafeMemory mem = desc == null ? null : desc.memory();
 
-        Lock l = lock(false, Long.MAX_VALUE);
+        lock(false);
 
         if (mem != null)
             desc.guard().begin();
@@ -647,7 +668,7 @@ public class GridH2Table extends TableBase {
             return true;
         }
         finally {
-            unlock(l);
+            unlock(false);
 
             if (mem != null)
                 desc.guard().end();