HBASE-23805 [Flakey Test] TestRaceBetweenSCPAndDTP

This commit is contained in:
stack 2020-02-05 22:01:19 -08:00
parent 93c5e7691f
commit 8654597be0
1 changed files with 22 additions and 10 deletions

View File

@ -1,4 +1,4 @@
/** /*
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file * or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information * distributed with this work for additional information
@ -18,6 +18,7 @@
package org.apache.hadoop.hbase.master.assignment; package org.apache.hadoop.hbase.master.assignment;
import java.io.IOException; import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseClassTestRule;
@ -30,10 +31,12 @@ import org.apache.hadoop.hbase.master.HMaster;
import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.MasterServices;
import org.apache.hadoop.hbase.master.procedure.DisableTableProcedure; import org.apache.hadoop.hbase.master.procedure.DisableTableProcedure;
import org.apache.hadoop.hbase.master.procedure.ServerCrashProcedure; import org.apache.hadoop.hbase.master.procedure.ServerCrashProcedure;
import org.apache.hadoop.hbase.procedure2.Procedure;
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor; import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.testclassification.MasterTests;
import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Threads;
import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.KeeperException;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.BeforeClass; import org.junit.BeforeClass;
@ -46,7 +49,6 @@ import org.junit.experimental.categories.Category;
*/ */
@Category({ MasterTests.class, MediumTests.class }) @Category({ MasterTests.class, MediumTests.class })
public class TestRaceBetweenSCPAndDTP { public class TestRaceBetweenSCPAndDTP {
@ClassRule @ClassRule
public static final HBaseClassTestRule CLASS_RULE = public static final HBaseClassTestRule CLASS_RULE =
HBaseClassTestRule.forClass(TestRaceBetweenSCPAndDTP.class); HBaseClassTestRule.forClass(TestRaceBetweenSCPAndDTP.class);
@ -120,15 +122,16 @@ public class TestRaceBetweenSCPAndDTP {
UTIL.getAdmin().disableTableAsync(NAME); UTIL.getAdmin().disableTableAsync(NAME);
ARRIVE_GET_REGIONS_ON_TABLE.await(); ARRIVE_GET_REGIONS_ON_TABLE.await();
UTIL.getMiniHBaseCluster().stopRegionServer(sn);
// Wait ServerCrashProcedure to init.
Thread.sleep(1000);
ProcedureExecutor<?> procExec = ProcedureExecutor<?> procExec =
UTIL.getMiniHBaseCluster().getMaster().getMasterProcedureExecutor(); UTIL.getMiniHBaseCluster().getMaster().getMasterProcedureExecutor();
long scpProcId = UTIL.getMiniHBaseCluster().stopRegionServer(sn);
procExec.getProcedures().stream().filter(p -> p instanceof ServerCrashProcedure) long pid = Procedure.NO_PROC_ID;
.map(p -> (ServerCrashProcedure) p).findAny().get().getProcId(); do {
UTIL.waitFor(60000, () -> procExec.isFinished(scpProcId)); Threads.sleep(1);
pid = getSCPPID(procExec);
} while (pid != Procedure.NO_PROC_ID);
final long scppid = pid;
UTIL.waitFor(60000, () -> procExec.isFinished(scppid));
RESUME_GET_REGIONS_ON_SERVER.countDown(); RESUME_GET_REGIONS_ON_SERVER.countDown();
long dtpProcId = long dtpProcId =
@ -136,4 +139,13 @@ public class TestRaceBetweenSCPAndDTP {
.map(p -> (DisableTableProcedure) p).findAny().get().getProcId(); .map(p -> (DisableTableProcedure) p).findAny().get().getProcId();
UTIL.waitFor(60000, () -> procExec.isFinished(dtpProcId)); UTIL.waitFor(60000, () -> procExec.isFinished(dtpProcId));
} }
/**
* @return Returns {@link Procedure#NO_PROC_ID} if no SCP found else actual pid.
*/
private long getSCPPID(ProcedureExecutor<?> e) {
Optional<ServerCrashProcedure> optional = e.getProcedures().stream().
filter(p -> p instanceof ServerCrashProcedure).map(p -> (ServerCrashProcedure) p).findAny();
return optional.isPresent()? optional.get().getProcId(): Procedure.NO_PROC_ID;
}
} }