From f67dae90f952e84681a07a612b8005a2d688cae5 Mon Sep 17 00:00:00 2001 From: James Taylor Date: Mon, 31 Jul 2017 12:00:04 -0700 Subject: [PATCH] HBASE-18487 Minor fixes in row lock implementation Signed-off-by: Andrew Purtell --- .../org/apache/hadoop/hbase/regionserver/HRegion.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 2163ac0edf6..31357adac4e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -5404,6 +5404,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi traceScope.getSpan().addTimelineAnnotation("Getting a " + (readLock?"readLock":"writeLock")); } + boolean success = false; try { // Keep trying until we have a lock or error out. // TODO: do we need to add a time component here? @@ -5434,8 +5435,6 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi traceScope.getSpan().addTimelineAnnotation("Failed to get row lock"); } result = null; - // Clean up the counts just in case this was the thing keeping the context alive. - rowLockContext.cleanUp(); String message = "Timed out waiting for lock for row: " + rowKey + " in region " + getRegionInfo().getEncodedName(); if (reachDeadlineFirst) { @@ -5446,6 +5445,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi } } rowLockContext.setThreadName(Thread.currentThread().getName()); + success = true; return result; } catch (InterruptedException ie) { LOG.warn("Thread interrupted waiting for lock on row: " + rowKey); @@ -5457,6 +5457,10 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi Thread.currentThread().interrupt(); throw iie; } finally { + // Clean up the counts just in case this was the thing keeping the context alive. + if (!success && rowLockContext != null) { + rowLockContext.cleanUp(); + } if (traceScope != null) { traceScope.close(); } @@ -5519,7 +5523,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi long c = count.decrementAndGet(); if (c <= 0) { synchronized (lock) { - if (count.get() <= 0){ + if (count.get() <= 0 && usable.get()){ // Don't attempt to remove row if already removed usable.set(false); RowLockContext removed = lockedRows.remove(row); assert removed == this: "we should never remove a different context";