HADOOP-2688 IllegalArgumentException processing a shutdown stops server
going down and results in millions of lines of output git-svn-id: https://svn.apache.org/repos/asf/hadoop/core/trunk/src/contrib/hbase@614796 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
04bf0f5336
commit
0d8c1bfdfc
|
@ -146,6 +146,8 @@ Trunk (unreleased changes)
|
||||||
HADOOP-2668 Documentation and improved logging so fact that hbase now
|
HADOOP-2668 Documentation and improved logging so fact that hbase now
|
||||||
requires migration comes as less of a surprise
|
requires migration comes as less of a surprise
|
||||||
HADOOP-2686 Removed tables stick around in .META.
|
HADOOP-2686 Removed tables stick around in .META.
|
||||||
|
HADOOP-2688 IllegalArgumentException processing a shutdown stops
|
||||||
|
server going down and results in millions of lines of output
|
||||||
|
|
||||||
IMPROVEMENTS
|
IMPROVEMENTS
|
||||||
HADOOP-2401 Add convenience put method that takes writable
|
HADOOP-2401 Add convenience put method that takes writable
|
||||||
|
|
|
@ -223,24 +223,19 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
|
||||||
|
|
||||||
int numberOfRegionsFound = 0;
|
int numberOfRegionsFound = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
SortedMap<Text, byte[]> results = new TreeMap<Text, byte[]>();
|
|
||||||
HbaseMapWritable values = regionServer.next(scannerId);
|
HbaseMapWritable values = regionServer.next(scannerId);
|
||||||
if (values == null || values.size() == 0) {
|
if (values == null || values.size() == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (Map.Entry<Writable, Writable> e: values.entrySet()) {
|
|
||||||
HStoreKey key = (HStoreKey) e.getKey();
|
// TODO: Why does this have to be a sorted map?
|
||||||
results.put(key.getColumn(),
|
SortedMap<Text, byte[]> results = toRowMap(values).getMap();
|
||||||
((ImmutableBytesWritable) e.getValue()).get());
|
|
||||||
}
|
HRegionInfo info = getHRegionInfo(results);
|
||||||
byte [] bytes = results.get(COL_REGIONINFO);
|
if (info == null) {
|
||||||
if (bytes == null) {
|
|
||||||
LOG.warn(COL_REGIONINFO.toString() + " is empty; has keys: " +
|
|
||||||
values.keySet().toString());
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
HRegionInfo info = (HRegionInfo) Writables.getWritable(bytes,
|
|
||||||
new HRegionInfo());
|
|
||||||
String serverName = Writables.bytesToString(results.get(COL_SERVER));
|
String serverName = Writables.bytesToString(results.get(COL_SERVER));
|
||||||
long startCode = Writables.bytesToLong(results.get(COL_STARTCODE));
|
long startCode = Writables.bytesToLong(results.get(COL_STARTCODE));
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
|
@ -2007,28 +2002,13 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
|
||||||
RemoteExceptionHandler.checkIOException(e));
|
RemoteExceptionHandler.checkIOException(e));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (values == null || values.size() == 0) {
|
if (values == null || values.size() == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// TODO: Why does this have to be a sorted map?
|
||||||
SortedMap<Text, byte[]> results = new TreeMap<Text, byte[]>();
|
RowMap rm = toRowMap(values);
|
||||||
Text row = null;
|
Text row = rm.getRow();
|
||||||
for (Map.Entry<Writable, Writable> e: values.entrySet()) {
|
SortedMap<Text, byte[]> map = rm.getMap();
|
||||||
HStoreKey key = (HStoreKey) e.getKey();
|
|
||||||
Text thisRow = key.getRow();
|
|
||||||
if (row == null) {
|
|
||||||
row = thisRow;
|
|
||||||
} else {
|
|
||||||
if (!row.equals(thisRow)) {
|
|
||||||
LOG.error("Multiple rows in same scanner result set. firstRow="
|
|
||||||
+ row + ", currentRow=" + thisRow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
results.put(key.getColumn(),
|
|
||||||
((ImmutableBytesWritable) e.getValue()).get());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (LOG.isDebugEnabled() && row != null) {
|
if (LOG.isDebugEnabled() && row != null) {
|
||||||
LOG.debug("shutdown scanner looking at " + row.toString());
|
LOG.debug("shutdown scanner looking at " + row.toString());
|
||||||
}
|
}
|
||||||
|
@ -2038,8 +2018,8 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
|
||||||
// missed edits in hlog because hdfs does not do write-append).
|
// missed edits in hlog because hdfs does not do write-append).
|
||||||
String serverName;
|
String serverName;
|
||||||
try {
|
try {
|
||||||
serverName = Writables.bytesToString(results.get(COL_SERVER));
|
serverName = Writables.bytesToString(map.get(COL_SERVER));
|
||||||
} catch(UnsupportedEncodingException e) {
|
} catch (UnsupportedEncodingException e) {
|
||||||
LOG.error("Server name", e);
|
LOG.error("Server name", e);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2054,13 +2034,9 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bingo! Found it.
|
// Bingo! Found it.
|
||||||
HRegionInfo info = null;
|
HRegionInfo info = getHRegionInfo(map);
|
||||||
try {
|
if (info == null) {
|
||||||
info = (HRegionInfo) Writables.getWritable(
|
continue;
|
||||||
results.get(COL_REGIONINFO), new HRegionInfo());
|
|
||||||
} catch (IOException e) {
|
|
||||||
LOG.error("Read fields", e);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
LOG.info(info.getRegionName() + " was on shutdown server <" +
|
LOG.info(info.getRegionName() + " was on shutdown server <" +
|
||||||
serverName + "> (or server is null). Marking unassigned in " +
|
serverName + "> (or server is null). Marking unassigned in " +
|
||||||
|
@ -2720,52 +2696,21 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
|
||||||
|
|
||||||
try {
|
try {
|
||||||
while (true) {
|
while (true) {
|
||||||
HRegionInfo info = new HRegionInfo();
|
|
||||||
String serverName = null;
|
|
||||||
long startCode = -1L;
|
|
||||||
|
|
||||||
HbaseMapWritable values = server.next(scannerId);
|
HbaseMapWritable values = server.next(scannerId);
|
||||||
if(values == null || values.size() == 0) {
|
if(values == null || values.size() == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
boolean haveRegionInfo = false;
|
RowMap rm = toRowMap(values);
|
||||||
for (Map.Entry<Writable, Writable> e: values.entrySet()) {
|
SortedMap<Text, byte[]> map = rm.getMap();
|
||||||
|
HRegionInfo info = getHRegionInfo(map);
|
||||||
byte[] value = ((ImmutableBytesWritable) e.getValue()).get();
|
if (info == null) {
|
||||||
if (value == null || value.length == 0) {
|
throw new IOException(COL_REGIONINFO + " not found on " +
|
||||||
break;
|
rm.getRow());
|
||||||
}
|
|
||||||
HStoreKey key = (HStoreKey) e.getKey();
|
|
||||||
Text column = key.getColumn();
|
|
||||||
if (column.equals(COL_REGIONINFO)) {
|
|
||||||
haveRegionInfo = true;
|
|
||||||
info = (HRegionInfo) Writables.getWritable(value, info);
|
|
||||||
|
|
||||||
} else if (column.equals(COL_SERVER)) {
|
|
||||||
try {
|
|
||||||
serverName =
|
|
||||||
Writables.bytesToString(value);
|
|
||||||
|
|
||||||
} catch (UnsupportedEncodingException ex) {
|
|
||||||
assert(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (column.equals(COL_STARTCODE)) {
|
|
||||||
try {
|
|
||||||
startCode = Writables.bytesToLong(value);
|
|
||||||
|
|
||||||
} catch (UnsupportedEncodingException ex) {
|
|
||||||
assert(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
String serverName = Writables.bytesToString(map.get(COL_SERVER));
|
||||||
if (!haveRegionInfo) {
|
long startCode = Writables.bytesToLong(map.get(COL_STARTCODE));
|
||||||
throw new IOException(COL_REGIONINFO + " not found");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info.getTableDesc().getName().compareTo(tableName) > 0) {
|
if (info.getTableDesc().getName().compareTo(tableName) > 0) {
|
||||||
break; // Beyond any more entries for this table
|
break; // Beyond any more entries for this table
|
||||||
}
|
}
|
||||||
|
|
||||||
tableExists = true;
|
tableExists = true;
|
||||||
|
@ -2773,9 +2718,7 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
|
||||||
unservedRegions.add(info);
|
unservedRegions.add(info);
|
||||||
}
|
}
|
||||||
processScanItem(serverName, startCode, info);
|
processScanItem(serverName, startCode, info);
|
||||||
|
|
||||||
} // while(true)
|
} // while(true)
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
if (scannerId != -1L) {
|
if (scannerId != -1L) {
|
||||||
try {
|
try {
|
||||||
|
@ -2994,7 +2937,7 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
|
||||||
protected void updateRegionInfo(BatchUpdate b,
|
protected void updateRegionInfo(BatchUpdate b,
|
||||||
@SuppressWarnings("unused") HRegionInfo info) {
|
@SuppressWarnings("unused") HRegionInfo info) {
|
||||||
for (int i = 0; i < ALL_META_COLUMNS.length; i++) {
|
for (int i = 0; i < ALL_META_COLUMNS.length; i++) {
|
||||||
// Be sure to clean all columns
|
// Be sure to clean all cells
|
||||||
b.delete(lockid, ALL_META_COLUMNS[i]);
|
b.delete(lockid, ALL_META_COLUMNS[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3171,6 +3114,75 @@ public class HMaster extends Thread implements HConstants, HMasterInterface,
|
||||||
return this.conf;
|
return this.conf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Data structure used to return results out of the toRowMap method.
|
||||||
|
*/
|
||||||
|
private class RowMap {
|
||||||
|
final Text row;
|
||||||
|
final SortedMap<Text, byte[]> map;
|
||||||
|
|
||||||
|
private RowMap(final Text r, final SortedMap<Text, byte[]> m) {
|
||||||
|
this.row = r;
|
||||||
|
this.map = m;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Text getRow() {
|
||||||
|
return this.row;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SortedMap<Text, byte[]> getMap() {
|
||||||
|
return this.map;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert an HbaseMapWritable to a Map keyed by column.
|
||||||
|
* Utility method used scanning meta regions
|
||||||
|
* @param mw The MapWritable to convert. Cannot be null.
|
||||||
|
* @return Returns a SortedMap currently. TODO: This looks like it could
|
||||||
|
* be a plain Map.
|
||||||
|
*/
|
||||||
|
protected RowMap toRowMap(final HbaseMapWritable mw) {
|
||||||
|
if (mw == null) {
|
||||||
|
throw new IllegalArgumentException("Passed MapWritable cannot be null");
|
||||||
|
}
|
||||||
|
SortedMap<Text, byte[]> m = new TreeMap<Text, byte[]>();
|
||||||
|
Text row = null;
|
||||||
|
for (Map.Entry<Writable, Writable> e: mw.entrySet()) {
|
||||||
|
HStoreKey key = (HStoreKey) e.getKey();
|
||||||
|
Text thisRow = key.getRow();
|
||||||
|
if (row == null) {
|
||||||
|
row = thisRow;
|
||||||
|
} else {
|
||||||
|
if (!row.equals(thisRow)) {
|
||||||
|
LOG.error("Multiple rows in same scanner result set. firstRow=" +
|
||||||
|
row + ", currentRow=" + thisRow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m.put(key.getColumn(), ((ImmutableBytesWritable) e.getValue()).get());
|
||||||
|
}
|
||||||
|
return new RowMap(row, m);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get HRegionInfo from passed META map of row values.
|
||||||
|
* Returns null if none found (and logs fact that expected COL_REGIONINFO
|
||||||
|
* was missing). Utility method used by scanners of META tables.
|
||||||
|
* @param map Map to do lookup in.
|
||||||
|
* @return Null or found HRegionInfo.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
protected HRegionInfo getHRegionInfo(final Map<Text, byte[]> map)
|
||||||
|
throws IOException {
|
||||||
|
byte [] bytes = map.get(COL_REGIONINFO);
|
||||||
|
if (bytes == null) {
|
||||||
|
LOG.warn(COL_REGIONINFO.toString() + " is empty; has keys: " +
|
||||||
|
map.keySet().toString());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (HRegionInfo)Writables.getWritable(bytes, new HRegionInfo());
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main program
|
* Main program
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -413,15 +413,13 @@ public class HStoreFile implements HConstants {
|
||||||
* @return MapFile.Reader
|
* @return MapFile.Reader
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public synchronized MapFile.Reader getReader(final FileSystem fs,
|
public MapFile.Reader getReader(final FileSystem fs,
|
||||||
final Filter bloomFilter) throws IOException {
|
final Filter bloomFilter)
|
||||||
|
throws IOException {
|
||||||
if (isReference()) {
|
return isReference()?
|
||||||
return new HStoreFile.HalfMapFileReader(fs,
|
new HStoreFile.HalfMapFileReader(fs, getMapFilePath(reference).toString(),
|
||||||
getMapFilePath(reference).toString(), conf,
|
conf, reference.getFileRegion(), reference.getMidkey(), bloomFilter):
|
||||||
reference.getFileRegion(), reference.getMidkey(), bloomFilter);
|
new BloomFilterMapFile.Reader(fs, getMapFilePath().toString(),
|
||||||
}
|
|
||||||
return new BloomFilterMapFile.Reader(fs, getMapFilePath().toString(),
|
|
||||||
conf, bloomFilter);
|
conf, bloomFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue