From a5b89cc38b908beca1c549acef473503c9c514f4 Mon Sep 17 00:00:00 2001 From: Andrew Purtell Date: Wed, 22 May 2019 14:53:21 -0700 Subject: [PATCH] HBASE-22459 Expose store reader reference count --- .../apache/hadoop/hbase/ClusterStatus.java | 34 +++++++++++++++++++ .../org/apache/hadoop/hbase/RegionLoad.java | 8 +++++ .../apache/hadoop/hbase/RegionMetrics.java | 4 +++ .../hadoop/hbase/RegionMetricsBuilder.java | 18 ++++++++++ .../MetricsRegionServerSource.java | 2 ++ .../regionserver/MetricsRegionWrapper.java | 5 +++ .../regionserver/MetricsRegionSourceImpl.java | 4 +++ .../TestMetricsRegionSourceImpl.java | 5 +++ .../src/main/protobuf/ClusterStatus.proto | 6 ++++ .../src/main/protobuf/ClusterStatus.proto | 6 ++++ .../rest/StorageClusterStatusResource.java | 2 +- .../rest/model/StorageClusterStatusModel.java | 17 ++++++++-- .../StorageClusterStatusMessage.proto | 2 ++ .../model/TestStorageClusterStatusModel.java | 4 +-- .../hadoop/hbase/regionserver/HStore.java | 9 +++++ .../MetricsRegionWrapperImpl.java | 9 +++++ .../hadoop/hbase/regionserver/Store.java | 5 +++ .../MetricsRegionWrapperStub.java | 5 +++ 18 files changed, 139 insertions(+), 6 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java index 33c30ddbb8..90eb6f753f 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java @@ -325,6 +325,40 @@ public class ClusterStatus implements ClusterMetrics { return metrics.getLastMajorCompactionTimestamp(region); } + /** + * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0 + * Use {@link #getLastMajorCompactionTimestamp(TableName)} instead. + */ + @Deprecated + public int getStoreRefCountForTable(TableName table) { + int refCount = 0; + for (ServerName server : getServers()) { + ServerLoad load = getLoad(server); + for (RegionLoad rl : load.getRegionsLoad().values()) { + if (table.equals(HRegionInfo.getTable(rl.getName()))) { + refCount += rl.getStoreRefCount(); + } + } + } + return refCount; + } + + /** + * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0 + * Use {@link #getLastMajorCompactionTimestamp(TableName)} instead. + */ + @Deprecated + public int getStoreRefCountForRegion(final byte[] region) { + for (ServerName server : getServers()) { + ServerLoad load = getLoad(server); + RegionLoad rl = load.getRegionsLoad().get(region); + if (rl != null) { + return rl.getStoreRefCount(); + } + } + return 0; + } + /** * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0 * No flag in 2.0 diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionLoad.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionLoad.java index 242e5ea6fd..41c68ef3b4 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionLoad.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionLoad.java @@ -358,6 +358,13 @@ public class RegionLoad implements RegionMetrics { return metrics.getLastMajorCompactionTimestamp(); } + /** + * @return the reference count for the stores of this region + */ + public int getStoreRefCount() { + return metrics.getStoreRefCount(); + } + /** * @see java.lang.Object#toString() */ @@ -366,6 +373,7 @@ public class RegionLoad implements RegionMetrics { StringBuilder sb = Strings.appendKeyValue(new StringBuilder(), "numberOfStores", this.getStores()); Strings.appendKeyValue(sb, "numberOfStorefiles", this.getStorefiles()); + Strings.appendKeyValue(sb, "storeRefCount", this.getStoreRefCount()); Strings.appendKeyValue(sb, "storefileUncompressedSizeMB", this.getStoreUncompressedSizeMB()); Strings.appendKeyValue(sb, "lastMajorCompactionTimestamp", diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionMetrics.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionMetrics.java index e73683f483..9de98f36f5 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionMetrics.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionMetrics.java @@ -144,4 +144,8 @@ public interface RegionMetrics { */ long getLastMajorCompactionTimestamp(); + /** + * @return the reference count for the stores of this region + */ + int getStoreRefCount(); } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionMetricsBuilder.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionMetricsBuilder.java index f2a549aa3a..77c9f7a704 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionMetricsBuilder.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/RegionMetricsBuilder.java @@ -64,6 +64,7 @@ public final class RegionMetricsBuilder { Size.Unit.KILOBYTE)) .setStoreCount(regionLoadPB.getStores()) .setStoreFileCount(regionLoadPB.getStorefiles()) + .setStoreRefCount(regionLoadPB.getStoreRefCount()) .setStoreFileSize(new Size(regionLoadPB.getStorefileSizeMB(), Size.Unit.MEGABYTE)) .setStoreSequenceIds(regionLoadPB.getStoreCompleteSequenceIdList().stream() .collect(Collectors.toMap( @@ -109,6 +110,7 @@ public final class RegionMetricsBuilder { .get(Size.Unit.KILOBYTE)) .setStores(regionMetrics.getStoreCount()) .setStorefiles(regionMetrics.getStoreCount()) + .setStoreRefCount(regionMetrics.getStoreRefCount()) .setStorefileSizeMB((int) regionMetrics.getStoreFileSize().get(Size.Unit.MEGABYTE)) .addAllStoreCompleteSequenceId(toStoreSequenceId(regionMetrics.getStoreSequenceId())) .setStoreUncompressedSizeMB( @@ -123,6 +125,7 @@ public final class RegionMetricsBuilder { private final byte[] name; private int storeCount; private int storeFileCount; + private int storeRefCount; private long compactingCellCount; private long compactedCellCount; private Size storeFileSize = Size.ZERO; @@ -151,6 +154,10 @@ public final class RegionMetricsBuilder { this.storeFileCount = value; return this; } + public RegionMetricsBuilder setStoreRefCount(int value) { + this.storeRefCount = value; + return this; + } public RegionMetricsBuilder setCompactingCellCount(long value) { this.compactingCellCount = value; return this; @@ -220,6 +227,7 @@ public final class RegionMetricsBuilder { return new RegionMetricsImpl(name, storeCount, storeFileCount, + storeRefCount, compactingCellCount, compactedCellCount, storeFileSize, @@ -242,6 +250,7 @@ public final class RegionMetricsBuilder { private final byte[] name; private final int storeCount; private final int storeFileCount; + private final int storeRefCount; private final long compactingCellCount; private final long compactedCellCount; private final Size storeFileSize; @@ -261,6 +270,7 @@ public final class RegionMetricsBuilder { RegionMetricsImpl(byte[] name, int storeCount, int storeFileCount, + int storeRefCount, final long compactingCellCount, long compactedCellCount, Size storeFileSize, @@ -280,6 +290,7 @@ public final class RegionMetricsBuilder { this.name = Preconditions.checkNotNull(name); this.storeCount = storeCount; this.storeFileCount = storeFileCount; + this.storeRefCount = storeRefCount; this.compactingCellCount = compactingCellCount; this.compactedCellCount = compactedCellCount; this.storeFileSize = Preconditions.checkNotNull(storeFileSize); @@ -313,6 +324,11 @@ public final class RegionMetricsBuilder { return storeFileCount; } + @Override + public int getStoreRefCount() { + return storeRefCount; + } + @Override public Size getStoreFileSize() { return storeFileSize; @@ -399,6 +415,8 @@ public final class RegionMetricsBuilder { this.getStoreCount()); Strings.appendKeyValue(sb, "storeFileCount", this.getStoreFileCount()); + Strings.appendKeyValue(sb, "storeRefCount", + this.getStoreRefCount()); Strings.appendKeyValue(sb, "uncompressedStoreFileSize", this.getUncompressedStoreFileSize()); Strings.appendKeyValue(sb, "lastMajorCompactionTimestamp", diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java index fc9cde77b2..218c955677 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java @@ -231,6 +231,8 @@ public interface MetricsRegionServerSource extends BaseSource, JvmPauseMonitorSo String WALFILE_SIZE_DESC = "Size of all WAL Files"; String STOREFILE_COUNT = "storeFileCount"; String STOREFILE_COUNT_DESC = "Number of Store Files"; + String STORE_REF_COUNT = "storeRefCount"; + String STORE_REF_COUNT_DESC = "Store reference count"; String MEMSTORE_SIZE = "memStoreSize"; String MEMSTORE_SIZE_DESC = "Size of the memstore"; String STOREFILE_SIZE = "storeFileSize"; diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java index 5e98c61b89..4a438391ea 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java @@ -152,4 +152,9 @@ public interface MetricsRegionWrapper { * Get the replica id of this region. */ int getReplicaId(); + + /** + * @return the number of references active on the store + */ + long getStoreRefCount(); } diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java index ff1f42d4e4..8a3ec170e1 100644 --- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java +++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java @@ -213,6 +213,10 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { regionNamePrefix + MetricsRegionServerSource.STOREFILE_COUNT, MetricsRegionServerSource.STOREFILE_COUNT_DESC), this.regionWrapper.getNumStoreFiles()); + mrb.addGauge(Interns.info( + regionNamePrefix + MetricsRegionServerSource.STORE_REF_COUNT, + MetricsRegionServerSource.STORE_REF_COUNT), + this.regionWrapper.getStoreRefCount()); mrb.addGauge(Interns.info( regionNamePrefix + MetricsRegionServerSource.MEMSTORE_SIZE, MetricsRegionServerSource.MEMSTORE_SIZE_DESC), diff --git a/hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java b/hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java index 82bfc0b0fb..4ec3b690bc 100644 --- a/hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java +++ b/hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java @@ -94,6 +94,11 @@ public class TestMetricsRegionSourceImpl { return 0; } + @Override + public long getStoreRefCount() { + return 0; + } + @Override public long getMemStoreSize() { return 0; diff --git a/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto b/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto index 563db9f445..d1487af61c 100644 --- a/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto +++ b/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto @@ -143,6 +143,12 @@ message RegionLoad { /** the current total filtered read requests made to region */ optional uint64 filtered_read_requests_count = 19; + + /** master defines cp_requests_count = 20, the current total coprocessor + requests made to region */ + + /** the number of references active on the store */ + optional int32 store_ref_count = 21 [default = 0]; } /* Server-level protobufs */ diff --git a/hbase-protocol/src/main/protobuf/ClusterStatus.proto b/hbase-protocol/src/main/protobuf/ClusterStatus.proto index b172db55c3..30fd409ae1 100644 --- a/hbase-protocol/src/main/protobuf/ClusterStatus.proto +++ b/hbase-protocol/src/main/protobuf/ClusterStatus.proto @@ -139,6 +139,12 @@ message RegionLoad { /** the current total filtered read requests made to region */ optional uint64 filtered_read_requests_count = 19; + + /** master defines cp_requests_count = 20, the current total coprocessor + requests made to region */ + + /** the number of references active on the store */ + optional int32 store_ref_count = 21 [default = 0]; } /* Server-level protobufs */ diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java index 2323bf3374..8c4d6c1a41 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java @@ -87,7 +87,7 @@ public class StorageClusterStatusResource extends ResourceBase { node.setRequests(load.getRequestCount()); for (RegionMetrics region: load.getRegionMetrics().values()) { node.addRegion(region.getRegionName(), region.getStoreCount(), - region.getStoreFileCount(), + region.getStoreFileCount(), region.getStoreRefCount(), (int) region.getStoreFileSize().get(Size.Unit.MEGABYTE), (int) region.getMemStoreSize().get(Size.Unit.MEGABYTE), (long) region.getStoreFileIndexSize().get(Size.Unit.KILOBYTE), diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java index a20a40565e..feea8e8699 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java @@ -115,6 +115,7 @@ public class StorageClusterStatusModel private byte[] name; private int stores; private int storefiles; + private int storeRefCount; private int storefileSizeMB; private int memstoreSizeMB; private long storefileIndexSizeKB; @@ -149,7 +150,7 @@ public class StorageClusterStatusModel * @param memstoreSizeMB total size of memstore, in MB * @param storefileIndexSizeKB total size of store file indexes, in KB */ - public Region(byte[] name, int stores, int storefiles, + public Region(byte[] name, int stores, int storefiles, int storeRefCount, int storefileSizeMB, int memstoreSizeMB, long storefileIndexSizeKB, long readRequestsCount, long writeRequestsCount, int rootIndexSizeKB, int totalStaticIndexSizeKB, int totalStaticBloomSizeKB, @@ -157,6 +158,7 @@ public class StorageClusterStatusModel this.name = name; this.stores = stores; this.storefiles = storefiles; + this.storeRefCount = storeRefCount; this.storefileSizeMB = storefileSizeMB; this.memstoreSizeMB = memstoreSizeMB; this.storefileIndexSizeKB = storefileIndexSizeKB; @@ -193,6 +195,14 @@ public class StorageClusterStatusModel return storefiles; } + /** + * @return the number of references active on the store + */ + @XmlAttribute + public int getStoreRefCount() { + return storeRefCount; + } + /** * @return the total size of store files, in MB */ @@ -381,12 +391,12 @@ public class StorageClusterStatusModel * Add a region name to the list * @param name the region name */ - public void addRegion(byte[] name, int stores, int storefiles, + public void addRegion(byte[] name, int stores, int storefiles, int storeRefCount, int storefileSizeMB, int memstoreSizeMB, long storefileIndexSizeKB, long readRequestsCount, long writeRequestsCount, int rootIndexSizeKB, int totalStaticIndexSizeKB, int totalStaticBloomSizeKB, long totalCompactingKVs, long currentCompactedKVs) { - regions.add(new Region(name, stores, storefiles, storefileSizeMB, + regions.add(new Region(name, stores, storefiles, storeRefCount, storefileSizeMB, memstoreSizeMB, storefileIndexSizeKB, readRequestsCount, writeRequestsCount, rootIndexSizeKB, totalStaticIndexSizeKB, totalStaticBloomSizeKB, totalCompactingKVs, currentCompactedKVs)); @@ -779,6 +789,7 @@ public class StorageClusterStatusModel region.getName().toByteArray(), region.getStores(), region.getStorefiles(), + region.getStoreRefCount(), region.getStorefileSizeMB(), region.getMemStoreSizeMB(), region.getStorefileIndexSizeKB(), diff --git a/hbase-rest/src/main/protobuf/StorageClusterStatusMessage.proto b/hbase-rest/src/main/protobuf/StorageClusterStatusMessage.proto index f03a6bc399..ba9939890b 100644 --- a/hbase-rest/src/main/protobuf/StorageClusterStatusMessage.proto +++ b/hbase-rest/src/main/protobuf/StorageClusterStatusMessage.proto @@ -32,6 +32,8 @@ message StorageClusterStatus { optional int32 totalStaticBloomSizeKB = 11; optional int64 totalCompactingKVs = 12; optional int64 currentCompactedKVs = 13; + /** master defines optional int64 cpRequestsCount = 14 */ + optional int32 storeRefCount = 15; } message Node { required string name = 1; // name:port diff --git a/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/model/TestStorageClusterStatusModel.java b/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/model/TestStorageClusterStatusModel.java index 77ca7614b1..98bc2858ba 100644 --- a/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/model/TestStorageClusterStatusModel.java +++ b/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/model/TestStorageClusterStatusModel.java @@ -87,9 +87,9 @@ public class TestStorageClusterStatusModel extends TestModelBase EnvironmentEdgeManager.currentTime() - t); } + @Override + public int getStoreRefCount() { + return this.storeEngine.getStoreFileManager().getStorefiles().stream() + .filter(sf -> { return sf.getReader() != null; }) + .filter(HStoreFile::isHFile) + .mapToInt(sf -> sf.getRefCount()) + .sum(); + } + @Override public OptionalLong getMaxStoreFileAge() { return getStoreFileAgeStream().max(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java index c073ef0284..697385f3d1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java @@ -48,6 +48,7 @@ public class MetricsRegionWrapperImpl implements MetricsRegionWrapper, Closeable private ScheduledExecutorService executor; private Runnable runnable; private long numStoreFiles; + private long storeRefCount; private long memstoreSize; private long storeFileSize; private long maxStoreFileAge; @@ -119,6 +120,11 @@ public class MetricsRegionWrapperImpl implements MetricsRegionWrapper, Closeable return storeFileSize; } + @Override + public long getStoreRefCount() { + return storeRefCount; + } + @Override public long getReadRequestCount() { return this.region.getReadRequestsCount(); @@ -221,6 +227,7 @@ public class MetricsRegionWrapperImpl implements MetricsRegionWrapper, Closeable @Override public void run() { long tempNumStoreFiles = 0; + int tempStoreRefCount = 0; long tempMemstoreSize = 0; long tempStoreFileSize = 0; long tempMaxStoreFileAge = 0; @@ -234,6 +241,7 @@ public class MetricsRegionWrapperImpl implements MetricsRegionWrapper, Closeable if (region.stores != null) { for (Store store : region.stores.values()) { tempNumStoreFiles += store.getStorefilesCount(); + tempStoreRefCount += store.getStoreRefCount(); tempMemstoreSize += store.getMemStoreSize().getDataSize(); tempStoreFileSize += store.getStorefilesSize(); OptionalLong storeMaxStoreFileAge = store.getMaxStoreFileAge(); @@ -260,6 +268,7 @@ public class MetricsRegionWrapperImpl implements MetricsRegionWrapper, Closeable } numStoreFiles = tempNumStoreFiles; + storeRefCount = tempStoreRefCount; memstoreSize = tempMemstoreSize; storeFileSize = tempStoreFileSize; maxStoreFileAge = tempMaxStoreFileAge; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java index 6eb9f18b70..6b8daea83c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Store.java @@ -126,6 +126,11 @@ public interface Store { */ int getStorefilesCount(); + /** + * @return Reference count over store + */ + int getStoreRefCount(); + /** * @return Count of compacted store files */ diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java index 1b1d0bf6ee..ad04cde19f 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java @@ -60,6 +60,11 @@ public class MetricsRegionWrapperStub implements MetricsRegionWrapper { return 102; } + @Override + public long getStoreRefCount() { + return 0; + } + @Override public long getMemStoreSize() { return 103; -- 2.21.0