use of io.datarouter.storage.node.type.physical.PhysicalNode in project datarouter by hotpads.
the class LatencyMonitoringService method getClientChecks.
public List<LatencyCheck> getClientChecks() {
List<LatencyCheck> checks = new ArrayList<>();
if (MAKE_GET_CHECK) {
for (ClientId clientId : clientInitializationTracker.getInitializedClients()) {
Collection<PhysicalNode<?, ?, ?>> nodesForClient = nodes.getPhysicalNodesForClient(clientId.getName());
Optional<PhysicalNode<?, ?, ?>> findFirst = nodesForClient.stream().findFirst();
if (findFirst.isPresent()) {
PhysicalNode<?, ?, ?> node = findFirst.get();
if (node instanceof PhysicalMapStorageNode) {
PhysicalMapStorageNode<?, ?, ?> ms = (PhysicalMapStorageNode<?, ?, ?>) node;
checks.add(new DatarouterClientLatencyCheck(LatencyMonitoringService.DR_CLIENT_PREFIX + clientId + LatencyMonitoringService.MS_CHECK_SUFIX, makeGet(ms), clientId));
}
}
}
}
Function<ClientId, Stream<Pair<ClientId, SortedStorage<?, ?>>>> mapClientIdToFirstSortedStorageNode = clientId -> nodes.getPhysicalNodesForClient(clientId.getName()).stream().filter(node -> node instanceof SortedStorage).limit(1).map(SortedStorage.class::cast).peek(sortedStorage -> logger.info("selected SortedStorage {}", sortedStorage)).map(sortedStorage -> new Pair<>(clientId, sortedStorage));
checks.addAll(clientInitializationTracker.getInitializedClients().stream().filter(clientId -> clients.getClientManager(clientId).monitorLatency()).flatMap(mapClientIdToFirstSortedStorageNode).map(pair -> new DatarouterClientLatencyCheck(getCheckNameForDatarouterClient(pair.getLeft()), () -> pair.getRight().scanKeys(ONLY_FIRST).findFirst(), pair.getLeft())).collect(Collectors.toList()));
return checks;
}
use of io.datarouter.storage.node.type.physical.PhysicalNode in project datarouter by hotpads.
the class SpannerSingleTableSchemaUpdateService method performSchemaUpdate.
public Optional<SchemaUpdateResult> performSchemaUpdate(ClientId clientId, Supplier<List<String>> existingTableNames, PhysicalNode<?, ?, ?> physicalNode) {
String tableName = physicalNode.getFieldInfo().getTableName();
List<Field<?>> primaryKeyFields = physicalNode.getFieldInfo().getSamplePrimaryKey().getFields();
List<? extends SpannerBaseFieldCodec<?, ?>> primaryKeyCodecs = fieldCodecRegistry.createCodecs(primaryKeyFields);
for (SpannerBaseFieldCodec<?, ?> codec : primaryKeyCodecs) {
if (codec.getSpannerColumnType().isArray()) {
throw new RuntimeException("Invalid field type used for primary key: " + codec.getField().getKey().getName());
}
}
List<SpannerIndex> indexes = new ArrayList<>();
List<SpannerIndex> uniqueIndexes = Scanner.of(physicalNode.getFieldInfo().getUniqueIndexes().entrySet()).map(entry -> new SpannerIndex(tableName, entry.getKey(), entry.getValue(), Collections.emptyList(), true)).list();
var statements = new SpannerUpdateStatements();
String entityTableName = null;
if (physicalNode instanceof IndexedStorage) {
IndexedStorage<?, ?> indexedStorage = (IndexedStorage<?, ?>) physicalNode;
indexes = Scanner.of(indexedStorage.getManagedNodes()).map(node -> new SpannerIndex(tableName, node.getName(), node.getIndexEntryFieldInfo().getPrimaryKeyFields(), node.getIndexEntryFieldInfo().getFields(), false)).list();
}
List<SpannerColumn> primaryKeyColumns = Scanner.of(primaryKeyCodecs).map(codec -> codec.getSpannerColumn(false)).list();
List<SpannerColumn> nonKeyColumns = Scanner.of(fieldCodecRegistry.createCodecs(physicalNode.getFieldInfo().getNonKeyFields())).map(codec -> codec.getSpannerColumn(true)).list();
if (!existingTableNames.get().contains(tableName)) {
statements.updateFunction(tableOperationsGenerator.createTable(tableName, primaryKeyColumns, nonKeyColumns, entityTableName), updateOptions::getCreateTables, true);
Scanner.of(indexes, uniqueIndexes).concat(Scanner::of).map(index -> createIndex(index, primaryKeyColumns)).forEach(statement -> statements.updateFunction(statement, updateOptions::getCreateTables, true));
} else {
DatabaseClient databaseClient = clientsHolder.getDatabaseClient(clientId);
List<SpannerColumn> allColumns = Scanner.of(primaryKeyColumns, nonKeyColumns).concat(Scanner::of).list();
ResultSet columnRs = databaseClient.singleUse().executeQuery(Statement.of(tableOperationsGenerator.getTableSchema(tableName)));
ResultSet primaryKeyRs = databaseClient.singleUse().executeQuery(Statement.of(tableOperationsGenerator.getTableIndexColumnsSchema(tableName, "PRIMARY_KEY")));
tableAlterSchemaService.generateUpdateStatementColumns(tableName, allColumns, primaryKeyColumns, columnRs, primaryKeyRs, statements);
ResultSet indexesRs = databaseClient.singleUse().executeQuery(Statement.of(tableOperationsGenerator.getTableIndexSchema(tableName)));
Set<String> currentIndexes = tableAlterSchemaService.getIndexes(indexesRs);
Scanner.of(indexes, uniqueIndexes).concat(Scanner::of).forEach(index -> {
Statement tableIndexColumnsSchema = Statement.of(tableOperationsGenerator.getTableIndexColumnsSchema(tableName, index.getIndexName()));
ResultSet indexRs = databaseClient.singleUse().executeQuery(tableIndexColumnsSchema);
if (!tableAlterSchemaService.indexEqual(index, indexRs)) {
if (currentIndexes.contains(index.getIndexName())) {
statements.updateFunction(tableOperationsGenerator.dropIndex(index.getIndexName()), updateOptions::getDropIndexes, false);
}
statements.updateFunction(createIndex(index, primaryKeyColumns), updateOptions::getAddIndexes, true);
}
currentIndexes.remove(index.getIndexName());
});
currentIndexes.forEach(name -> statements.updateFunction(tableOperationsGenerator.dropIndex(name), updateOptions::getDropIndexes, false));
}
String errorMessage = null;
if (!statements.getExecuteStatements().isEmpty()) {
logger.info(SchemaUpdateTool.generateFullWidthMessage("Executing Spanner " + getClass().getSimpleName() + " SchemaUpdate"));
logger.info(String.join("\n\n", statements.getExecuteStatements()));
Database database = clientsHolder.getDatabase(clientId);
OperationFuture<Void, UpdateDatabaseDdlMetadata> future = database.updateDdl(statements.getExecuteStatements(), null);
errorMessage = FutureTool.get(future.getPollingFuture().getAttemptResult()).getErrorMessage();
if (StringTool.notNullNorEmptyNorWhitespace(errorMessage)) {
logger.error(errorMessage);
}
}
if (statements.getPreventStartUp()) {
errorMessage = "an alter on Spanner table " + tableName + " is required";
}
if (statements.getPrintStatements().isEmpty()) {
return Optional.empty();
}
String printStatement = statements.getPrintStatements().stream().map(statement -> statement + ";").collect(Collectors.joining("\n"));
SchemaUpdateTool.printSchemaUpdate(logger, printStatement);
return Optional.of(new SchemaUpdateResult(printStatement, errorMessage, clientId));
}
Aggregations