This is an automated email from the ASF dual-hosted git repository. skadam pushed a commit to branch 4.x-HBase-1.3 in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/4.x-HBase-1.3 by this push: new 9da113f PHOENIX-5358: Metrics for the GlobalIndexChecker coprocessor 9da113f is described below commit 9da113f7335c953537c1498cbedaef7758fb3ce6 Author: Priyank Porwal <ppor...@salesforce.com> AuthorDate: Wed Jul 17 23:36:17 2019 -0700 PHOENIX-5358: Metrics for the GlobalIndexChecker coprocessor Signed-off-by: s.kadam <ska...@apache.org> --- .../index/metrics/GlobalIndexCheckerSource.java | 67 ++++++++++++++++++ .../metrics/GlobalIndexCheckerSourceImpl.java | 82 ++++++++++++++++++++++ .../index/metrics/MetricsIndexerSourceFactory.java | 8 +++ .../apache/phoenix/index/GlobalIndexChecker.java | 31 ++++++-- 4 files changed, 184 insertions(+), 4 deletions(-) diff --git a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/metrics/GlobalIndexCheckerSource.java b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/metrics/GlobalIndexCheckerSource.java new file mode 100644 index 0000000..84b03d1 --- /dev/null +++ b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/metrics/GlobalIndexCheckerSource.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.phoenix.hbase.index.metrics; + +import org.apache.hadoop.hbase.metrics.BaseSource; + +/** + * Interface for metrics from GlobalIndexChecker + */ +public interface GlobalIndexCheckerSource extends BaseSource { + // Metrics2 and JMX constants + String METRICS_NAME = "GlobalIndexChecker"; + String METRICS_CONTEXT = "phoenix"; + String METRICS_DESCRIPTION = "Metrics about the Phoenix Global Index Checker"; + String METRICS_JMX_CONTEXT = "RegionServer,sub=" + METRICS_NAME; + + String INDEX_REPAIR = "indexRepairs"; + String INDEX_REPAIR_DESC = "The number of index row repairs"; + + String INDEX_REPAIR_FAILURE = "indexRepairFailures"; + String INDEX_REPAIR_FAILURE_DESC = "The number of index row repair failures"; + + String INDEX_REPAIR_TIME = "indexRepairTime"; + String INDEX_REPAIR_TIME_DESC = "Histogram for the time in milliseconds for index row repairs"; + + String INDEX_REPAIR_FAILURE_TIME = "indexRepairFailureTime"; + String INDEX_REPAIR_FAILURE_TIME_DESC = "Histogram for the time in milliseconds for index row repair failures"; + + /** + * Increments the number of index repairs + */ + void incrementIndexRepairs(); + + /** + * Increments the number of index repair failures + */ + void incrementIndexRepairFailures(); + + /** + * Updates the index repair time histogram + * + * @param t time taken in milliseconds + */ + void updateIndexRepairTime(long t); + + /** + * Updates the index repair failure time histogram + * + * @param t time taken in milliseconds + */ + void updateIndexRepairFailureTime(long t); +} \ No newline at end of file diff --git a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/metrics/GlobalIndexCheckerSourceImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/metrics/GlobalIndexCheckerSourceImpl.java new file mode 100644 index 0000000..f59851a --- /dev/null +++ b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/metrics/GlobalIndexCheckerSourceImpl.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.phoenix.hbase.index.metrics; + +import org.apache.hadoop.hbase.metrics.BaseSourceImpl; +import org.apache.hadoop.metrics2.MetricHistogram; +import org.apache.hadoop.metrics2.lib.MutableFastCounter; + +/** + * Implementation for tracking Phoenix Index Checker metrics. + */ +public class GlobalIndexCheckerSourceImpl extends BaseSourceImpl implements GlobalIndexCheckerSource { + + private final MutableFastCounter indexRepairs; + private final MutableFastCounter indexRepairFailures; + + private final MetricHistogram indexRepairTimeHisto; + private final MetricHistogram indexRepairFailureTimeHisto; + + public GlobalIndexCheckerSourceImpl() { + this(METRICS_NAME, METRICS_DESCRIPTION, METRICS_CONTEXT, METRICS_JMX_CONTEXT); + } + + public GlobalIndexCheckerSourceImpl(String metricsName, + String metricsDescription, + String metricsContext, + String metricsJmxContext) { + super(metricsName, metricsDescription, metricsContext, metricsJmxContext); + + indexRepairs = getMetricsRegistry().newCounter(INDEX_REPAIR, INDEX_REPAIR_DESC, 0L); + indexRepairFailures = getMetricsRegistry().newCounter(INDEX_REPAIR_FAILURE, INDEX_REPAIR_FAILURE_DESC, 0L); + + indexRepairTimeHisto = getMetricsRegistry().newHistogram(INDEX_REPAIR_TIME, INDEX_REPAIR_TIME_DESC); + indexRepairFailureTimeHisto = getMetricsRegistry().newHistogram(INDEX_REPAIR_FAILURE_TIME, INDEX_REPAIR_FAILURE_TIME_DESC); + } + + /** + * Increments the number of index repairs + */ + public void incrementIndexRepairs() { + indexRepairs.incr(); + } + + /** + * Increments the number of index repair failures + */ + public void incrementIndexRepairFailures() { + indexRepairFailures.incr(); + } + + /** + * Updates the index repair time histogram + * + * @param t time taken in milliseconds + */ + public void updateIndexRepairTime(long t) { + indexRepairTimeHisto.add(t); + } + + /** + * Updates the index repair failure time histogram + * + * @param t time taken in milliseconds + */ + public void updateIndexRepairFailureTime(long t) { + indexRepairFailureTimeHisto.add(t); + } +} \ No newline at end of file diff --git a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/metrics/MetricsIndexerSourceFactory.java b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/metrics/MetricsIndexerSourceFactory.java index e373e2f..b105290 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/metrics/MetricsIndexerSourceFactory.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/metrics/MetricsIndexerSourceFactory.java @@ -22,6 +22,7 @@ package org.apache.phoenix.hbase.index.metrics; public class MetricsIndexerSourceFactory { private static final MetricsIndexerSourceFactory INSTANCE = new MetricsIndexerSourceFactory(); private MetricsIndexerSource indexerSource; + private GlobalIndexCheckerSource globalIndexCheckerSource; private MetricsIndexerSourceFactory() {} @@ -35,4 +36,11 @@ public class MetricsIndexerSourceFactory { } return INSTANCE.indexerSource; } + + public synchronized GlobalIndexCheckerSource getGlobalIndexCheckerSource() { + if (INSTANCE.globalIndexCheckerSource == null) { + INSTANCE.globalIndexCheckerSource = new GlobalIndexCheckerSourceImpl(); + } + return INSTANCE.globalIndexCheckerSource; + } } \ No newline at end of file diff --git a/phoenix-core/src/main/java/org/apache/phoenix/index/GlobalIndexChecker.java b/phoenix-core/src/main/java/org/apache/phoenix/index/GlobalIndexChecker.java index e226f05..fb67fdb 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/index/GlobalIndexChecker.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/index/GlobalIndexChecker.java @@ -52,6 +52,8 @@ import org.apache.hadoop.hbase.regionserver.RegionScanner; import org.apache.hadoop.hbase.regionserver.ScannerContext; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.coprocessor.BaseScannerRegionObserver; +import org.apache.phoenix.hbase.index.metrics.GlobalIndexCheckerSource; +import org.apache.phoenix.hbase.index.metrics.MetricsIndexerSourceFactory; import org.apache.phoenix.hbase.index.table.HTableFactory; import org.apache.phoenix.hbase.index.util.ImmutableBytesPtr; import org.apache.phoenix.query.QueryServices; @@ -68,6 +70,8 @@ import org.apache.phoenix.util.ServerUtil; public class GlobalIndexChecker extends BaseRegionObserver { private static final Log LOG = LogFactory.getLog(GlobalIndexChecker.class); private HTableFactory hTableFactory; + private GlobalIndexCheckerSource metricsSource; + /** * Class that verifies a given row of a non-transactional global index. * An instance of this class is created for each scanner on an index @@ -89,12 +93,18 @@ public class GlobalIndexChecker extends BaseRegionObserver { private Region region; private long minTimestamp; private long maxTimestamp; + private GlobalIndexCheckerSource metricsSource; - public GlobalIndexScanner(RegionCoprocessorEnvironment env, Scan scan, RegionScanner scanner) throws IOException { + public GlobalIndexScanner(RegionCoprocessorEnvironment env, + Scan scan, + RegionScanner scanner, + GlobalIndexCheckerSource metricsSource) throws IOException { this.env = env; this.scan = scan; - region = env.getRegion(); this.scanner = scanner; + this.metricsSource = metricsSource; + + region = env.getRegion(); emptyCF = scan.getAttribute(EMPTY_COLUMN_FAMILY_NAME); emptyCQ = scan.getAttribute(EMPTY_COLUMN_QUALIFIER_NAME); ageThreshold = env.getConfiguration().getLong( @@ -352,11 +362,23 @@ public class GlobalIndexChecker extends BaseRegionObserver { if (verifyRowAndRemoveEmptyColumn(cellList)) { return true; } else { + long repairStart = EnvironmentEdgeManager.currentTimeMillis(); + byte[] rowKey = new byte[cell.getRowLength()]; System.arraycopy(cell.getRowArray(), cell.getRowOffset(), rowKey, 0, cell.getRowLength()); long ts = getMaxTimestamp(cellList); cellList.clear(); - repairIndexRows(rowKey, ts, cellList); + + try { + repairIndexRows(rowKey, ts, cellList); + metricsSource.incrementIndexRepairs(); + metricsSource.updateIndexRepairTime(EnvironmentEdgeManager.currentTimeMillis() - repairStart); + } catch (IOException e) { + metricsSource.incrementIndexRepairFailures(); + metricsSource.updateIndexRepairFailureTime(EnvironmentEdgeManager.currentTimeMillis() - repairStart); + throw e; + } + if (cellList.isEmpty()) { // This means that the index row is invalid. Return false to tell the caller that this row should be skipped return false; @@ -372,12 +394,13 @@ public class GlobalIndexChecker extends BaseRegionObserver { if (scan.getAttribute(CHECK_VERIFY_COLUMN) == null) { return s; } - return new GlobalIndexScanner(c.getEnvironment(), scan, s); + return new GlobalIndexScanner(c.getEnvironment(), scan, s, metricsSource); } @Override public void start(CoprocessorEnvironment e) throws IOException { this.hTableFactory = ServerUtil.getDelegateHTableFactory(e, ServerUtil.ConnectionType.DEFAULT_SERVER_CONNECTION); + this.metricsSource = MetricsIndexerSourceFactory.getInstance().getGlobalIndexCheckerSource(); } @Override