From 9e630bbd99e0e169c2d10f8f4de10a4ae651720b Mon Sep 17 00:00:00 2001 From: Bukros Szabolcs Date: Wed, 18 Dec 2019 14:12:25 +0100 Subject: [PATCH] HBASE-23589: FlushDescriptor contains non-matching family/output combinations Make sure commited files belong to the correct column family when creating a FlushDescriptor. --- .../apache/hadoop/hbase/regionserver/HRegion.java | 13 ++++++------- 1 file changed, 6 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 cc3d31819ddc..5d36ec49ac86 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 @@ -2824,22 +2824,21 @@ protected FlushResultImpl internalFlushCacheAndCommit(WAL wal, MonitoredTask sta // Switch snapshot (in memstore) -> new hfile (thus causing // all the store scanners to reset/reseek). - Iterator it = storesToFlush.iterator(); - // stores.values() and storeFlushCtxs have same order - for (StoreFlushContext flush : storeFlushCtxs.values()) { - boolean needsCompaction = flush.commit(status); + for (Map.Entry flushEntry : storeFlushCtxs.entrySet()) { + StoreFlushContext sfc = flushEntry.getValue(); + boolean needsCompaction = sfc.commit(status); if (needsCompaction) { compactionRequested = true; } - byte[] storeName = it.next().getColumnFamilyDescriptor().getName(); - List storeCommittedFiles = flush.getCommittedFiles(); + byte[] storeName = flushEntry.getKey(); + List storeCommittedFiles = sfc.getCommittedFiles(); committedFiles.put(storeName, storeCommittedFiles); // Flush committed no files, indicating flush is empty or flush was canceled if (storeCommittedFiles == null || storeCommittedFiles.isEmpty()) { MemStoreSize storeFlushableSize = prepareResult.storeFlushableSize.get(storeName); prepareResult.totalFlushableSize.decMemStoreSize(storeFlushableSize); } - flushedOutputFileSize += flush.getOutputFileSize(); + flushedOutputFileSize += sfc.getOutputFileSize(); } storeFlushCtxs.clear();