HBASE-13018 WALSplitter should not try to get table states while splitting META (Andrey Stepachev)
This commit is contained in:
parent
dc522d010c
commit
3dd220f8fd
|
@ -65,6 +65,7 @@ import org.apache.hadoop.hbase.HBaseConfiguration;
|
||||||
import org.apache.hadoop.hbase.HConstants;
|
import org.apache.hadoop.hbase.HConstants;
|
||||||
import org.apache.hadoop.hbase.HRegionInfo;
|
import org.apache.hadoop.hbase.HRegionInfo;
|
||||||
import org.apache.hadoop.hbase.HRegionLocation;
|
import org.apache.hadoop.hbase.HRegionLocation;
|
||||||
|
import org.apache.hadoop.hbase.MetaTableAccessor;
|
||||||
import org.apache.hadoop.hbase.ServerName;
|
import org.apache.hadoop.hbase.ServerName;
|
||||||
import org.apache.hadoop.hbase.TableName;
|
import org.apache.hadoop.hbase.TableName;
|
||||||
import org.apache.hadoop.hbase.TableNotFoundException;
|
import org.apache.hadoop.hbase.TableNotFoundException;
|
||||||
|
@ -146,8 +147,8 @@ public class WALSplitter {
|
||||||
OutputSink outputSink;
|
OutputSink outputSink;
|
||||||
EntryBuffers entryBuffers;
|
EntryBuffers entryBuffers;
|
||||||
|
|
||||||
private Set<TableName> disablingOrDisabledTables =
|
private Map<TableName, TableState> tableStatesCache =
|
||||||
new HashSet<TableName>();
|
new ConcurrentHashMap<>();
|
||||||
private BaseCoordinatedStateManager csm;
|
private BaseCoordinatedStateManager csm;
|
||||||
private final WALFactory walFactory;
|
private final WALFactory walFactory;
|
||||||
|
|
||||||
|
@ -303,16 +304,6 @@ public class WALSplitter {
|
||||||
LOG.warn("Nothing to split in log file " + logPath);
|
LOG.warn("Nothing to split in log file " + logPath);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(csm != null) {
|
|
||||||
HConnection scc = csm.getServer().getConnection();
|
|
||||||
TableName[] tables = scc.listTableNames();
|
|
||||||
for (TableName table : tables) {
|
|
||||||
if (scc.getTableState(table)
|
|
||||||
.inStates(TableState.State.DISABLED, TableState.State.DISABLING)) {
|
|
||||||
disablingOrDisabledTables.add(table);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int numOpenedFilesBeforeReporting = conf.getInt("hbase.splitlog.report.openedfiles", 3);
|
int numOpenedFilesBeforeReporting = conf.getInt("hbase.splitlog.report.openedfiles", 3);
|
||||||
int numOpenedFilesLastCheck = 0;
|
int numOpenedFilesLastCheck = 0;
|
||||||
outputSink.setReporter(reporter);
|
outputSink.setReporter(reporter);
|
||||||
|
@ -1625,7 +1616,7 @@ public class WALSplitter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if current region in a disabling or disabled table
|
// check if current region in a disabling or disabled table
|
||||||
if (disablingOrDisabledTables.contains(buffer.tableName)) {
|
if (isTableDisabledOrDisabling(buffer.tableName)) {
|
||||||
// need fall back to old way
|
// need fall back to old way
|
||||||
logRecoveredEditsOutputSink.append(buffer);
|
logRecoveredEditsOutputSink.append(buffer);
|
||||||
hasEditsInDisablingOrDisabledTables = true;
|
hasEditsInDisablingOrDisabledTables = true;
|
||||||
|
@ -2057,6 +2048,26 @@ public class WALSplitter {
|
||||||
return this.recoveredRegions.size();
|
return this.recoveredRegions.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isTableDisabledOrDisabling(TableName tableName) {
|
||||||
|
if (csm == null)
|
||||||
|
return false; // we can't get state without CoordinatedStateManager
|
||||||
|
if (tableName.isSystemTable())
|
||||||
|
return false; // assume that system tables never can be disabled
|
||||||
|
TableState tableState = tableStatesCache.get(tableName);
|
||||||
|
if (tableState == null) {
|
||||||
|
try {
|
||||||
|
tableState =
|
||||||
|
MetaTableAccessor.getTableState(csm.getServer().getConnection(), tableName);
|
||||||
|
if (tableState != null)
|
||||||
|
tableStatesCache.put(tableName, tableState);
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOG.warn("State is not accessible for table " + tableName, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tableState != null && tableState
|
||||||
|
.inStates(TableState.State.DISABLED, TableState.State.DISABLING);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a writer and path for a log starting at the given entry. This function is threadsafe so
|
* Get a writer and path for a log starting at the given entry. This function is threadsafe so
|
||||||
* long as multiple threads are always acting on different regions.
|
* long as multiple threads are always acting on different regions.
|
||||||
|
|
|
@ -807,6 +807,7 @@ public class TestDistributedLogSplitting {
|
||||||
|
|
||||||
LOG.info("Disabling table\n");
|
LOG.info("Disabling table\n");
|
||||||
TEST_UTIL.getHBaseAdmin().disableTable(TableName.valueOf("disableTable"));
|
TEST_UTIL.getHBaseAdmin().disableTable(TableName.valueOf("disableTable"));
|
||||||
|
TEST_UTIL.waitTableDisabled(TableName.valueOf("disableTable").getName());
|
||||||
|
|
||||||
// abort RS
|
// abort RS
|
||||||
LOG.info("Aborting region server: " + hrs.getServerName());
|
LOG.info("Aborting region server: " + hrs.getServerName());
|
||||||
|
|
Loading…
Reference in New Issue