@Provides @Singleton public static TransactionManager createTransactionManager( TransactionManagerConfig config, CatalogManager catalogManager, @ForTransactionManager ScheduledExecutorService idleCheckExecutor, @ForTransactionManager ExecutorService finishingExecutor) { return InMemoryTransactionManager.create(config, idleCheckExecutor, catalogManager, finishingExecutor); }
public static MetadataManager createTestMetadataManager(CatalogManager catalogManager, FeaturesConfig featuresConfig) { return createTestMetadataManager(createTestTransactionManager(catalogManager), featuresConfig); }
public static TransactionManager create( TransactionManagerConfig config, ScheduledExecutorService idleCheckExecutor, CatalogManager catalogManager, ExecutorService finishingExecutor) { InMemoryTransactionManager transactionManager = new InMemoryTransactionManager(config.getIdleTimeout(), config.getMaxFinishingConcurrency(), catalogManager, finishingExecutor); transactionManager.scheduleIdleChecks(config.getIdleCheckInterval(), idleCheckExecutor); return transactionManager; }
@Override public CatalogMetadata getCatalogMetadataForWrite(TransactionId transactionId, ConnectorId connectorId) { CatalogMetadata catalogMetadata = getCatalogMetadata(transactionId, connectorId); checkConnectorWrite(transactionId, connectorId); return catalogMetadata; }
@Override public CatalogMetadata getCatalogMetadataForWrite(TransactionId transactionId, String catalogName) { TransactionMetadata transactionMetadata = getTransactionMetadata(transactionId); // there is no need to ask for a connector specific id since the overlay connectors are read only ConnectorId connectorId = transactionMetadata.getConnectorId(catalogName) .orElseThrow(() -> new PrestoException(NOT_FOUND, "Catalog does not exist: " + catalogName)); return getCatalogMetadataForWrite(transactionId, connectorId); }
@Override public Map<String, ConnectorId> getCatalogNames(TransactionId transactionId) { return getTransactionMetadata(transactionId).getCatalogNames(); }
@Override public ListenableFuture<?> asyncCommit(TransactionId transactionId) { return nonCancellationPropagating(Futures.transformAsync(removeTransactionMetadataAsFuture(transactionId), TransactionMetadata::asyncCommit, directExecutor())); }
@Override public TransactionId beginTransaction(boolean autoCommitContext) { return beginTransaction(DEFAULT_ISOLATION, DEFAULT_READ_ONLY, autoCommitContext); }
@Override public ConnectorTransactionHandle getConnectorTransaction(TransactionId transactionId, ConnectorId connectorId) { return getCatalogMetadata(transactionId, connectorId).getTransactionHandleFor(connectorId); }
public static TransactionManager createTestTransactionManager(CatalogManager catalogManager) { // No idle checks needed return new InMemoryTransactionManager(new Duration(1, TimeUnit.DAYS), 1, catalogManager, directExecutor()); }
private void scheduleIdleChecks(Duration idleCheckInterval, ScheduledExecutorService idleCheckExecutor) { idleCheckExecutor.scheduleWithFixedDelay(() -> { try { cleanUpExpiredTransactions(); } catch (Throwable t) { log.error(t, "Unexpected exception while cleaning up expired transactions"); } }, idleCheckInterval.toMillis(), idleCheckInterval.toMillis(), MILLISECONDS); }
@Override public CatalogMetadata getCatalogMetadata(TransactionId transactionId, ConnectorId connectorId) { return getTransactionMetadata(transactionId).getTransactionCatalogMetadata(connectorId); }
@Override public ListenableFuture<?> asyncAbort(TransactionId transactionId) { return nonCancellationPropagating(Futures.transformAsync(removeTransactionMetadataAsFuture(transactionId), TransactionMetadata::asyncAbort, directExecutor())); }
public static TransactionManager createTestTransactionManager() { return createTestTransactionManager(new CatalogManager()); }
@Test public void testExpiration() throws Exception { try (IdleCheckExecutor executor = new IdleCheckExecutor()) { TransactionManager transactionManager = InMemoryTransactionManager.create( new TransactionManagerConfig() .setIdleTimeout(new Duration(1, TimeUnit.MILLISECONDS)) .setIdleCheckInterval(new Duration(5, TimeUnit.MILLISECONDS)), executor.getExecutor(), new CatalogManager(), finishingExecutor); TransactionId transactionId = transactionManager.beginTransaction(false); assertEquals(transactionManager.getAllTransactionInfos().size(), 1); TransactionInfo transactionInfo = transactionManager.getTransactionInfo(transactionId); assertFalse(transactionInfo.isAutoCommitContext()); assertTrue(transactionInfo.getConnectorIds().isEmpty()); assertFalse(transactionInfo.getWrittenConnectorId().isPresent()); transactionManager.trySetInactive(transactionId); TimeUnit.MILLISECONDS.sleep(100); assertTrue(transactionManager.getAllTransactionInfos().isEmpty()); } }
@Override public Optional<CatalogMetadata> getOptionalCatalogMetadata(TransactionId transactionId, String catalogName) { TransactionMetadata transactionMetadata = getTransactionMetadata(transactionId); return transactionMetadata.getConnectorId(catalogName) .map(transactionMetadata::getTransactionCatalogMetadata); }
@Test(expectedExceptions = PrestoException.class, expectedExceptionsMessageRegExp = "Presto server is still initializing") public void testInitializing() { AccessControlManager accessControlManager = new AccessControlManager(createTestTransactionManager()); accessControlManager.checkCanSetUser(Optional.empty(), "foo"); }
@Test public void testTransactionWorkflow() { try (IdleCheckExecutor executor = new IdleCheckExecutor()) { CatalogManager catalogManager = new CatalogManager(); TransactionManager transactionManager = InMemoryTransactionManager.create(new TransactionManagerConfig(), executor.getExecutor(), catalogManager, finishingExecutor); Connector c1 = new TpchConnectorFactory().create(CATALOG_NAME, ImmutableMap.of(), new TestingConnectorContext()); registerConnector(catalogManager, transactionManager, CATALOG_NAME, CONNECTOR_ID, c1); TransactionId transactionId = transactionManager.beginTransaction(false); assertEquals(transactionManager.getAllTransactionInfos().size(), 1); TransactionInfo transactionInfo = transactionManager.getTransactionInfo(transactionId); assertFalse(transactionInfo.isAutoCommitContext()); assertTrue(transactionInfo.getConnectorIds().isEmpty()); assertFalse(transactionInfo.getWrittenConnectorId().isPresent()); ConnectorMetadata metadata = transactionManager.getOptionalCatalogMetadata(transactionId, CATALOG_NAME).get().getMetadata(); metadata.listSchemaNames(TEST_SESSION.toConnectorSession(CONNECTOR_ID)); transactionInfo = transactionManager.getTransactionInfo(transactionId); assertEquals(transactionInfo.getConnectorIds(), ImmutableList.of(CONNECTOR_ID, INFORMATION_SCHEMA_ID, SYSTEM_TABLES_ID)); assertFalse(transactionInfo.getWrittenConnectorId().isPresent()); getFutureValue(transactionManager.asyncCommit(transactionId)); assertTrue(transactionManager.getAllTransactionInfos().isEmpty()); } }
@Override public TransactionInfo getTransactionInfo(TransactionId transactionId) { return getTransactionMetadata(transactionId).getTransactionInfo(); }
@Test public void testNoneSystemAccessControl() { AccessControlManager accessControlManager = new AccessControlManager(createTestTransactionManager()); accessControlManager.setSystemAccessControl(AllowAllSystemAccessControl.NAME, ImmutableMap.of()); accessControlManager.checkCanSetUser(Optional.empty(), USER_NAME); }