use of org.apache.accumulo.server.master.state.TServerInstance in project accumulo by apache.
the class MasterClientServiceHandler method shutdownTabletServer.
@Override
public void shutdownTabletServer(TInfo info, TCredentials c, String tabletServer, boolean force) throws ThriftSecurityException {
master.security.canPerformSystemActions(c);
final TServerInstance doomed = master.tserverSet.find(tabletServer);
if (!force) {
final TServerConnection server = master.tserverSet.getConnection(doomed);
if (server == null) {
Master.log.warn("No server found for name {}", tabletServer);
return;
}
}
long tid = master.fate.startTransaction();
log.debug("Seeding FATE op to shutdown " + tabletServer + " with tid " + tid);
master.fate.seedTransaction(tid, new TraceRepo<>(new ShutdownTServer(doomed, force)), false);
master.fate.waitForCompletion(tid);
master.fate.delete(tid);
log.debug("FATE op shutting down " + tabletServer + " finished");
}
use of org.apache.accumulo.server.master.state.TServerInstance in project accumulo by apache.
the class MasterClientServiceHandler method waitForFlush.
@Override
public void waitForFlush(TInfo tinfo, TCredentials c, String tableIdStr, ByteBuffer startRow, ByteBuffer endRow, long flushID, long maxLoops) throws ThriftSecurityException, ThriftTableOperationException {
Table.ID tableId = Table.ID.of(tableIdStr);
Namespace.ID namespaceId = getNamespaceIdFromTableId(TableOperation.FLUSH, tableId);
master.security.canFlush(c, tableId, namespaceId);
if (endRow != null && startRow != null && ByteBufferUtil.toText(startRow).compareTo(ByteBufferUtil.toText(endRow)) >= 0)
throw new ThriftTableOperationException(tableId.canonicalID(), null, TableOperation.FLUSH, TableOperationExceptionType.BAD_RANGE, "start row must be less than end row");
Set<TServerInstance> serversToFlush = new HashSet<>(master.tserverSet.getCurrentServers());
for (long l = 0; l < maxLoops; l++) {
for (TServerInstance instance : serversToFlush) {
try {
final TServerConnection server = master.tserverSet.getConnection(instance);
if (server != null)
server.flush(master.masterLock, tableId, ByteBufferUtil.toBytes(startRow), ByteBufferUtil.toBytes(endRow));
} catch (TException ex) {
Master.log.error(ex.toString());
}
}
if (l == maxLoops - 1)
break;
sleepUninterruptibly(50, TimeUnit.MILLISECONDS);
serversToFlush.clear();
try {
Connector conn = master.getConnector();
Scanner scanner;
if (tableId.equals(MetadataTable.ID)) {
scanner = new IsolatedScanner(conn.createScanner(RootTable.NAME, Authorizations.EMPTY));
scanner.setRange(MetadataSchema.TabletsSection.getRange());
} else {
scanner = new IsolatedScanner(conn.createScanner(MetadataTable.NAME, Authorizations.EMPTY));
Range range = new KeyExtent(tableId, null, ByteBufferUtil.toText(startRow)).toMetadataRange();
scanner.setRange(range.clip(MetadataSchema.TabletsSection.getRange()));
}
TabletsSection.ServerColumnFamily.FLUSH_COLUMN.fetch(scanner);
TabletsSection.ServerColumnFamily.DIRECTORY_COLUMN.fetch(scanner);
scanner.fetchColumnFamily(TabletsSection.CurrentLocationColumnFamily.NAME);
scanner.fetchColumnFamily(LogColumnFamily.NAME);
RowIterator ri = new RowIterator(scanner);
int tabletsToWaitFor = 0;
int tabletCount = 0;
Text ert = ByteBufferUtil.toText(endRow);
while (ri.hasNext()) {
Iterator<Entry<Key, Value>> row = ri.next();
long tabletFlushID = -1;
int logs = 0;
boolean online = false;
TServerInstance server = null;
Entry<Key, Value> entry = null;
while (row.hasNext()) {
entry = row.next();
Key key = entry.getKey();
if (TabletsSection.ServerColumnFamily.FLUSH_COLUMN.equals(key.getColumnFamily(), key.getColumnQualifier())) {
tabletFlushID = Long.parseLong(entry.getValue().toString());
}
if (LogColumnFamily.NAME.equals(key.getColumnFamily()))
logs++;
if (TabletsSection.CurrentLocationColumnFamily.NAME.equals(key.getColumnFamily())) {
online = true;
server = new TServerInstance(entry.getValue(), key.getColumnQualifier());
}
}
// when tablet is not online and has no logs, there is no reason to wait for it
if ((online || logs > 0) && tabletFlushID < flushID) {
tabletsToWaitFor++;
if (server != null)
serversToFlush.add(server);
}
tabletCount++;
Text tabletEndRow = new KeyExtent(entry.getKey().getRow(), (Text) null).getEndRow();
if (tabletEndRow == null || (ert != null && tabletEndRow.compareTo(ert) >= 0))
break;
}
if (tabletsToWaitFor == 0)
break;
if (tabletCount == 0 && !Tables.exists(master.getInstance(), tableId))
throw new ThriftTableOperationException(tableId.canonicalID(), null, TableOperation.FLUSH, TableOperationExceptionType.NOTFOUND, null);
} catch (AccumuloException | TabletDeletedException e) {
Master.log.debug("Failed to scan {} table to wait for flush {}", MetadataTable.NAME, tableId, e);
} catch (AccumuloSecurityException e) {
Master.log.warn("{}", e.getMessage(), e);
throw new ThriftSecurityException();
} catch (TableNotFoundException e) {
Master.log.error("{}", e.getMessage(), e);
throw new ThriftTableOperationException();
}
}
}
use of org.apache.accumulo.server.master.state.TServerInstance in project accumulo by apache.
the class MasterClientServiceHandler method getActiveTservers.
@Override
public List<String> getActiveTservers(TInfo tinfo, TCredentials credentials) throws TException {
Set<TServerInstance> tserverInstances = master.onlineTabletServers();
List<String> servers = new ArrayList<>();
for (TServerInstance tserverInstance : tserverInstances) {
servers.add(tserverInstance.getLocation().toString());
}
return servers;
}
use of org.apache.accumulo.server.master.state.TServerInstance in project accumulo by apache.
the class GarbageCollectWriteAheadLogs method getCurrent.
/**
* Scans log markers. The map passed in is populated with the log ids.
*
* @param logsByServer
* map of dead server to log file entries
* @return total number of log files
*/
private long getCurrent(Map<TServerInstance, Set<UUID>> logsByServer, Map<UUID, Pair<WalState, Path>> logState) throws Exception {
// get all the unused WALs in zookeeper
long result = 0;
Map<TServerInstance, List<UUID>> markers = walMarker.getAllMarkers();
for (Entry<TServerInstance, List<UUID>> entry : markers.entrySet()) {
HashSet<UUID> ids = new HashSet<>(entry.getValue().size());
for (UUID id : entry.getValue()) {
ids.add(id);
logState.put(id, walMarker.state(entry.getKey(), id));
result++;
}
logsByServer.put(entry.getKey(), ids);
}
return result;
}
use of org.apache.accumulo.server.master.state.TServerInstance in project accumulo by apache.
the class LiveTServerSetTest method testSessionIds.
@Test
public void testSessionIds() {
Map<String, TServerInfo> servers = new HashMap<>();
TServerConnection mockConn = EasyMock.createMock(TServerConnection.class);
TServerInfo server1 = new TServerInfo(new TServerInstance(HostAndPort.fromParts("localhost", 1234), "5555"), mockConn);
servers.put("server1", server1);
LiveTServerSet tservers = new LiveTServerSet(EasyMock.createMock(ClientContext.class), EasyMock.createMock(Listener.class));
assertEquals(server1.instance, tservers.find(servers, "localhost:1234"));
assertNull(tservers.find(servers, "localhost:4321"));
assertEquals(server1.instance, tservers.find(servers, "localhost:1234[5555]"));
assertNull(tservers.find(servers, "localhost:1234[55755]"));
}
Aggregations