}
}
}
private void deleteTablets(MergeInfo info) throws AccumuloException {
KeyExtent range = info.getRange();
log.debug("Deleting tablets for " + range);
char timeType = '\0';
KeyExtent followingTablet = null;
if (range.getEndRow() != null) {
Key nextExtent = new Key(range.getEndRow()).followingKey(PartialKey.ROW);
followingTablet = getHighTablet(new KeyExtent(range.getTableId(), nextExtent.getRow(), range.getEndRow()));
log.debug("Found following tablet " + followingTablet);
}
try {
Connector conn = getConnector();
Text start = range.getPrevEndRow();
if (start == null) {
start = new Text();
}
log.debug("Making file deletion entries for " + range);
Range deleteRange = new Range(KeyExtent.getMetadataEntry(range.getTableId(), start), false, KeyExtent.getMetadataEntry(range.getTableId(),
range.getEndRow()), true);
Scanner scanner = conn.createScanner(Constants.METADATA_TABLE_NAME, Constants.NO_AUTHS);
scanner.setRange(deleteRange);
Constants.METADATA_DIRECTORY_COLUMN.fetch(scanner);
Constants.METADATA_TIME_COLUMN.fetch(scanner);
scanner.fetchColumnFamily(Constants.METADATA_DATAFILE_COLUMN_FAMILY);
scanner.fetchColumnFamily(Constants.METADATA_CURRENT_LOCATION_COLUMN_FAMILY);
Set<String> datafiles = new TreeSet<String>();
for (Entry<Key,Value> entry : scanner) {
Key key = entry.getKey();
if (key.compareColumnFamily(Constants.METADATA_DATAFILE_COLUMN_FAMILY) == 0) {
datafiles.add(key.getColumnQualifier().toString());
if (datafiles.size() > 1000) {
MetadataTable.addDeleteEntries(range, datafiles, SecurityConstants.getSystemCredentials());
datafiles.clear();
}
} else if (Constants.METADATA_TIME_COLUMN.hasColumns(key)) {
timeType = entry.getValue().toString().charAt(0);
} else if (key.compareColumnFamily(Constants.METADATA_CURRENT_LOCATION_COLUMN_FAMILY) == 0) {
throw new IllegalStateException("Tablet " + key.getRow() + " is assigned during a merge!");
} else if (Constants.METADATA_DIRECTORY_COLUMN.hasColumns(key)) {
datafiles.add(entry.getValue().toString());
if (datafiles.size() > 1000) {
MetadataTable.addDeleteEntries(range, datafiles, SecurityConstants.getSystemCredentials());
datafiles.clear();
}
}
}
MetadataTable.addDeleteEntries(range, datafiles, SecurityConstants.getSystemCredentials());
BatchWriter bw = conn.createBatchWriter(Constants.METADATA_TABLE_NAME, new BatchWriterConfig());
try {
deleteTablets(deleteRange, bw, conn);
} finally {
bw.close();
}
if (followingTablet != null) {
log.debug("Updating prevRow of " + followingTablet + " to " + range.getPrevEndRow());
bw = conn.createBatchWriter(Constants.METADATA_TABLE_NAME, new BatchWriterConfig());
try {
Mutation m = new Mutation(followingTablet.getMetadataEntry());
Constants.METADATA_PREV_ROW_COLUMN.put(m, KeyExtent.encodePrevEndRow(range.getPrevEndRow()));
Constants.METADATA_CHOPPED_COLUMN.putDelete(m);
bw.addMutation(m);
bw.flush();
} finally {
bw.close();
}
} else {
// Recreate the default tablet to hold the end of the table
log.debug("Recreating the last tablet to point to " + range.getPrevEndRow());
MetadataTable.addTablet(new KeyExtent(range.getTableId(), null, range.getPrevEndRow()), Constants.DEFAULT_TABLET_LOCATION,
SecurityConstants.getSystemCredentials(), timeType, masterLock);
}
} catch (Exception ex) {
throw new AccumuloException(ex);
}