You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by an...@apache.org on 2020/05/05 10:55:57 UTC

[hbase] branch branch-2 updated: HBASE-24311 Add more details in MultiVersionConcurrencyControl STUCK log message (#1654)

This is an automated email from the ASF dual-hosted git repository.

anoopsamjohn pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new 5e5b13c  HBASE-24311 Add more details in MultiVersionConcurrencyControl STUCK log message (#1654)
5e5b13c is described below

commit 5e5b13cb51b4833adc74a59eeac3f55456c5bf4e
Author: Anoop Sam John <an...@gmail.com>
AuthorDate: Tue May 5 16:25:40 2020 +0530

    HBASE-24311 Add more details in MultiVersionConcurrencyControl STUCK log message (#1654)
---
 .../apache/hadoop/hbase/regionserver/HRegion.java  |  3 ++-
 .../MultiVersionConcurrencyControl.java            | 24 ++++++++++++++++------
 2 files changed, 20 insertions(+), 7 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 bea3087..fb227ec 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
@@ -683,7 +683,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
   private boolean splitRequest;
   private byte[] explicitSplitPoint = null;
 
-  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();
+  private final MultiVersionConcurrencyControl mvcc;
 
   // Coprocessor host
   private RegionCoprocessorHost coprocessorHost;
@@ -761,6 +761,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
 
     this.wal = wal;
     this.fs = fs;
+    this.mvcc = new MultiVersionConcurrencyControl(getRegionInfo().getShortNameToLog());
 
     // 'conf' renamed to 'confParam' b/c we use this.conf in the constructor
     this.baseConf = confParam;
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java
index 0c3551b..2b350e6 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.regionserver;
 
 import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;
 import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;
+import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects.ToStringHelper;
 
 import java.util.LinkedList;
 import java.util.concurrent.atomic.AtomicLong;
@@ -39,7 +40,9 @@ import org.apache.hadoop.hbase.util.ClassSize;
 @InterfaceAudience.Private
 public class MultiVersionConcurrencyControl {
   private static final Logger LOG = LoggerFactory.getLogger(MultiVersionConcurrencyControl.class);
+  private static final long READPOINT_ADVANCE_WAIT_TIME = 10L;
 
+  final String regionName;
   final AtomicLong readPoint = new AtomicLong(0);
   final AtomicLong writePoint = new AtomicLong(0);
   private final Object readWaiters = new Object();
@@ -57,13 +60,18 @@ public class MultiVersionConcurrencyControl {
   private final LinkedList<WriteEntry> writeQueue = new LinkedList<>();
 
   public MultiVersionConcurrencyControl() {
-    super();
+    this(null);
+  }
+
+  public MultiVersionConcurrencyControl(String regionName) {
+    this.regionName = regionName;
   }
 
   /**
    * Construct and set read point. Write point is uninitialized.
    */
   public MultiVersionConcurrencyControl(long startPoint) {
+    this(null);
     tryAdvanceTo(startPoint, NONE);
   }
 
@@ -225,11 +233,12 @@ public class MultiVersionConcurrencyControl {
     synchronized (readWaiters) {
       while (readPoint.get() < e.getWriteNumber()) {
         if (count % 100 == 0 && count > 0) {
-          LOG.warn("STUCK: " + this);
+          long totalWaitTillNow = READPOINT_ADVANCE_WAIT_TIME * count;
+          LOG.warn("STUCK for : " + totalWaitTillNow + " millis. " + this);
         }
         count++;
         try {
-          readWaiters.wait(10);
+          readWaiters.wait(READPOINT_ADVANCE_WAIT_TIME);
         } catch (InterruptedException ie) {
           // We were interrupted... finish the loop -- i.e. cleanup --and then
           // on our way out, reset the interrupt flag.
@@ -245,9 +254,12 @@ public class MultiVersionConcurrencyControl {
   @VisibleForTesting
   @Override
   public String toString() {
-    return MoreObjects.toStringHelper(this)
-        .add("readPoint", readPoint)
-        .add("writePoint", writePoint).toString();
+    ToStringHelper helper = MoreObjects.toStringHelper(this).add("readPoint", readPoint)
+        .add("writePoint", writePoint);
+    if (this.regionName != null) {
+      helper.add("regionName", this.regionName);
+    }
+    return helper.toString();
   }
 
   public long getReadPoint() {