asterixdb-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kiss...@apache.org
Subject [1/6] incubator-asterixdb git commit: Deadlock-free locking protocol is enabled
Date Fri, 06 May 2016 16:23:10 GMT
Repository: incubator-asterixdb
Updated Branches:
  refs/heads/master 7c15c13d8 -> 23be90686


http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/RecoveryManager.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/RecoveryManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/RecoveryManager.java
index 9a74a18..0ec6b10 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/RecoveryManager.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/RecoveryManager.java
@@ -270,6 +270,7 @@ public class RecoveryManager implements IRecoveryManager, ILifeCycleComponent {
                     abortLogCount++;
                     break;
                 case LogType.FLUSH:
+                case LogType.WAIT:
                     break;
                 default:
                     throw new ACIDException("Unsupported LogType: " + logRecord.getLogType());
@@ -289,8 +290,8 @@ public class RecoveryManager implements IRecoveryManager, ILifeCycleComponent {
         return winnerJobSet;
     }
 
-    private synchronized void startRecoveryRedoPhase(Set<Integer> partitions, ILogReader logReader, long lowWaterMarkLSN,
-            Set<Integer> winnerJobSet) throws IOException, ACIDException {
+    private synchronized void startRecoveryRedoPhase(Set<Integer> partitions, ILogReader logReader,
+            long lowWaterMarkLSN, Set<Integer> winnerJobSet) throws IOException, ACIDException {
         int redoCount = 0;
         int jobId = -1;
 
@@ -765,6 +766,7 @@ public class RecoveryManager implements IRecoveryManager, ILifeCycleComponent {
                         throw new ACIDException("Unexpected LogType(" + logRecord.getLogType() + ") during abort.");
                     case LogType.ABORT:
                     case LogType.FLUSH:
+                    case LogType.WAIT:
                         //ignore
                         break;
                     default:

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManagementConstants.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManagementConstants.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManagementConstants.java
index 5df230b..2e72033 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManagementConstants.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManagementConstants.java
@@ -24,11 +24,6 @@ package org.apache.asterix.transaction.management.service.transaction;
  */
 public class TransactionManagementConstants {
 
-    public static class ResourceMgrIds {
-        public static final byte BTREE_RESOURCE_MGR_ID = 1;
-        public static final byte METADATA_RESOURCE_MGR_ID = 2;
-    }
-
     public static class LogManagerConstants {
         public static final int TERMINAL_LSN = -1;
     }
@@ -36,30 +31,28 @@ public class TransactionManagementConstants {
     public static class LockManagerConstants {
         public static class LockMode {
             public static final byte ANY = -1;
-            public static final byte NL  =  0;
-            public static final byte IS  =  1;
-            public static final byte IX  =  2;
-            public static final byte S   =  3;
-            public static final byte X   =  4;
-
-            public static byte intentionMode(byte mode) {
-                switch (mode) {
-                    case S:  return IS;
-                    case X:  return IX;
-                    default: throw new IllegalArgumentException(
-                            "no intention lock mode for " + toString(mode));
-                }
-            }
+            public static final byte NL = 0;
+            public static final byte IS = 1;
+            public static final byte IX = 2;
+            public static final byte S = 3;
+            public static final byte X = 4;
 
             public static String toString(byte mode) {
                 switch (mode) {
-                    case ANY: return "ANY";
-                    case NL:  return "NL";
-                    case IS:  return "IS";
-                    case IX:  return "IX";
-                    case S:   return "S";
-                    case X:   return "X";
-                    default:  throw new IllegalArgumentException("no such lock mode");
+                    case ANY:
+                        return "ANY";
+                    case NL:
+                        return "NL";
+                    case IS:
+                        return "IS";
+                    case IX:
+                        return "IX";
+                    case S:
+                        return "S";
+                    case X:
+                        return "X";
+                    default:
+                        throw new IllegalArgumentException("no such lock mode");
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java
index 2112097..f035029 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java
@@ -117,7 +117,7 @@ public class TransactionManager implements ITransactionManager, ILifeCycleCompon
             }
             throw ae;
         } finally {
-            txnSubsystem.getLockManager().releaseLocks(txnCtx); // release
+            txnSubsystem.getLockManager().releaseLocks(txnCtx);
             transactionContextRepository.remove(txnCtx.getJobId());
             txnCtx.setTxnState(ITransactionManager.COMMITTED);
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionSubsystem.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionSubsystem.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionSubsystem.java
index 6650ac6..f7ed355 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionSubsystem.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionSubsystem.java
@@ -18,6 +18,10 @@
  */
 package org.apache.asterix.transaction.management.service.transaction;
 
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+import java.util.logging.Logger;
+
 import org.apache.asterix.common.config.AsterixReplicationProperties;
 import org.apache.asterix.common.config.AsterixTransactionProperties;
 import org.apache.asterix.common.config.IAsterixPropertiesProvider;
@@ -48,6 +52,12 @@ public class TransactionSubsystem implements ITransactionSubsystem {
     private final CheckpointThread checkpointThread;
     private final AsterixTransactionProperties txnProperties;
 
+    //for profiling purpose
+    public static final boolean IS_PROFILE_MODE = false;//true
+    public long profilerEntityCommitLogCount = 0;
+    private EntityCommitProfiler ecp;
+    private Future<Object> fecp;
+
     public TransactionSubsystem(String id, IAsterixAppRuntimeContextProvider asterixAppRuntimeContextProvider,
             AsterixTransactionProperties txnProperties) throws ACIDException {
         this.asterixAppRuntimeContextProvider = asterixAppRuntimeContextProvider;
@@ -72,12 +82,17 @@ public class TransactionSubsystem implements ITransactionSubsystem {
 
         if (asterixAppRuntimeContextProvider != null) {
             this.checkpointThread = new CheckpointThread(recoveryManager,
-                    asterixAppRuntimeContextProvider.getDatasetLifecycleManager(),logManager,
+                    asterixAppRuntimeContextProvider.getDatasetLifecycleManager(), logManager,
                     this.txnProperties.getCheckpointLSNThreshold(), this.txnProperties.getCheckpointPollFrequency());
             this.checkpointThread.start();
         } else {
             this.checkpointThread = null;
         }
+
+        if (IS_PROFILE_MODE) {
+            ecp = new EntityCommitProfiler(this, this.txnProperties.getCommitProfilerReportInterval());
+            fecp = (Future<Object>) getAsterixAppRuntimeContextProvider().getThreadExecutor().submit(ecp);
+        }
     }
 
     public ILogManager getLogManager() {
@@ -108,4 +123,63 @@ public class TransactionSubsystem implements ITransactionSubsystem {
         return id;
     }
 
+    public void incrementEntityCommitCount() {
+        ++profilerEntityCommitLogCount;
+    }
+
+    /**
+     * Thread for profiling entity level commit count
+     * This thread takes a report interval (in seconds) parameter and
+     * reports entity level commit count every report interval (in seconds)
+     * only if IS_PROFILE_MODE is set to true.
+     * However, the thread doesn't start reporting the count until the entityCommitCount > 0.
+     */
+    static class EntityCommitProfiler implements Callable<Boolean> {
+        private static final Logger LOGGER = Logger.getLogger(EntityCommitProfiler.class.getName());
+        private final long reportIntervalInMillisec;
+        private long lastEntityCommitCount;
+        private int reportIntervalInSeconds;
+        private TransactionSubsystem txnSubsystem;
+        private boolean firstReport = true;
+        private long startTimeStamp = 0;
+        private long reportRound = 1;
+
+        public EntityCommitProfiler(TransactionSubsystem txnSubsystem, int reportIntervalInSeconds) {
+            Thread.currentThread().setName("EntityCommitProfiler-Thread");
+            this.txnSubsystem = txnSubsystem;
+            this.reportIntervalInSeconds = reportIntervalInSeconds;
+            this.reportIntervalInMillisec = reportIntervalInSeconds * 1000;
+            lastEntityCommitCount = txnSubsystem.profilerEntityCommitLogCount;
+        }
+
+        @Override
+        public Boolean call() throws Exception {
+            while (true) {
+                Thread.sleep(reportIntervalInMillisec);
+                if (txnSubsystem.profilerEntityCommitLogCount > 0) {
+                    if (firstReport) {
+                        startTimeStamp = System.currentTimeMillis();
+                        firstReport = false;
+                    }
+                    //output the count
+                    outputCount();
+                }
+            }
+        }
+
+        private void outputCount() {
+            long currentTimeStamp = System.currentTimeMillis();
+            long currentEntityCommitCount = txnSubsystem.profilerEntityCommitLogCount;
+
+            LOGGER.severe("EntityCommitProfiler ReportRound[" + reportRound + "], AbsoluteTimeStamp[" + currentTimeStamp
+                    + "], ActualRelativeTimeStamp[" + (currentTimeStamp - startTimeStamp)
+                    + "], ExpectedRelativeTimeStamp[" + (reportIntervalInSeconds * reportRound) + "], IIPS["
+                    + ((currentEntityCommitCount - lastEntityCommitCount) / reportIntervalInSeconds) + "], IPS["
+                    + (currentEntityCommitCount / (reportRound * reportIntervalInSeconds)) + "]");
+
+            lastEntityCommitCount = currentEntityCommitCount;
+            ++reportRound;
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/LockManagerUnitTest.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/LockManagerUnitTest.java b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/LockManagerUnitTest.java
index 5cabd04..14e4020 100644
--- a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/LockManagerUnitTest.java
+++ b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/LockManagerUnitTest.java
@@ -19,15 +19,8 @@
 
 package org.apache.asterix.transaction.management.service.locking;
 
-
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.transactions.DatasetId;
-import org.apache.asterix.common.transactions.ILockManager;
-import org.apache.asterix.common.transactions.ITransactionContext;
-import org.apache.asterix.common.transactions.JobId;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import java.io.PrintStream;
 import java.util.ArrayList;
@@ -40,10 +33,15 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.ConsoleHandler;
 import java.util.logging.Logger;
 
-import static org.apache.asterix.transaction.management.service.locking.Request.Kind;
-import static org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants.LockManagerConstants.LockMode;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import org.apache.asterix.common.transactions.DatasetId;
+import org.apache.asterix.common.transactions.ILockManager;
+import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.transaction.management.service.locking.Request.Kind;
+import org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants.LockManagerConstants.LockMode;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class LockManagerUnitTest {
 
@@ -59,7 +57,7 @@ public class LockManagerUnitTest {
         Logger.getLogger(ConcurrentLockManager.class.getName()).addHandler(new ConsoleHandler());
     }
 
-    Map<Integer, ITransactionContext> jobMap;
+    Map<Integer, ITransactionContext> jobId2TxnCtxMap;
     ILockManager lockMgr;
 
     // set to e.g. System.err to get some output
@@ -72,14 +70,14 @@ public class LockManagerUnitTest {
 
     @Before
     public void setUp() throws Exception {
-        jobMap = new HashMap<>();
+        jobId2TxnCtxMap = new HashMap<>();
         lockMgr = new ConcurrentLockManager(LOCK_MGR_SHRINK_TIMER, LOCK_MGR_ARENAS, LOCK_MGR_TABLE_SIZE);
     }
 
     @After
     public void tearDown() throws Exception {
         lockMgr = null;
-        jobMap = null;
+        jobId2TxnCtxMap = null;
     }
 
     @Test
@@ -87,7 +85,6 @@ public class LockManagerUnitTest {
         List<Request> reqs = new ArrayList<>();
         reqs.add(req(Kind.LOCK, j(1), d(1), e(1), LockMode.S));
         reqs.add(req(Kind.UNLOCK, j(1), d(1), e(1), LockMode.S));
-        reqs.add(req(Kind.UNLOCK, j(1), d(1), e(-1), LockMode.IS));
         reportErrors(execute(reqs));
     }
 
@@ -139,55 +136,16 @@ public class LockManagerUnitTest {
     }
 
     @Test
-    public void testDeadlock() throws Exception {
-        List<Request> reqs = new ArrayList<>();
-        reqs.add(req(Kind.LOCK, j(1), d(1), e(1), LockMode.X));
-        reqs.add(req(Kind.LOCK, j(2), d(1), e(2), LockMode.X));
-        reqs.add(req(Kind.LOCK, j(2), d(1), e(1), LockMode.X));
-        reqs.add(req(Kind.LOCK, j(1), d(1), e(2), LockMode.X));
-        reqs.add(req(Kind.RELEASE, j(1)));
-        reqs.add(req(Kind.RELEASE, j(2)));
-        expectError(execute(reqs), j(1), ACIDException.class);
-    }
-
-    @Test
-    public void testUpgrade() throws Exception {
-        List<Request> reqs = new ArrayList<>();
-        reqs.add(req(Kind.LOCK, j(1), d(1), e(1), LockMode.S));
-        reqs.add(req(Kind.LOCK, j(1), d(1), e(1), LockMode.X));
-        reqs.add(req(Kind.RELEASE, j(1)));
-        reportErrors(execute(reqs));
-    }
-
-    @Test
-    public void testUpgradeDeadlock() throws Exception {
-        List<Request> reqs = new ArrayList<>();
-        reqs.add(req(Kind.LOCK, j(1), d(1), e(1), LockMode.S));
-        reqs.add(req(Kind.LOCK, j(2), d(1), e(1), LockMode.S));
-        reqs.add(req(Kind.LOCK, j(1), d(1), e(1), LockMode.X));
-        reqs.add(req(Kind.PRINT));
-        reqs.add(req(Kind.LOCK, j(2), d(1), e(1), LockMode.X));
-        reqs.add(req(Kind.RELEASE, j(1)));
-        reqs.add(req(Kind.RELEASE, j(2)));
-        expectError(execute(reqs), j(2), ACIDException.class);
-    }
-
-    @Test
     /**
-     * Runs into a time-out and j(1) gets interrupted by
-     * the test. This scenario happens only in this test as there
-     * is additional synchronization between the locking threads
-     * through the coordinator.
+     * lock conversion/upgrade is not supported when deadlock-free locking
+     * protocol is enabled.
      */
-    public void testTimeout() throws Exception {
+    public void testUpgrade() throws Exception {
         List<Request> reqs = new ArrayList<>();
         reqs.add(req(Kind.LOCK, j(1), d(1), e(1), LockMode.S));
-        reqs.add(req(Kind.LOCK, j(2), d(1), e(1), LockMode.S));
         reqs.add(req(Kind.LOCK, j(1), d(1), e(1), LockMode.X));
         reqs.add(req(Kind.RELEASE, j(1)));
-        reqs.add(req(Kind.RELEASE, j(2)));
-        // this runs into a time-out and j(1) gets interrupted
-        expectError(execute(reqs), j(1), WaitInterruptedException.class);
+        expectError(execute(reqs), j(1), IllegalStateException.class);
     }
 
     //--------------------------------------------------------------------
@@ -202,9 +160,10 @@ public class LockManagerUnitTest {
      * LockManager in list order, however they are fulfilled in the order
      * decided by the LockManager
      *
-     * @param reqs a list of requests that will be execute in order
+     * @param reqs
+     *            a list of requests that will be execute in order
      * @return a map of (JodId, exception) pairs that can either be handled
-     * by the test or thrown using #reportErrors
+     *         by the test or thrown using #reportErrors
      */
     private Map<String, Throwable> execute(List<Request> reqs) throws InterruptedException {
         if (err != null) {
@@ -258,7 +217,7 @@ public class LockManagerUnitTest {
     private Set<Locker> createLockers(List<Request> reqs, AtomicInteger timeStamp) {
         Set<Locker> lockers = new HashSet<>();
         lockers.add(new Locker(lockMgr, null, reqs, timeStamp, err));
-        for (ITransactionContext txnCtx : jobMap.values()) {
+        for (ITransactionContext txnCtx : jobId2TxnCtxMap.values()) {
             Locker locker = new Locker(lockMgr, txnCtx, reqs, timeStamp, err);
             lockers.add(locker);
         }
@@ -275,8 +234,8 @@ public class LockManagerUnitTest {
         return threads;
     }
 
-    private Map<String, Throwable> stopThreads(Set<Locker> lockers, Map<String, Thread> threads) throws
-            InterruptedException {
+    private Map<String, Throwable> stopThreads(Set<Locker> lockers, Map<String, Thread> threads)
+            throws InterruptedException {
         Map<String, Throwable> result = new HashMap<>();
         for (Locker locker : lockers) {
             stopThread(threads.get(locker.name));
@@ -317,7 +276,8 @@ public class LockManagerUnitTest {
      * throws the first Throwable found in the map.
      * This is the default way to handle the errors returned by #execute
      *
-     * @param errors a map of (JodId, exception) pairs
+     * @param errors
+     *            a map of (JodId, exception) pairs
      */
     void reportErrors(Map<String, Throwable> errors) {
         for (String name : errors.keySet()) {
@@ -333,8 +293,10 @@ public class LockManagerUnitTest {
     /**
      * gets the error for a specific job from the errors map
      *
-     * @param errors a map of (JodId, throwable) pairs
-     * @param txnCtx the transaction context of the job whose error is requested
+     * @param errors
+     *            a map of (JodId, throwable) pairs
+     * @param txnCtx
+     *            the transaction context of the job whose error is requested
      * @return throwable for said error
      */
     private static Throwable getError(Map<String, Throwable> errors, ITransactionContext txnCtx) {
@@ -344,16 +306,19 @@ public class LockManagerUnitTest {
     /**
      * asserts that the error for a specific job from the errors map is of a specific class
      *
-     * @param errors a map of (JodId, throwable) pairs
-     * @param txnCtx the transaction context of the job whose error is requested
-     * @param clazz  the exception class
+     * @param errors
+     *            a map of (JodId, throwable) pairs
+     * @param txnCtx
+     *            the transaction context of the job whose error is requested
+     * @param clazz
+     *            the exception class
      */
     private void expectError(Map<String, Throwable> errors, ITransactionContext txnCtx,
-                             Class<? extends Throwable> clazz) throws Exception {
+            Class<? extends Throwable> clazz) throws Exception {
         Throwable error = getError(errors, txnCtx);
         if (error == null) {
-            throw new AssertionError("expected " + clazz.getSimpleName() + " for " + txnCtx.getJobId() + ", got no " +
-                    "exception");
+            throw new AssertionError(
+                    "expected " + clazz.getSimpleName() + " for " + txnCtx.getJobId() + ", got no " + "exception");
         }
         if (!clazz.isInstance(error)) {
             throw new AssertionError(error);
@@ -365,8 +330,8 @@ public class LockManagerUnitTest {
     // Convenience methods to make test description more compact
     //--------------------------------------------------------------------
 
-    private Request req(final Kind kind, final ITransactionContext txnCtx,
-                        final DatasetId dsId, final int hashValue, final byte lockMode) {
+    private Request req(final Kind kind, final ITransactionContext txnCtx, final DatasetId dsId, final int hashValue,
+            final byte lockMode) {
         return Request.create(kind, txnCtx, dsId, hashValue, lockMode);
     }
 
@@ -387,12 +352,11 @@ public class LockManagerUnitTest {
     }
 
     private ITransactionContext j(int jId) {
-        if (!jobMap.containsKey(jId)) {
+        if (!jobId2TxnCtxMap.containsKey(jId)) {
             ITransactionContext mockTxnContext = mock(ITransactionContext.class);
             when(mockTxnContext.getJobId()).thenReturn(new JobId(jId));
-            jobMap.put(jId, mockTxnContext);
+            jobId2TxnCtxMap.put(jId, mockTxnContext);
         }
-        return jobMap.get(jId);
+        return jobId2TxnCtxMap.get(jId);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Locker.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Locker.java b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Locker.java
index 164fc07..97b4f8a 100644
--- a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Locker.java
+++ b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Locker.java
@@ -18,11 +18,6 @@
 */
 package org.apache.asterix.transaction.management.service.locking;
 
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.transactions.ILockManager;
-import org.apache.asterix.common.transactions.ITransactionContext;
-import org.junit.Assert;
-
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -31,6 +26,11 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.asterix.common.exceptions.ACIDException;
+import org.apache.asterix.common.transactions.ILockManager;
+import org.apache.asterix.common.transactions.ITransactionContext;
+import org.junit.Assert;
+
 /**
  * Executes a sequence of lock requests against an ILockManager.
  * Lockers are run by different threads in the LockManagerUnitTest.
@@ -55,18 +55,22 @@ class Locker implements Runnable {
     private PrintStream err;
 
     /**
-     * @param lockMgr the ILockManager to send requests to
-     * @param txnCtx the ITransactionContext that identifies the transaction that this Locker represents
-     * @param allRequests an ordered list of lock requests for multiple transactions, this Locker will only execute
-     *                    requests for the transaction identified by txnCtx
-     * @param time a global timestamp that is used to synchronize different lockers to ensure that requests are started
-     *             in the order given in allRequests
-     * @param err a stream to write log/error information to
-     *
+     * @param lockMgr
+     *            the ILockManager to send requests to
+     * @param txnCtx
+     *            the ITransactionContext that identifies the transaction that this Locker represents
+     * @param allRequests
+     *            an ordered list of lock requests for multiple transactions, this Locker will only execute
+     *            requests for the transaction identified by txnCtx
+     * @param time
+     *            a global timestamp that is used to synchronize different lockers to ensure that requests are started
+     *            in the order given in allRequests
+     * @param err
+     *            a stream to write log/error information to
      * @see Request
      */
     Locker(ILockManager lockMgr, ITransactionContext txnCtx, List<Request> allRequests, AtomicInteger time,
-           PrintStream err) {
+            PrintStream err) {
         this.name = txnCtx == null ? "admin" : txnCtx.getJobId().toString();
         this.lockMgr = lockMgr;
 
@@ -110,7 +114,7 @@ class Locker implements Runnable {
     public void run() {
         log("running");
         try {
-            while (! hasErrors() && reqIter.hasNext()) {
+            while (!hasErrors() && reqIter.hasNext()) {
                 curReq = reqIter.next();
                 int localTime = globalTime.get();
                 while (localTime < curReq.time) {
@@ -123,13 +127,14 @@ class Locker implements Runnable {
                 log("will exec at t=" + localTime + " " + curReq);
                 try {
                     reqStart = currentTime();
-                    Assert.assertEquals(localTime, globalTime.getAndIncrement());
-                    log("incremented");
+                    Assert.assertEquals(localTime, globalTime.get());
                     curReq.setResult(curReq.request.execute(lockMgr) ? Requester.SUCCESS : Requester.FAIL);
                 } catch (ACIDException e) {
                     curReq.setResult(Requester.ERROR);
                     addError(e);
                 } finally {
+                    globalTime.getAndIncrement();
+                    log("incremented");
                     reqStart = -1;
                 }
                 log("time " + localTime);

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Request.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Request.java b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Request.java
index c7e0c42..70a803b 100644
--- a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Request.java
+++ b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Request.java
@@ -18,14 +18,14 @@
 */
 package org.apache.asterix.transaction.management.service.locking;
 
+import java.io.PrintStream;
+
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ILockManager;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants;
 
-import java.io.PrintStream;
-
 /**
  * repesents a lock request for testing.
  */
@@ -56,16 +56,17 @@ abstract class Request {
         this.txnCtx = txnCtx;
     }
 
-    String asString(final Kind kind, final ITransactionContext txnCtx,
-                    final DatasetId dsId, final int hashValue, final byte lockMode) {
-        return txnCtx.getJobId().toString() + ":" + kind.name() + ":" + dsId.getId() + ":" + hashValue + ":"
+    String asString(final Kind kind, final ITransactionContext txnCtx, final DatasetId dsId, final int hashValue,
+            final byte lockMode) {
+        return txnCtx.getJobId() + ":" + kind.name() + ":" + dsId.getId() + ":" + hashValue + ":"
                 + TransactionManagementConstants.LockManagerConstants.LockMode.toString(lockMode);
     }
 
     abstract boolean execute(ILockManager lockMgr) throws ACIDException;
 
-    static Request create(final Kind kind, final ITransactionContext txnCtx,
-                          final DatasetId dsId, final int hashValue, final byte lockMode) {
+    static Request create(final Kind kind, final ITransactionContext txnCtx, final DatasetId dsId, final int hashValue,
+            final byte lockMode) {
+
         switch (kind) {
             case INSTANT_TRY_LOCK:
                 return new Request(kind, txnCtx) {

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
index 6fc26a7..df3a211 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
@@ -442,7 +442,7 @@ public class FramewriterTest {
     private ISearchOperationCallbackFactory[] mockSearchOpCallbackFactories() throws HyracksDataException {
         ISearchOperationCallback searchOpCallback = mockSearchOpCallback();
         ISearchOperationCallbackFactory searchOpCallbackFactory = Mockito.mock(ISearchOperationCallbackFactory.class);
-        Mockito.when(searchOpCallbackFactory.createSearchOperationCallback(Mockito.anyLong(), Mockito.any()))
+        Mockito.when(searchOpCallbackFactory.createSearchOperationCallback(Mockito.anyLong(), Mockito.any(), null))
                 .thenReturn(searchOpCallback);
         return new ISearchOperationCallbackFactory[] { searchOpCallbackFactory };
     }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IModificationOperationCallbackFactory.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IModificationOperationCallbackFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IModificationOperationCallbackFactory.java
index 8d618c8..05114f0 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IModificationOperationCallbackFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IModificationOperationCallbackFactory.java
@@ -21,9 +21,11 @@ package org.apache.hyracks.storage.am.common.api;
 import java.io.Serializable;
 
 import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public interface IModificationOperationCallbackFactory extends Serializable {
     public IModificationOperationCallback createModificationOperationCallback(String resourcePath, long resourceId,
-            int resourcePartition, Object resource, IHyracksTaskContext ctx) throws HyracksDataException;
+            int resourcePartition, Object resource, IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable)
+            throws HyracksDataException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallbackFactory.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallbackFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallbackFactory.java
index 1a629e9..c0d5128 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallbackFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallbackFactory.java
@@ -21,9 +21,10 @@ package org.apache.hyracks.storage.am.common.api;
 import java.io.Serializable;
 
 import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public interface ISearchOperationCallbackFactory extends Serializable {
-    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx)
+    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable)
             throws HyracksDataException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java
index 9438632..33bad73 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java
@@ -78,7 +78,7 @@ public class IndexInsertUpdateDeleteOperatorNodePushable extends AbstractUnaryIn
             writer.open();
             modCallback = opDesc.getModificationOpCallbackFactory().createModificationOperationCallback(
                     indexHelper.getResourcePath(), indexHelper.getResourceID(), indexHelper.getResourcePartition(),
-                    index, ctx);
+                    index, ctx, this);
             indexAccessor = index.createAccessor(modCallback, NoOpOperationCallback.INSTANCE);
             ITupleFilterFactory tupleFilterFactory = opDesc.getTupleFilterFactory();
             if (tupleFilterFactory != null) {

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
index c4f3fca..650dcfa 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
@@ -133,7 +133,7 @@ public abstract class IndexSearchOperatorNodePushable extends AbstractUnaryInput
             dos = tb.getDataOutput();
             appender = new FrameTupleAppender(new VSizeFrame(ctx), true);
             ISearchOperationCallback searchCallback = opDesc.getSearchOpCallbackFactory()
-                    .createSearchOperationCallback(indexHelper.getResourceID(), ctx);
+                    .createSearchOperationCallback(indexHelper.getResourceID(), ctx, null);
             indexAccessor = index.createAccessor(NoOpOperationCallback.INSTANCE, searchCallback);
             cursor = createCursor();
             if (retainInput) {

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDiskOrderScanOperatorNodePushable.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDiskOrderScanOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDiskOrderScanOperatorNodePushable.java
index 170950e..3ac6065 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDiskOrderScanOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDiskOrderScanOperatorNodePushable.java
@@ -57,7 +57,7 @@ public class TreeIndexDiskOrderScanOperatorNodePushable extends AbstractUnaryOut
             ITreeIndexFrame cursorFrame = treeIndex.getLeafFrameFactory().createFrame();
             ITreeIndexCursor cursor = treeIndexHelper.createDiskOrderScanCursor(cursorFrame);
             ISearchOperationCallback searchCallback = opDesc.getSearchOpCallbackFactory()
-                    .createSearchOperationCallback(treeIndexHelper.getResourceID(), ctx);
+                    .createSearchOperationCallback(treeIndexHelper.getResourceID(), ctx, null);
             ITreeIndexAccessor indexAccessor = (ITreeIndexAccessor) treeIndex
                     .createAccessor(NoOpOperationCallback.INSTANCE, searchCallback);
             try {

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallbackFactory.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallbackFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallbackFactory.java
index b42e619..c2cca41 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallbackFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallbackFactory.java
@@ -19,6 +19,7 @@
 package org.apache.hyracks.storage.am.common.impls;
 
 import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.api.IModificationOperationCallback;
 import org.apache.hyracks.storage.am.common.api.IModificationOperationCallbackFactory;
@@ -30,17 +31,18 @@ import org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory;
  * Implemented as an enum to preserve singleton model while being serializable
  */
 public enum NoOpOperationCallbackFactory
-    implements ISearchOperationCallbackFactory,IModificationOperationCallbackFactory {
-        INSTANCE;
+        implements ISearchOperationCallbackFactory, IModificationOperationCallbackFactory {
+    INSTANCE;
 
     @Override
-    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx) {
+    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable) {
         return NoOpOperationCallback.INSTANCE;
     }
 
     @Override
     public IModificationOperationCallback createModificationOperationCallback(String resourcePath, long resourceId,
-            int resourcePartition, Object resource, IHyracksTaskContext ctx) throws HyracksDataException {
+            int resourcePartition, Object resource, IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable)
+            throws HyracksDataException {
         return NoOpOperationCallback.INSTANCE;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFrameWriter.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFrameWriter.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFrameWriter.java
new file mode 100644
index 0000000..47c1854
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexFrameWriter.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.lsm.common.api;
+
+import org.apache.hyracks.api.comm.IFrameWriter;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public interface ILSMIndexFrameWriter extends IFrameWriter {
+    /**
+     * Push tuples in the frame from startTupleIndex(inclusive) to endTupleIndex(exclusive)
+     * forward to the next operator/consumer.
+     *
+     * @param startTupleIndex
+     *            the first tuple's index to be pushed
+     * @param endTupleIndex
+     *            the last tuple's index to be pushed
+     * @throws HyracksDataException
+     */
+    public default void flushPartialFrame(int startTupleIndex, int endTupleIndex) throws HyracksDataException {
+        throw new HyracksDataException("flushPartialFrame() is not supported in this ILSMIndexFrameWriter");
+    }
+
+    /**
+     * Push tuples in the frame forward to the next operator/consumer.
+     * The flushed tuples don't have to be all tuples in the frame.
+     *
+     * @throws HyracksDataException
+     */
+    public default void flushPartialFrame() throws HyracksDataException {
+        throw new HyracksDataException("flushPartialFrame() is not supported in this ILSMIndexFrameWriter");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LSMIndexInsertUpdateDeleteOperatorNodePushable.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LSMIndexInsertUpdateDeleteOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LSMIndexInsertUpdateDeleteOperatorNodePushable.java
index 25f2382..de1719c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LSMIndexInsertUpdateDeleteOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LSMIndexInsertUpdateDeleteOperatorNodePushable.java
@@ -29,8 +29,10 @@ import org.apache.hyracks.storage.am.common.dataflow.IIndexOperatorDescriptor;
 import org.apache.hyracks.storage.am.common.dataflow.IndexInsertUpdateDeleteOperatorNodePushable;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexFrameWriter;
 
-public class LSMIndexInsertUpdateDeleteOperatorNodePushable extends IndexInsertUpdateDeleteOperatorNodePushable {
+public class LSMIndexInsertUpdateDeleteOperatorNodePushable extends IndexInsertUpdateDeleteOperatorNodePushable
+        implements ILSMIndexFrameWriter {
 
     protected FrameTupleAppender appender;
 
@@ -116,7 +118,8 @@ public class LSMIndexInsertUpdateDeleteOperatorNodePushable extends IndexInsertU
         }
     }
 
-    private void flushPartialFrame(int startTupleIndex, int endTupleIndex) throws HyracksDataException {
+    @Override
+    public void flushPartialFrame(int startTupleIndex, int endTupleIndex) throws HyracksDataException {
         for (int i = startTupleIndex; i < endTupleIndex; i++) {
             FrameUtils.appendToWriter(writer, appender, accessor, i);
         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/23be9068/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ConstantMergePolicy.java
----------------------------------------------------------------------
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ConstantMergePolicy.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ConstantMergePolicy.java
index aad5bf4..7340fdb 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ConstantMergePolicy.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ConstantMergePolicy.java
@@ -131,7 +131,6 @@ public class ConstantMergePolicy implements ILSMMergePolicy {
      * This method returns whether there is an ongoing merge operation or not by checking
      * each component state of given components.
      *
-     * @param immutableComponents
      * @return true if there is an ongoing merge operation, false otherwise.
      */
     private boolean isMergeOngoing(List<ILSMComponent> immutableComponents) {


Mime
View raw message