You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by se...@apache.org on 2017/02/05 19:45:11 UTC

[9/9] ignite git commit: ignite-4652 - refactor for invoke

ignite-4652 - refactor for invoke


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

Branch: refs/heads/ignite-4652
Commit: 34d8c4a8d4b6905ebc848c54af61703a9cea6038
Parents: 057617c
Author: Sergi <se...@gmail.com>
Authored: Sun Feb 5 22:40:39 2017 +0300
Committer: Sergi <se...@gmail.com>
Committed: Sun Feb 5 22:40:39 2017 +0300

----------------------------------------------------------------------
 .../cache/database/tree/BPlusTree.java          | 129 +++++++++++++++----
 .../apache/ignite/internal/util/IgniteTree.java |  14 +-
 2 files changed, 116 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/34d8c4a8/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
index a1860f0..cad9491 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
@@ -68,6 +68,10 @@ import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTre
 import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.Bool.FALSE;
 import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.Bool.READY;
 import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.Bool.TRUE;
+import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.InvokeType.DELETE;
+import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.InvokeType.INSERT;
+import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.InvokeType.NOOP;
+import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.InvokeType.REPLACE;
 import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.Result.FOUND;
 import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.Result.GO_DOWN;
 import static org.apache.ignite.internal.processors.cache.database.tree.BPlusTree.Result.GO_DOWN_X;
@@ -79,7 +83,6 @@ import static org.apache.ignite.internal.processors.cache.database.tree.util.Pag
 import static org.apache.ignite.internal.processors.cache.database.tree.util.PageHandler.readPage;
 import static org.apache.ignite.internal.processors.cache.database.tree.util.PageHandler.writePage;
 import static org.apache.ignite.internal.util.IgniteTree.OperationType.REMOVE;
-import static org.apache.ignite.internal.util.IgniteTree.OperationType.UPDATE;
 
 /**
  * Abstract B+Tree.
@@ -241,7 +244,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return FOUND;
         }
-    };
+    }
 
     /** */
     private final GetPageHandler<Get> search = new Search();
@@ -323,7 +326,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return GO_DOWN;
         }
-    };
+    }
 
     /** */
     private final GetPageHandler<Put> replace = new Replace();
@@ -333,6 +336,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
      */
     private class Replace extends GetPageHandler<Put> {
         /** {@inheritDoc} */
+        @SuppressWarnings("unchecked")
         @Override public Result run0(Page page, long pageAddr, BPlusIO<L> io, Put p, int lvl)
             throws IgniteCheckedException  {
             // Check the triangle invariant.
@@ -371,7 +375,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return FOUND;
         }
-    };
+    }
 
     /** */
     private final GetPageHandler<Put> insert = new Insert();
@@ -417,7 +421,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return FOUND;
         }
-    };
+    }
 
     /** */
     private final GetPageHandler<Invoke> rmvFromLeaf = new RemoveFromLeaf();
@@ -495,7 +499,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return FOUND;
         }
-    };
+    }
 
     /** */
     private final GetPageHandler<Invoke> lockBackAndRmvFromLeaf = new LockBackAndRmvFromLeaf();
@@ -520,7 +524,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return res;
         }
-    };
+    }
 
     /** */
     private final GetPageHandler<Invoke> lockBackAndTail = new LockBackAndTail();
@@ -544,7 +548,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return res;
         }
-    };
+    }
 
     /** */
     private final GetPageHandler<Invoke> lockTailForward = new LockTailForward();
@@ -560,7 +564,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return FOUND;
         }
-    };
+    }
 
     /** */
     private final GetPageHandler<Invoke> lockTail = new LockTail();
@@ -590,7 +594,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return FOUND;
         }
-    };
+    }
 
     /** */
     private final PageHandler<Void, Bool> cutRoot = new CutRoot();
@@ -620,7 +624,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return TRUE;
         }
-    };
+    }
 
     /** */
     private final PageHandler<Long, Bool> addRoot = new AddRoot();
@@ -651,7 +655,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return TRUE;
         }
-    };
+    }
 
     /** */
     private final PageHandler<Long, Bool> initRoot = new InitRoot();
@@ -680,7 +684,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
 
             return TRUE;
         }
-    };
+    }
 
     /**
      * @param name Tree name.
@@ -907,6 +911,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
      * @return Found result.
      * @throws IgniteCheckedException If failed.
      */
