@Test public void cfDefWithDifferingGcGraceSecondsValuesShouldNotMatch() { CfDef clientSideTable = ColumnFamilyDefinitions.getCfDef( "test_keyspace", TableReference.fromString("test_table"), CassandraConstants.DEFAULT_GC_GRACE_SECONDS, AtlasDbConstants.GENERIC_TABLE_METADATA); CfDef clusterSideTable = ColumnFamilyDefinitions.getCfDef( "test_keyspace", TableReference.fromString("test_table"), FOUR_DAYS_IN_SECONDS, AtlasDbConstants.GENERIC_TABLE_METADATA); assertFalse("ColumnDefinitions with different gc_grace_seconds should not match", ColumnFamilyDefinitions.isMatchingCf(clientSideTable, clusterSideTable)); }
@SuppressWarnings("CyclomaticComplexity") static boolean isMatchingCf(CfDef clientSide, CfDef clusterSide) { String tableName = clientSide.name; if (!equalsIgnoringClasspath(clientSide.compaction_strategy, clusterSide.compaction_strategy)) { logMismatch("compaction strategy", tableName, clientSide.compaction_strategy, if (!optionsMapsFunctionallyEqual( clientSide.compaction_strategy_options, clusterSide.compaction_strategy_options)) { logMismatch("compaction strategy options", tableName, clientSide.compaction_strategy_options, logMismatch("gc_grace_seconds period", tableName, clientSide.gc_grace_seconds, logMismatch("bloom filter false positive chance", tableName, clientSide.bloom_filter_fp_chance, logMismatch("compression chunk length", tableName, clientSide.compression_options.get(CassandraConstants.CFDEF_COMPRESSION_CHUNK_LENGTH_KEY), && !(clientSide.compaction_strategy.endsWith(clusterSide.compaction_strategy) || clusterSide.compaction_strategy.endsWith(clientSide.compaction_strategy))) { logMismatch("compaction strategy", tableName,
private static boolean equalsIgnoringClasspath(String class1, String class2) { if (class1 == class2) { return true; } if (class1 == null || class2 == null) { return false; } if (getLastElementOfClasspath(class1).equals(getLastElementOfClasspath(class2))) { return true; } return false; }
CfDef clientSideCf = getCfForTable(tableRef, clusterSideMetadata, config.gcGraceSeconds()); if (!ColumnFamilyDefinitions.isMatchingCf(clientSideCf, clusterSideCf)) {
@VisibleForTesting CfDef getCfForTable(TableReference tableRef, byte[] rawMetadata, int gcGraceSeconds) { return ColumnFamilyDefinitions .getCfDef(config.getKeyspaceOrThrow(), tableRef, gcGraceSeconds, rawMetadata); }
static CfDef getCfDef(String keyspace, TableReference tableRef, int gcGraceSeconds, byte[] rawMetadata) { Map<String, String> compressionOptions = Maps.newHashMap(); CfDef cf = getStandardCfDef(keyspace, AbstractKeyValueService.internalTableName(tableRef));
@Test public void testCfEqualityChecker() throws TException { CassandraKeyValueServiceImpl kvs; if (keyValueService instanceof CassandraKeyValueService) { kvs = (CassandraKeyValueServiceImpl) keyValueService; } else if (keyValueService instanceof TableSplittingKeyValueService) { // scylla tests KeyValueService delegate = ((TableSplittingKeyValueService) keyValueService).getDelegate(NEVER_SEEN); assertTrue("The nesting of Key Value Services has apparently changed", delegate instanceof CassandraKeyValueService); kvs = (CassandraKeyValueServiceImpl) delegate; } else { throw new IllegalArgumentException("Can't run this cassandra-specific test against a non-cassandra KVS"); } kvs.createTable(NEVER_SEEN, getMetadata()); List<CfDef> knownCfs = kvs.getClientPool().runWithRetry(client -> client.describe_keyspace(CASSANDRA.getConfig().getKeyspaceOrThrow()).getCf_defs()); CfDef clusterSideCf = Iterables.getOnlyElement(knownCfs.stream() .filter(cf -> cf.getName().equals(getInternalTestTableName())) .collect(Collectors.toList())); assertTrue("After serialization and deserialization to database, Cf metadata did not match.", ColumnFamilyDefinitions.isMatchingCf(kvs.getCfForTable(NEVER_SEEN, getMetadata(), FOUR_DAYS_IN_SECONDS), clusterSideCf)); }
@VisibleForTesting CfDef getCfForTable(TableReference tableRef, byte[] rawMetadata, int gcGraceSeconds) { return ColumnFamilyDefinitions .getCfDef(config.getKeyspaceOrThrow(), tableRef, gcGraceSeconds, rawMetadata); }
static CfDef getCfDef(String keyspace, TableReference tableRef, int gcGraceSeconds, byte[] rawMetadata) { Map<String, String> compressionOptions = Maps.newHashMap(); CfDef cf = getStandardCfDef(keyspace, AbstractKeyValueService.internalTableName(tableRef));
@Test public void nonDefaultFeaturesCorrectlyCompared() { CfDef cf1 = ColumnFamilyDefinitions.getCfDef( "test_keyspace", TableReference.fromString("test_table"), FOUR_DAYS_IN_SECONDS, TABLE_METADATA_WITH_MANY_NON_DEFAULT_FEATURES); CfDef cf2 = ColumnFamilyDefinitions.getCfDef( "test_keyspace", TableReference.fromString("test_table"), FOUR_DAYS_IN_SECONDS, TABLE_METADATA_WITH_MANY_NON_DEFAULT_FEATURES); assertTrue("identical CFs should equal each other", ColumnFamilyDefinitions.isMatchingCf(cf1, cf2)); }
@SuppressWarnings("CyclomaticComplexity") static boolean isMatchingCf(CfDef clientSide, CfDef clusterSide) { String tableName = clientSide.name; if (!equalsIgnoringClasspath(clientSide.compaction_strategy, clusterSide.compaction_strategy)) { logMismatch("compaction strategy", tableName, clientSide.compaction_strategy, if (!optionsMapsFunctionallyEqual( clientSide.compaction_strategy_options, clusterSide.compaction_strategy_options)) { logMismatch("compaction strategy options", tableName, clientSide.compaction_strategy_options, logMismatch("gc_grace_seconds period", tableName, clientSide.gc_grace_seconds, logMismatch("bloom filter false positive chance", tableName, clientSide.bloom_filter_fp_chance, logMismatch("compression chunk length", tableName, clientSide.compression_options.get(CassandraConstants.CFDEF_COMPRESSION_CHUNK_LENGTH_KEY), && !(clientSide.compaction_strategy.endsWith(clusterSide.compaction_strategy) || clusterSide.compaction_strategy.endsWith(clientSide.compaction_strategy))) { logMismatch("compaction strategy", tableName,
CfDef clientSideCf = getCfForTable(tableRef, clusterSideMetadata, config.gcGraceSeconds()); if (!ColumnFamilyDefinitions.isMatchingCf(clientSideCf, clusterSideCf)) {
private static boolean equalsIgnoringClasspath(String class1, String class2) { if (class1 == class2) { return true; } if (class1 == null || class2 == null) { return false; } if (getLastElementOfClasspath(class1).equals(getLastElementOfClasspath(class2))) { return true; } return false; }
@Test public void identicalCfsAreEqual() { CfDef cf1 = ColumnFamilyDefinitions.getCfDef( "test_keyspace", TableReference.fromString("test_table"), FOUR_DAYS_IN_SECONDS, AtlasDbConstants.GENERIC_TABLE_METADATA); CfDef cf2 = ColumnFamilyDefinitions.getCfDef( "test_keyspace", TableReference.fromString("test_table"), FOUR_DAYS_IN_SECONDS, AtlasDbConstants.GENERIC_TABLE_METADATA); assertTrue("identical CFs should equal each other", ColumnFamilyDefinitions.isMatchingCf(cf1, cf2)); } }
@Test public void compactionStrategiesShouldMatchWithOrWithoutPackageName() { CfDef standard = ColumnFamilyDefinitions.getCfDef( "test_keyspace", TableReference.fromString("test_table"), CassandraConstants.DEFAULT_GC_GRACE_SECONDS, new byte[0]); CfDef fullyQualified = standard.setCompaction_strategy("com.palantir.AwesomeCompactionStrategy"); CfDef onlyClassName = standard.deepCopy().setCompaction_strategy("AwesomeCompactionStrategy"); assertTrue( String.format("Compaction strategies %s and %s should match", fullyQualified.compaction_strategy, onlyClassName.compaction_strategy), ColumnFamilyDefinitions.isMatchingCf(fullyQualified, onlyClassName)); }