use of herddb.model.TableSpace in project herddb by diennea.
the class AlterTablespaceSQLTest method createAlterTableSpace.
@Test
public void createAlterTableSpace() throws Exception {
String nodeId = "localhost";
try (DBManager manager = new DBManager(nodeId, new MemoryMetadataStorageManager(), new MemoryDataStorageManager(), new MemoryCommitLogManager(), null, null)) {
manager.start();
assertTrue(manager.waitForTablespace(TableSpace.DEFAULT, 10000));
execute(manager, "EXECUTE CREATETABLESPACE 'ttt'", Collections.emptyList());
execute(manager, "CREATE TABLESPACE 'ttt2','leader:" + nodeId + "'", Collections.emptyList());
try {
execute(manager, "EXECUTE CREATETABLESPACE 'ttt2','leader:othernode'", Collections.emptyList());
fail();
} catch (TableSpaceAlreadyExistsException err) {
}
execute(manager, "EXECUTE CREATETABLESPACE 'ttt3','leader:othernode'", Collections.emptyList());
execute(manager, "EXECUTE CREATETABLESPACE 'ttt4','leader:othernode','replica:" + nodeId + ",othernode'", Collections.emptyList());
execute(manager, "EXECUTE ALTERTABLESPACE 'ttt3','replica:" + nodeId + ",othernode','expectedReplicaCount:2'", Collections.emptyList());
execute(manager, "EXECUTE ALTERTABLESPACE 'ttt3','leader:othernode'", Collections.emptyList());
execute(manager, "EXECUTE ALTERTABLESPACE 'ttt3','expectedReplicaCount:12'", Collections.emptyList());
TableSpace ttt3 = manager.getMetadataStorageManager().describeTableSpace("ttt3");
assertEquals("othernode", ttt3.leaderId);
assertEquals(12, ttt3.expectedReplicaCount);
assertTrue(ttt3.replicas.contains("othernode"));
assertTrue(ttt3.replicas.contains(nodeId));
try (DataScanner scan = scan(manager, "SELECT * FROM SYSTABLESPACES", Collections.emptyList())) {
List<DataAccessor> tuples = scan.consume();
assertEquals(5, tuples.size());
for (DataAccessor t : tuples) {
System.out.println("tablespace: " + t.toMap());
assertNotNull(t.get("expectedreplicacount"));
assertNotNull(t.get("tablespace_name"));
assertNotNull(t.get("replica"));
assertNotNull(t.get("leader"));
}
}
try (DataScanner scan = scan(manager, "SELECT expectedreplicacount FROM SYSTABLESPACES where tablespace_name='ttt3'", Collections.emptyList())) {
List<DataAccessor> tuples = scan.consume();
assertEquals(1, tuples.size());
for (DataAccessor t : tuples) {
System.out.println("tablespace: " + t.toMap());
assertEquals(12, t.get("expectedreplicacount"));
}
}
}
}
use of herddb.model.TableSpace in project herddb by diennea.
the class ZookeeperMetadataStorageManager method ensureDefaultTableSpace.
@Override
public void ensureDefaultTableSpace(String localNodeId) throws MetadataStorageManagerException {
try {
TableSpaceList list = listTablesSpaces();
if (!list.tableSpaces.contains(TableSpace.DEFAULT)) {
TableSpace tableSpace = TableSpace.builder().leader(localNodeId).replica(localNodeId).expectedReplicaCount(1).maxLeaderInactivityTime(0).name(TableSpace.DEFAULT).build();
createTableSpaceNode(tableSpace);
}
} catch (TableSpaceAlreadyExistsException err) {
// not a problem
} catch (InterruptedException | KeeperException | IOException err) {
handleSessionExpiredError(err);
throw new MetadataStorageManagerException(err);
}
}
use of herddb.model.TableSpace in project herddb by diennea.
the class FileMetadataStorageManager method ensureDefaultTableSpace.
@Override
public void ensureDefaultTableSpace(String localNodeId) throws MetadataStorageManagerException {
lock.writeLock().lock();
try {
TableSpace exists = tableSpaces.get(TableSpace.DEFAULT);
if (exists == null) {
TableSpace defaultTableSpace = TableSpace.builder().leader(localNodeId).replica(localNodeId).name(TableSpace.DEFAULT).build();
registerTableSpace(defaultTableSpace);
}
} catch (DDLException err) {
throw new MetadataStorageManagerException(err);
} finally {
lock.writeLock().unlock();
}
}
use of herddb.model.TableSpace in project herddb by diennea.
the class MemoryMetadataStorageManager method ensureDefaultTableSpace.
@Override
public void ensureDefaultTableSpace(String localNodeId) throws MetadataStorageManagerException {
lock.writeLock().lock();
try {
TableSpace exists = tableSpaces.get(TableSpace.DEFAULT);
if (exists == null) {
TableSpace defaultTableSpace = TableSpace.builder().leader(localNodeId).replica(localNodeId).name(TableSpace.DEFAULT).build();
registerTableSpace(defaultTableSpace);
}
} catch (DDLException err) {
throw new MetadataStorageManagerException(err);
} finally {
lock.writeLock().unlock();
}
}
use of herddb.model.TableSpace in project herddb by diennea.
the class TableSpaceManager method executeStatementAsyncInternal.
private CompletableFuture<StatementExecutionResult> executeStatementAsyncInternal(Statement statement, StatementEvaluationContext context, TransactionContext transactionContext, boolean rollbackOnError) throws StatementExecutionException {
Transaction transaction = transactions.get(transactionContext.transactionId);
if (transaction != null && !transaction.tableSpace.equals(tableSpaceName)) {
return Futures.exception(new StatementExecutionException("transaction " + transaction.transactionId + " is for tablespace " + transaction.tableSpace + ", not for " + tableSpaceName));
}
if (transactionContext.transactionId > 0 && transaction == null) {
return Futures.exception(new StatementExecutionException("transaction " + transactionContext.transactionId + " not found on tablespace " + tableSpaceName));
}
boolean isTransactionCommand = statement instanceof CommitTransactionStatement || statement instanceof RollbackTransactionStatement || // AlterTable implictly commits the transaction
statement instanceof AlterTableStatement;
if (transaction != null) {
transaction.touch();
if (!isTransactionCommand) {
transaction.increaseRefcount();
}
}
CompletableFuture<StatementExecutionResult> res;
try {
if (statement instanceof TableAwareStatement) {
res = executeTableAwareStatement(statement, transaction, context);
} else if (statement instanceof SQLPlannedOperationStatement) {
res = executePlannedOperationStatement(statement, transactionContext, context);
} else if (statement instanceof BeginTransactionStatement) {
if (transaction != null) {
res = Futures.exception(new StatementExecutionException("transaction already started"));
} else {
res = beginTransactionAsync(context, true);
}
} else if (statement instanceof CommitTransactionStatement) {
res = commitTransaction((CommitTransactionStatement) statement, context);
} else if (statement instanceof RollbackTransactionStatement) {
res = rollbackTransaction((RollbackTransactionStatement) statement, context);
} else if (statement instanceof CreateTableStatement) {
res = CompletableFuture.completedFuture(createTable((CreateTableStatement) statement, transaction, context));
} else if (statement instanceof CreateIndexStatement) {
res = CompletableFuture.completedFuture(createIndex((CreateIndexStatement) statement, transaction, context));
} else if (statement instanceof DropTableStatement) {
res = CompletableFuture.completedFuture(dropTable((DropTableStatement) statement, transaction, context));
} else if (statement instanceof DropIndexStatement) {
res = CompletableFuture.completedFuture(dropIndex((DropIndexStatement) statement, transaction, context));
} else if (statement instanceof AlterTableStatement) {
res = CompletableFuture.completedFuture(alterTable((AlterTableStatement) statement, transactionContext, context));
} else {
res = Futures.exception(new StatementExecutionException("unsupported statement " + statement).fillInStackTrace());
}
} catch (StatementExecutionException error) {
res = Futures.exception(error);
}
if (transaction != null && !isTransactionCommand) {
res = res.whenComplete((a, b) -> {
transaction.decreaseRefCount();
});
}
if (rollbackOnError) {
long txId = transactionContext.transactionId;
if (txId > 0) {
res = res.whenComplete((xx, error) -> {
if (error != null) {
LOGGER.log(Level.FINE, tableSpaceName + " force rollback of implicit transaction " + txId, error);
try {
rollbackTransaction(new RollbackTransactionStatement(tableSpaceName, txId), context).get();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
error.addSuppressed(ex);
} catch (ExecutionException ex) {
error.addSuppressed(ex.getCause());
}
throw new HerdDBInternalException(error);
}
});
}
}
return res;
}
Aggregations