+    @SuppressWarnings("unchecked")
     public final <R> R findOne(L row, RowClosure<L, R> c) throws IgniteCheckedException {
         checkDestroyed();
 
@@ -1564,8 +1569,9 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
                     case NOT_FOUND:
                         // We are at the bottom.
                         assert lvl == 0 : lvl;
+                        assert r.invokeType != null;
 
-                        if (r.opType == UPDATE) {
+                        if (r.invokeType == INSERT) {
                             // TODO insert
                         }
                         else if (!r.ceil) {
@@ -1579,6 +1585,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
                     case FOUND:
                         // We must be at the bottom here, just need to remove row from the current page.
                         assert lvl == 0 : lvl;
+                        assert r.invokeType != null;
 
                         res = r.removeFromLeaf(pageId, page, backId, fwdId);
 
@@ -1834,7 +1841,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
     /**
      * @return {@code True} if state was changed.
      */
-    private final boolean markDestroyed() {
+    private boolean markDestroyed() {
         return destroyed.compareAndSet(false, true);
     }
 
@@ -2184,6 +2191,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
         }
 
         /** {@inheritDoc} */
+        @SuppressWarnings("unchecked")
         @Override boolean found(BPlusIO<L> io, long pageAddr, int idx, int lvl) throws IgniteCheckedException {
             // Check if we are on an inner page and can't get row from it.
             if (lvl != 0 && !canGetRowFromInner)
@@ -2510,7 +2518,10 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
         private final InvokeClosure<T> c;
 
         /** */
-        private OperationType opType;
+        private boolean closureInvoked;
+
+        /** */
+        private InvokeType invokeType;
 
         /**
          * @param row Row.
@@ -2524,9 +2535,43 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
             this.ceil = ceil;
             this.needOld = needOld;
             this.c = c;
+        }
+
+        /**
+         * @return Operation type or {@code null} if it is unknown yet.
+         */
+        private OperationType getOperationType() {
+            return c == null ? REMOVE : c.operationType();
+        }
+
+        /**
+         * @param rowFound If the old row was found.
+         */
+        private void setupInvokeType(boolean rowFound) {
+            if (invokeType != null)
+                return;
+
+            OperationType opType = getOperationType();
+
+            if (opType == null)
+                return;
+
+            switch (opType) {
+                case NOOP:
+                    invokeType = NOOP;
+                    break;
+
+                case PUT:
+                    invokeType = rowFound ? REPLACE : INSERT;
+                    break;
 
-            if (c == null)
-                opType = REMOVE;
+                case REMOVE:
+                    invokeType = DELETE;
+                    break;
+
+                default:
+                    throw new IllegalStateException("Operation type: " + opType);
+            }
         }
 
         /** {@inheritDoc} */
@@ -2576,8 +2621,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
             if (lvl == 0) {
                 assert tail == null;
 
-                if (c != null)
-                    opType = c.call(null);
+                doInvokeClosure(null, 0L, 0);
 
                 return true;
             }
@@ -2585,12 +2629,33 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
             return false;
         }
 
+        /**
+         * @param io Page IO.
+         * @param pageAddr Page address.
+         * @param idx Index of found entry.
+         * @throws IgniteCheckedException If failed.
+         */
+        private void doInvokeClosure(BPlusIO<L> io, long pageAddr, int idx) throws IgniteCheckedException {
+            boolean rowFound = io != null;
+
+            if (c != null && !closureInvoked) {
+                c.call(rowFound ? getRow(io, pageAddr, idx) : null);
+
+                closureInvoked = true;
+            }
+
+            setupInvokeType(rowFound);
+        }
+
         /** {@inheritDoc} */
         @Override boolean found(BPlusIO<L> io, long pageAddr, int idx, int lvl) throws IgniteCheckedException {
-            if (lvl == 0 && c != null)
-                opType = c.call(getRow(io, pageAddr, idx));
+            if (lvl == 0) {
+                doInvokeClosure(io, pageAddr, idx);
+
+                return true;
+            }
 
-            return super.found(io, pageAddr, idx, lvl);
+            return false;
         }
 
         /**
@@ -2950,6 +3015,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
          * @param idx Index to remove.
          * @throws IgniteCheckedException If failed.
          */
+        @SuppressWarnings("unchecked")
         private void removeDataRowFromLeaf(Page page, BPlusIO<L> io, long pageAddr, int cnt, int idx)
             throws IgniteCheckedException {
             assert idx >= 0 && idx < cnt: idx;
@@ -4017,4 +4083,21 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
         /** */
         DONE
     }
+
+    /**
+     * Type of invoke.
+     */
+    enum InvokeType {
+        /** */
+        INSERT,
+
+        /** */
+        REPLACE,
+
+        /** */
+        DELETE,
+
+        /** */
+        NOOP
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/34d8c4a8/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteTree.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteTree.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteTree.java
index 7968361..7ae414f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteTree.java
@@ -86,15 +86,21 @@ public interface IgniteTree<L, T> {
         /**
          *
          * @param row Old row or {@code null} if old row not found.
-         * @return Operation.
          * @throws IgniteCheckedException If failed.
          */
-        OperationType call(@Nullable T row) throws IgniteCheckedException;
+        void call(@Nullable T row) throws IgniteCheckedException;
 
         /**
-         * @return New row for {@link OperationType#UPDATE} operation.
+         * @return New row for {@link OperationType#PUT} operation.
          */
         T newRow();
+
+        /**
+         * @return Operation type for this closure or {@code null} if it is unknown.
+         *      After method {@link #call(Object)} has been called, operation type must
+         *      be know and this method can not return {@code null}.
+         */
+        OperationType operationType();
     }
 
     /**
@@ -108,6 +114,6 @@ public interface IgniteTree<L, T> {
         REMOVE,
 
         /** */
-        UPDATE
+        PUT
     }
 }