apurtell commented on a change in pull request #2574:
URL: https://github.com/apache/hbase/pull/2574#discussion_r516166902



##########
File path: 
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
##########
@@ -4565,17 +4663,23 @@ private void doMiniBatchMutate(BatchOperation<?> 
batchOp) throws IOException {
       lock(this.updatesLock.readLock(), miniBatchOp.getReadyToWriteCount());
       locked = true;
 
+      // From this point until memstore update this operation should not be 
interrupted.
+      disableInterrupts();

Review comment:
       Yes, here I can put a checkInterrupt. Let me do that.
   
   If we remove the handler from the map at this point, no other mini batch 
will be eligible for interrupt. 
   
   batchMutate does this:
   
       while (!batchOp.isDone()) {
           ...
           doMiniBatchMutate(batchOp);
           ...
         }
   
   If we remove the handler from the map only the first iteration through the 
loop can be interrupted. 

##########
File path: 
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
##########
@@ -4565,17 +4663,23 @@ private void doMiniBatchMutate(BatchOperation<?> 
batchOp) throws IOException {
       lock(this.updatesLock.readLock(), miniBatchOp.getReadyToWriteCount());
       locked = true;
 
+      // From this point until memstore update this operation should not be 
interrupted.
+      disableInterrupts();

Review comment:
       Yes, here I can put a checkInterrupt. Let me do that.
   
   If we remove the handler from the map at this point, no other mini batch 
will be eligible for interrupt. 
   
   batchMutate does this:
   
       while (!batchOp.isDone()) {
           ...
           doMiniBatchMutate(batchOp);
           ...
         }
   

##########
File path: 
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
##########
@@ -8303,9 +8428,14 @@ public void processRowsWithLocks(RowProcessor<?,?> 
processor, long timeout,
             prevRowLock = rowLock;
           }
         }
+
         // STEP 3. Region lock
         lock(this.updatesLock.readLock(), acquiredRowLocks.isEmpty() ? 1 : 
acquiredRowLocks.size());
         locked = true;
+
+        // From this point until memstore update this operation should not be 
interrupted.
+        disableInterrupts();

Review comment:
       Will add a checkInterrupt here too. 

##########
File path: 
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
##########
@@ -7623,6 +7740,9 @@ protected boolean nextRow(ScannerContext scannerContext, 
Cell curRowCell) throws
       Cell next;
       while ((next = this.storeHeap.peek()) != null &&
              CellUtil.matchingRows(next, curRowCell)) {
+        // Check for thread interrupt status in case we have been signaled from
+        // #interruptRegionOperation.
+        checkInterrupt();

Review comment:
       Good point. Agreed it would be a good follow up. 

##########
File path: 
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
##########
@@ -8303,9 +8428,14 @@ public void processRowsWithLocks(RowProcessor<?,?> 
processor, long timeout,
             prevRowLock = rowLock;
           }
         }
+
         // STEP 3. Region lock
         lock(this.updatesLock.readLock(), acquiredRowLocks.isEmpty() ? 1 : 
acquiredRowLocks.size());
         locked = true;
+
+        // From this point until memstore update this operation should not be 
interrupted.
+        disableInterrupts();

Review comment:
       This code is not executed in a loop so removing the thread from the map 
would be fine. However the reason why I also do disable/enable interrupt is as 
follows: We already have to do this for doMiniBatchMutation. The disable/enable 
interrupt pair is a new code discipline. This section of the code also has the 
same requirements. Apply the new code discipline here too for consistency. 

##########
File path: 
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
##########
@@ -8303,9 +8428,14 @@ public void processRowsWithLocks(RowProcessor<?,?> 
processor, long timeout,
             prevRowLock = rowLock;
           }
         }
+
         // STEP 3. Region lock
         lock(this.updatesLock.readLock(), acquiredRowLocks.isEmpty() ? 1 : 
acquiredRowLocks.size());
         locked = true;
+
+        // From this point until memstore update this operation should not be 
interrupted.
+        disableInterrupts();

Review comment:
       This code is not executed in a loop so removing the thread from the map 
would be fine. However the reason why I also do disable/enable interrupt is as 
follows: We already have to do this for doMiniBatchMutation. (The 
disable/enable pair in doMiniBatchMutation protects WAL update and memstore 
insert from interrupt and makes them "atomic" in this sense, and disable/enable 
makes sense there because doMiniBatchMutation is inside a loop.) The 
disable/enable interrupt pair is a new code discipline. This section of the 
code also has the same requirements. Apply the new code discipline here too for 
consistency. 




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to