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

zhangduo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new d63ca4f  HBASE-26674 Should modify filesCompacting under 
storeWriteLock (#4040)
d63ca4f is described below

commit d63ca4febef93e71afdf5677987342a7a9c69049
Author: Duo Zhang <[email protected]>
AuthorDate: Wed Jan 19 13:59:35 2022 +0800

    HBASE-26674 Should modify filesCompacting under storeWriteLock (#4040)
    
    Signed-off-by: Josh Elser <[email protected]>
---
 .../java/org/apache/hadoop/hbase/regionserver/HStore.java     | 11 ++++++-----
 .../org/apache/hadoop/hbase/regionserver/StoreEngine.java     |  6 ++++--
 .../java/org/apache/hadoop/hbase/regionserver/TestHStore.java |  4 ++--
 3 files changed, 12 insertions(+), 9 deletions(-)

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
index 851257d..7301828 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
@@ -1230,13 +1230,14 @@ public class HStore implements Store, HeapSize, 
StoreConfigInformation,
     allowedOnPath = ".*/(HStore|TestHStore).java")
   void replaceStoreFiles(Collection<HStoreFile> compactedFiles, 
Collection<HStoreFile> result,
     boolean writeCompactionMarker) throws IOException {
-    storeEngine.replaceStoreFiles(compactedFiles, result);
+    storeEngine.replaceStoreFiles(compactedFiles, result, () -> {
+      synchronized(filesCompacting) {
+        filesCompacting.removeAll(compactedFiles);
+      }
+    });
     if (writeCompactionMarker) {
       writeCompactionWalRecord(compactedFiles, result);
     }
-    synchronized (filesCompacting) {
-      filesCompacting.removeAll(compactedFiles);
-    }
     // These may be null when the RS is shutting down. The space quota Chores 
will fix the Region
     // sizes later so it's not super-critical if we miss these.
     RegionServerServices rsServices = region.getRegionServerServices();
@@ -1567,7 +1568,7 @@ public class HStore implements Store, HeapSize, 
StoreConfigInformation,
     finishCompactionRequest(compaction.getRequest());
   }
 
-  protected void finishCompactionRequest(CompactionRequestImpl cr) {
+  private void finishCompactionRequest(CompactionRequestImpl cr) {
     this.region.reportCompactionRequestEnd(cr.isMajor(), cr.getFiles().size(), 
cr.getSize());
     if (cr.isOffPeak()) {
       offPeakCompactionTracker.set(false);
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreEngine.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreEngine.java
index ddb52d1..d85553a 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreEngine.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreEngine.java
@@ -410,7 +410,8 @@ public abstract class StoreEngine<SF extends StoreFlusher, 
CP extends Compaction
     List<HStoreFile> openedFiles = openStoreFiles(toBeAddedFiles, false);
 
     // propogate the file changes to the underlying store file manager
-    replaceStoreFiles(toBeRemovedStoreFiles, openedFiles); // won't throw an 
exception
+    replaceStoreFiles(toBeRemovedStoreFiles, openedFiles, () -> {
+    }); // won't throw an exception
   }
 
   /**
@@ -493,12 +494,13 @@ public abstract class StoreEngine<SF extends 
StoreFlusher, CP extends Compaction
   }
 
   public void replaceStoreFiles(Collection<HStoreFile> compactedFiles,
-    Collection<HStoreFile> newFiles) throws IOException {
+    Collection<HStoreFile> newFiles, Runnable actionUnderLock) throws 
IOException {
     storeFileTracker.replace(StoreUtils.toStoreFileInfo(compactedFiles),
       StoreUtils.toStoreFileInfo(newFiles));
     writeLock();
     try {
       storeFileManager.addCompactionResults(compactedFiles, newFiles);
+      actionUnderLock.run();
     } finally {
       writeUnlock();
     }
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStore.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStore.java
index f6d58aa..7cc8193 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStore.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStore.java
@@ -1033,14 +1033,14 @@ public class TestHStore {
     // call first time after files changed
     spiedStoreEngine.refreshStoreFiles();
     assertEquals(2, this.store.getStorefilesCount());
-    verify(spiedStoreEngine, times(1)).replaceStoreFiles(any(), any());
+    verify(spiedStoreEngine, times(1)).replaceStoreFiles(any(), any(), any());
 
     // call second time
     spiedStoreEngine.refreshStoreFiles();
 
     // ensure that replaceStoreFiles is not called, i.e, the times does not 
change, if files are not
     // refreshed,
-    verify(spiedStoreEngine, times(1)).replaceStoreFiles(any(), any());
+    verify(spiedStoreEngine, times(1)).replaceStoreFiles(any(), any(), any());
   }
 
   private long countMemStoreScanner(StoreScanner scanner) {

Reply via email to