@Test public void testCacheInvalidationHitsConnectionAgain() throws Exception { assertThat(valueStyleCache.getTableType( connectionSupplier, TEST_TABLE, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); valueStyleCache.clearCacheForTable(TEST_TABLE); assertThat(valueStyleCache.getTableType( connectionSupplier, TEST_TABLE, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); verify(connectionSupplier, times(2)).get(); }
private boolean checkIfTableHasOverflowUsingNewConnection(TableReference tableRef) { try (ConnectionSupplier conns = new ConnectionSupplier(connectionPool)) { return valueStyleCache.getTableType(conns, tableRef, config.metadataTable()) == TableValueStyle.OVERFLOW; } }
@After public void tearDown() { valueStyleCache.clearCacheForTable(TEST_TABLE); valueStyleCache.clearCacheForTable(TEST_TABLE_2); }
private static DbKvs createOracle(ExecutorService executor, OracleDdlConfig oracleDdlConfig, SqlConnectionSupplier connections) { OracleTableNameGetter tableNameGetter = new OracleTableNameGetter(oracleDdlConfig); OraclePrefixedTableNames prefixedTableNames = new OraclePrefixedTableNames(tableNameGetter); TableValueStyleCache valueStyleCache = new TableValueStyleCache(); OverflowValueLoader overflowValueLoader = new OracleOverflowValueLoader(oracleDdlConfig, tableNameGetter); DbKvsGetRange getRange = new OracleGetRange( connections, overflowValueLoader, tableNameGetter, valueStyleCache, oracleDdlConfig); CellTsPairLoader cellTsPageLoader = new OracleCellTsPageLoader( connections, tableNameGetter, valueStyleCache, oracleDdlConfig); return new DbKvs( executor, oracleDdlConfig, new OracleDbTableFactory(oracleDdlConfig, tableNameGetter, prefixedTableNames, valueStyleCache, PTExecutors.newSingleThreadScheduledExecutor()), connections, new ImmediateSingleBatchTaskRunner(), overflowValueLoader, getRange, new DbKvsGetCandidateCellsForSweeping(cellTsPageLoader)); }
private TableDetails getTableDetailsUsingNewConnection(TableReference tableRef) { try (ConnectionSupplier conns = new ConnectionSupplier(connectionPool)) { String shortName = tableNameGetter.getInternalShortTableName(conns, tableRef); TableValueStyle style = valueStyleCache.getTableType(conns, tableRef, config.metadataTable()); boolean hasOverflow = style == TableValueStyle.OVERFLOW; return new TableDetails(shortName, hasOverflow); } catch (TableMappingNotFoundException e) { throw new RuntimeException(e); } }
private void clearTableSizeCacheAndDropTableMetadata() { valueStyleCache.clearCacheForTable(tableRef); conns.get().executeUnregisteredQuery( "DELETE FROM " + config.metadataTable().getQualifiedName() + " WHERE table_name = ?", tableRef.getQualifiedName()); }
private static DbKvs createOracle(ExecutorService executor, OracleDdlConfig oracleDdlConfig, SqlConnectionSupplier connections) { OracleTableNameGetter tableNameGetter = new OracleTableNameGetter(oracleDdlConfig); OraclePrefixedTableNames prefixedTableNames = new OraclePrefixedTableNames(tableNameGetter); TableValueStyleCache valueStyleCache = new TableValueStyleCache(); OverflowValueLoader overflowValueLoader = new OracleOverflowValueLoader(oracleDdlConfig, tableNameGetter); DbKvsGetRange getRange = new OracleGetRange( connections, overflowValueLoader, tableNameGetter, valueStyleCache, oracleDdlConfig); CellTsPairLoader cellTsPageLoader = new OracleCellTsPageLoader( connections, tableNameGetter, valueStyleCache, oracleDdlConfig); return new DbKvs( executor, oracleDdlConfig, new OracleDbTableFactory(oracleDdlConfig, tableNameGetter, prefixedTableNames, valueStyleCache, PTExecutors.newSingleThreadScheduledExecutor()), connections, new ImmediateSingleBatchTaskRunner(), overflowValueLoader, getRange, new DbKvsGetCandidateCellsForSweeping(cellTsPageLoader)); }
@Override public DbReadTable createRead(TableReference tableRef, ConnectionSupplier connectionSupplier) { TableValueStyle tableValueStyle = valueStyleCache.getTableType(connectionSupplier, tableRef, config.metadataTable()); String shortTableName = getTableName(connectionSupplier, tableRef); DbQueryFactory queryFactory = new OracleQueryFactory( config, shortTableName, tableValueStyle == TableValueStyle.OVERFLOW); return new DbReadTable(connectionSupplier, queryFactory); }
@Test public void testCacheInvalidatesOnlyOneTable() throws Exception { assertThat(valueStyleCache.getTableType( connectionSupplier, TEST_TABLE, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); assertThat( valueStyleCache.getTableType( connectionSupplier, TEST_TABLE_2, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); valueStyleCache.clearCacheForTable(TEST_TABLE); assertThat( valueStyleCache.getTableType( connectionSupplier, TEST_TABLE, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); verify(connectionSupplier, times(3)).get(); // No additional fetch required assertThat( valueStyleCache.getTableType( connectionSupplier, TEST_TABLE_2, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); verify(connectionSupplier, times(3)).get(); } }
private void clearTableSizeCacheAndDropTableMetadata() { valueStyleCache.clearCacheForTable(tableRef); conns.get().executeUnregisteredQuery( "DELETE FROM " + config.metadataTable().getQualifiedName() + " WHERE table_name = ?", tableRef.getQualifiedName()); }
@Test public void testCacheHandlesMultipleTableRequests() throws Exception { assertThat(valueStyleCache.getTableType( connectionSupplier, TEST_TABLE, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); assertThat( valueStyleCache.getTableType( connectionSupplier, TEST_TABLE_2, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); verify(connectionSupplier, times(2)).get(); }
@Test public void testGetTableSizeForSameTableHitsCache() throws Exception { assertThat(valueStyleCache.getTableType( connectionSupplier, TEST_TABLE, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); assertThat(valueStyleCache.getTableType( connectionSupplier, TEST_TABLE, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); verify(connectionSupplier, times(1)).get(); }
@Test public void testGetTableSizeOneTimeHasCacheMiss() throws Exception { assertThat(valueStyleCache.getTableType( connectionSupplier, TEST_TABLE, AtlasDbConstants.DEFAULT_METADATA_TABLE), is(TableValueStyle.OVERFLOW)); verify(connectionSupplier, times(1)).get(); }
@Override public DbWriteTable createWrite(TableReference tableRef, ConnectionSupplier conns) { TableValueStyle tableValueStyle = valueStyleCache.getTableType(conns, tableRef, config.metadataTable()); switch (tableValueStyle) { case OVERFLOW: return OracleOverflowWriteTable.create( config, conns, oracleTableNameGetter, oraclePrefixedTableNames, tableRef); case RAW: return new OracleWriteTable(config, conns, oraclePrefixedTableNames, tableRef); default: throw new EnumConstantNotPresentException(TableValueStyle.class, tableValueStyle.name()); } }
private void truncateOverflowTableIfItExists() { TableValueStyle tableValueStyle = valueStyleCache.getTableType(conns, tableRef, config.metadataTable()); if (tableValueStyle.equals(TableValueStyle.OVERFLOW) && config.overflowMigrationState() != OverflowMigrationState.UNSTARTED) { try { conns.get().executeUnregisteredQuery( "TRUNCATE TABLE " + oracleTableNameGetter.getInternalShortOverflowTableName(conns, tableRef)); } catch (TableMappingNotFoundException | RuntimeException e) { throw new IllegalStateException( String.format( "Truncate called on a table (%s) that was supposed to have an overflow table (%s)," + " but that overflow table appears to not exist", oracleTableNameGetter.getPrefixedTableName(tableRef), oracleTableNameGetter.getPrefixedOverflowTableName(tableRef)), e); } } }
@Override public void create(byte[] tableMetadata) { boolean needsOverflow = needsOverflow(tableMetadata); if (conns.get().selectExistsUnregisteredQuery( "SELECT 1 FROM " + config.metadataTable().getQualifiedName() + " WHERE table_name = ?", tableRef.getQualifiedName())) { if (needsOverflow) { TableValueStyle existingStyle = valueStyleCache.getTableType(conns, tableRef, config.metadataTable()); if (existingStyle != TableValueStyle.OVERFLOW) { throwForMissingOverflowTable(); } } return; } String shortTableName = createTable(needsOverflow); if (needsOverflow && !overflowColumnExists(shortTableName)) { throwForMissingOverflowTable(); } if (needsOverflow && config.overflowMigrationState() != OverflowMigrationState.UNSTARTED) { createOverflowTable(); } insertIgnoringConstraintViolation(needsOverflow, "INSERT INTO " + config.metadataTable().getQualifiedName() + " (table_name, table_size) VALUES (?, ?)" ); }
private boolean checkIfTableHasOverflowUsingNewConnection(TableReference tableRef) { try (ConnectionSupplier conns = new ConnectionSupplier(connectionPool)) { return valueStyleCache.getTableType(conns, tableRef, config.metadataTable()) == TableValueStyle.OVERFLOW; } }
private TableDetails getTableDetailsUsingNewConnection(TableReference tableRef) { try (ConnectionSupplier conns = new ConnectionSupplier(connectionPool)) { String shortName = tableNameGetter.getInternalShortTableName(conns, tableRef); TableValueStyle style = valueStyleCache.getTableType(conns, tableRef, config.metadataTable()); boolean hasOverflow = style == TableValueStyle.OVERFLOW; return new TableDetails(shortName, hasOverflow); } catch (TableMappingNotFoundException e) { throw new RuntimeException(e); } }
@Override public DbReadTable createRead(TableReference tableRef, ConnectionSupplier connectionSupplier) { TableValueStyle tableValueStyle = valueStyleCache.getTableType(connectionSupplier, tableRef, config.metadataTable()); String shortTableName = getTableName(connectionSupplier, tableRef); DbQueryFactory queryFactory = new OracleQueryFactory( config, shortTableName, tableValueStyle == TableValueStyle.OVERFLOW); return new DbReadTable(connectionSupplier, queryFactory); }
@Override public DbWriteTable createWrite(TableReference tableRef, ConnectionSupplier conns) { TableValueStyle tableValueStyle = valueStyleCache.getTableType(conns, tableRef, config.metadataTable()); switch (tableValueStyle) { case OVERFLOW: return OracleOverflowWriteTable.create( config, conns, oracleTableNameGetter, oraclePrefixedTableNames, tableRef); case RAW: return new OracleWriteTable(config, conns, oraclePrefixedTableNames, tableRef); default: throw new EnumConstantNotPresentException(TableValueStyle.class, tableValueStyle.name()); } }