001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.master;
019
020import static org.junit.jupiter.api.Assertions.assertEquals;
021import static org.mockito.Mockito.mock;
022import static org.mockito.Mockito.when;
023
024import java.util.List;
025import java.util.Map;
026import org.apache.hadoop.hbase.CompatibilityFactory;
027import org.apache.hadoop.hbase.master.locking.LockProcedure;
028import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
029import org.apache.hadoop.hbase.master.procedure.ServerCrashProcedure;
030import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
031import org.apache.hadoop.hbase.test.MetricsAssertHelper;
032import org.apache.hadoop.hbase.testclassification.MasterTests;
033import org.apache.hadoop.hbase.testclassification.SmallTests;
034import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
035import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;
036import org.junit.jupiter.api.AfterEach;
037import org.junit.jupiter.api.Tag;
038import org.junit.jupiter.api.Test;
039
040@Tag(MasterTests.TAG)
041@Tag(SmallTests.TAG)
042public class TestOldestProcedureMetrics {
043
044  private static final MetricsAssertHelper METRICS_HELPER =
045    CompatibilityFactory.getInstance(MetricsAssertHelper.class);
046
047  @AfterEach
048  public void resetEnvironmentEdge() {
049    EnvironmentEdgeManager.reset();
050  }
051
052  @Test
053  @SuppressWarnings("unchecked")
054  public void testOldestProcedureAge() {
055    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();
056    edge.setValue(10_000L);
057    EnvironmentEdgeManager.injectEdge(edge);
058
059    HMaster master = mock(HMaster.class);
060    ProcedureExecutor<MasterProcedureEnv> procedureExecutor = mock(ProcedureExecutor.class);
061    LockProcedure oldestLock = mock(LockProcedure.class);
062    LockProcedure newerLock = mock(LockProcedure.class);
063    ServerCrashProcedure serverCrash = mock(ServerCrashProcedure.class);
064    ServerCrashProcedure finished = mock(ServerCrashProcedure.class);
065
066    when(master.getMasterProcedureExecutor()).thenReturn(procedureExecutor);
067    when(procedureExecutor.getProcedures())
068      .thenReturn(List.of(oldestLock, newerLock, serverCrash, finished));
069    when(oldestLock.getSubmittedTime()).thenReturn(1_000L);
070    when(newerLock.getSubmittedTime()).thenReturn(4_000L);
071    when(serverCrash.getSubmittedTime()).thenReturn(2_000L);
072    when(finished.isFinished()).thenReturn(true);
073    when(finished.getSubmittedTime()).thenReturn(100L);
074
075    MetricsMasterWrapperImpl wrapper = new MetricsMasterWrapperImpl(master);
076    assertEquals(Map.of("LockProcedure", 9_000L, "ServerCrashProcedure", 8_000L),
077      wrapper.getOldestProcedureAgeByType());
078
079    MetricsMasterProcSource source = new MetricsMasterProcSourceImpl(wrapper);
080    METRICS_HELPER.assertGauge(MetricsMasterProcSource.OLDEST_PROCEDURE_AGE_NAME, 9_000L, source);
081    METRICS_HELPER.assertGauge(MetricsMasterProcSource.OLDEST_PROCEDURE_AGE_NAME + "_LockProcedure",
082      9_000L, source);
083    METRICS_HELPER.assertGauge(
084      MetricsMasterProcSource.OLDEST_PROCEDURE_AGE_NAME + "_ServerCrashProcedure", 8_000L, source);
085
086    when(procedureExecutor.getProcedures()).thenReturn(List.of());
087    assertEquals(Map.of(), wrapper.getOldestProcedureAgeByType());
088
089    when(procedureExecutor.getProcedures()).thenReturn(List.of(newerLock));
090    when(newerLock.getSubmittedTime()).thenReturn(11_000L);
091    assertEquals(Map.of("LockProcedure", 0L), wrapper.getOldestProcedureAgeByType());
092
093    when(master.getMasterProcedureExecutor()).thenReturn(null);
094    assertEquals(Map.of(), wrapper.getOldestProcedureAgeByType());
095  }
096}