From 5c0a7689c6dff81ecb96100ea1194d3a4dd3268d Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Fri, 7 Nov 2025 10:18:22 +0900 Subject: [PATCH 1/4] Add validation for secondary indexes in table metadata --- ...AdminIntegrationTestWithObjectStorage.java | 9 ++++++ ...epairIntegrationTestWithObjectStorage.java | 28 +++++++++++++++++ ...geAdminCaseSensitivityIntegrationTest.java | 27 ++++++++++++++++ .../ObjectStorageAdminIntegrationTest.java | 27 ++++++++++++++++ ...jectStorageAdminRepairIntegrationTest.java | 28 +++++++++++++++++ ...AdminIntegrationTestWithObjectStorage.java | 9 ++++++ .../objectstorage/ObjectStorageAdmin.java | 17 ++++++++++ ...ibutedStorageAdminIntegrationTestBase.java | 9 ++++-- ...StorageAdminRepairIntegrationTestBase.java | 30 +++++++++--------- ...edTransactionAdminIntegrationTestBase.java | 31 ++++++++++++------- ...sactionAdminRepairIntegrationTestBase.java | 8 ++--- 11 files changed, 190 insertions(+), 33 deletions(-) diff --git a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ConsensusCommitAdminIntegrationTestWithObjectStorage.java b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ConsensusCommitAdminIntegrationTestWithObjectStorage.java index 5c25c0c1fe..9d6e46bb21 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ConsensusCommitAdminIntegrationTestWithObjectStorage.java +++ b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ConsensusCommitAdminIntegrationTestWithObjectStorage.java @@ -1,5 +1,6 @@ package com.scalar.db.storage.objectstorage; +import com.scalar.db.api.TableMetadata; import com.scalar.db.transaction.consensuscommit.ConsensusCommitAdminIntegrationTestBase; import com.scalar.db.util.AdminTestUtils; import java.util.Properties; @@ -13,6 +14,14 @@ protected Properties getProps(String testName) { return ObjectStorageEnv.getProperties(testName); } + @Override + protected TableMetadata getTableMetadata() { + return TableMetadata.newBuilder(TABLE_METADATA) + .removeSecondaryIndex(COL_NAME5) + .removeSecondaryIndex(COL_NAME6) + .build(); + } + @Override protected AdminTestUtils getAdminTestUtils(String testName) { return new ObjectStorageAdminTestUtils(getProperties(testName)); diff --git a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ConsensusCommitAdminRepairIntegrationTestWithObjectStorage.java b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ConsensusCommitAdminRepairIntegrationTestWithObjectStorage.java index 436a566dbb..2f52922db2 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ConsensusCommitAdminRepairIntegrationTestWithObjectStorage.java +++ b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ConsensusCommitAdminRepairIntegrationTestWithObjectStorage.java @@ -1,11 +1,39 @@ package com.scalar.db.storage.objectstorage; +import com.scalar.db.api.Scan; +import com.scalar.db.api.TableMetadata; +import com.scalar.db.io.DataType; import com.scalar.db.transaction.consensuscommit.ConsensusCommitAdminRepairIntegrationTestBase; import java.util.Properties; public class ConsensusCommitAdminRepairIntegrationTestWithObjectStorage extends ConsensusCommitAdminRepairIntegrationTestBase { + @Override + protected TableMetadata getTableMetadata() { + return TableMetadata.newBuilder() + .addColumn(COL_NAME1, DataType.INT) + .addColumn(COL_NAME2, DataType.TEXT) + .addColumn(COL_NAME3, DataType.TEXT) + .addColumn(COL_NAME4, DataType.INT) + .addColumn(COL_NAME5, DataType.INT) + .addColumn(COL_NAME6, DataType.TEXT) + .addColumn(COL_NAME7, DataType.BIGINT) + .addColumn(COL_NAME8, DataType.FLOAT) + .addColumn(COL_NAME9, DataType.DOUBLE) + .addColumn(COL_NAME10, DataType.BOOLEAN) + .addColumn(COL_NAME11, DataType.BLOB) + .addColumn(COL_NAME12, DataType.DATE) + .addColumn(COL_NAME13, DataType.TIME) + .addColumn(COL_NAME14, DataType.TIMESTAMPTZ) + .addColumn(COL_NAME15, DataType.TIMESTAMP) + .addPartitionKey(COL_NAME2) + .addPartitionKey(COL_NAME1) + .addClusteringKey(COL_NAME4, Scan.Ordering.Order.ASC) + .addClusteringKey(COL_NAME3, Scan.Ordering.Order.DESC) + .build(); + } + @Override protected Properties getProps(String testName) { return ObjectStorageEnv.getProperties(testName); diff --git a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminCaseSensitivityIntegrationTest.java b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminCaseSensitivityIntegrationTest.java index b8710a054d..a23fd9e52e 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminCaseSensitivityIntegrationTest.java +++ b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminCaseSensitivityIntegrationTest.java @@ -1,6 +1,9 @@ package com.scalar.db.storage.objectstorage; import com.scalar.db.api.DistributedStorageAdminCaseSensitivityIntegrationTestBase; +import com.scalar.db.api.Scan; +import com.scalar.db.api.TableMetadata; +import com.scalar.db.io.DataType; import com.scalar.db.util.AdminTestUtils; import java.util.Map; import java.util.Properties; @@ -14,6 +17,30 @@ protected Properties getProperties(String testName) { return ObjectStorageEnv.getProperties(testName); } + @Override + protected TableMetadata getTableMetadata() { + return TableMetadata.newBuilder() + .addColumn(getColumnName1(), DataType.INT) + .addColumn(getColumnName2(), DataType.TEXT) + .addColumn(getColumnName3(), DataType.TEXT) + .addColumn(getColumnName4(), DataType.INT) + .addColumn(getColumnName5(), DataType.INT) + .addColumn(getColumnName6(), DataType.TEXT) + .addColumn(getColumnName7(), DataType.BIGINT) + .addColumn(getColumnName8(), DataType.FLOAT) + .addColumn(getColumnName9(), DataType.DOUBLE) + .addColumn(getColumnName10(), DataType.BOOLEAN) + .addColumn(getColumnName11(), DataType.BLOB) + .addColumn(getColumnName12(), DataType.DATE) + .addColumn(getColumnName13(), DataType.TIME) + .addColumn(getColumnName14(), DataType.TIMESTAMPTZ) + .addPartitionKey(getColumnName2()) + .addPartitionKey(getColumnName1()) + .addClusteringKey(getColumnName4(), Scan.Ordering.Order.ASC) + .addClusteringKey(getColumnName3(), Scan.Ordering.Order.DESC) + .build(); + } + @Override protected Map getCreationOptions() { return ObjectStorageEnv.getCreationOptions(); diff --git a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminIntegrationTest.java b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminIntegrationTest.java index 9c10eb9fbf..8030c9d1a0 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminIntegrationTest.java +++ b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminIntegrationTest.java @@ -1,6 +1,9 @@ package com.scalar.db.storage.objectstorage; import com.scalar.db.api.DistributedStorageAdminIntegrationTestBase; +import com.scalar.db.api.Scan; +import com.scalar.db.api.TableMetadata; +import com.scalar.db.io.DataType; import com.scalar.db.util.AdminTestUtils; import java.util.Properties; import org.junit.jupiter.api.Disabled; @@ -12,6 +15,30 @@ protected Properties getProperties(String testName) { return ObjectStorageEnv.getProperties(testName); } + @Override + protected TableMetadata getTableMetadata() { + return TableMetadata.newBuilder() + .addColumn(getColumnName1(), DataType.INT) + .addColumn(getColumnName2(), DataType.TEXT) + .addColumn(getColumnName3(), DataType.TEXT) + .addColumn(getColumnName4(), DataType.INT) + .addColumn(getColumnName5(), DataType.INT) + .addColumn(getColumnName6(), DataType.TEXT) + .addColumn(getColumnName7(), DataType.BIGINT) + .addColumn(getColumnName8(), DataType.FLOAT) + .addColumn(getColumnName9(), DataType.DOUBLE) + .addColumn(getColumnName10(), DataType.BOOLEAN) + .addColumn(getColumnName11(), DataType.BLOB) + .addColumn(getColumnName12(), DataType.DATE) + .addColumn(getColumnName13(), DataType.TIME) + .addColumn(getColumnName14(), DataType.TIMESTAMPTZ) + .addPartitionKey(getColumnName2()) + .addPartitionKey(getColumnName1()) + .addClusteringKey(getColumnName4(), Scan.Ordering.Order.ASC) + .addClusteringKey(getColumnName3(), Scan.Ordering.Order.DESC) + .build(); + } + @Override protected boolean isIndexOnBooleanColumnSupported() { return false; diff --git a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminRepairIntegrationTest.java b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminRepairIntegrationTest.java index 8266848d4e..457df8daac 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminRepairIntegrationTest.java +++ b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/ObjectStorageAdminRepairIntegrationTest.java @@ -1,12 +1,40 @@ package com.scalar.db.storage.objectstorage; import com.scalar.db.api.DistributedStorageAdminRepairIntegrationTestBase; +import com.scalar.db.api.Scan; +import com.scalar.db.api.TableMetadata; +import com.scalar.db.io.DataType; import java.util.Properties; import org.junit.jupiter.api.Disabled; public class ObjectStorageAdminRepairIntegrationTest extends DistributedStorageAdminRepairIntegrationTestBase { + @Override + protected TableMetadata getTableMetadata() { + return TableMetadata.newBuilder() + .addColumn(COL_NAME1, DataType.INT) + .addColumn(COL_NAME2, DataType.TEXT) + .addColumn(COL_NAME3, DataType.TEXT) + .addColumn(COL_NAME4, DataType.INT) + .addColumn(COL_NAME5, DataType.INT) + .addColumn(COL_NAME6, DataType.TEXT) + .addColumn(COL_NAME7, DataType.BIGINT) + .addColumn(COL_NAME8, DataType.FLOAT) + .addColumn(COL_NAME9, DataType.DOUBLE) + .addColumn(COL_NAME10, DataType.BOOLEAN) + .addColumn(COL_NAME11, DataType.BLOB) + .addColumn(COL_NAME12, DataType.DATE) + .addColumn(COL_NAME13, DataType.TIME) + .addColumn(COL_NAME14, DataType.TIMESTAMPTZ) + .addColumn(COL_NAME15, DataType.TIMESTAMP) + .addPartitionKey(COL_NAME2) + .addPartitionKey(COL_NAME1) + .addClusteringKey(COL_NAME4, Scan.Ordering.Order.ASC) + .addClusteringKey(COL_NAME3, Scan.Ordering.Order.DESC) + .build(); + } + @Override protected Properties getProperties(String testName) { return ObjectStorageEnv.getProperties(testName); diff --git a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/SingleCrudOperationTransactionAdminIntegrationTestWithObjectStorage.java b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/SingleCrudOperationTransactionAdminIntegrationTestWithObjectStorage.java index 9d7c946b5e..f4b270b36a 100644 --- a/core/src/integration-test/java/com/scalar/db/storage/objectstorage/SingleCrudOperationTransactionAdminIntegrationTestWithObjectStorage.java +++ b/core/src/integration-test/java/com/scalar/db/storage/objectstorage/SingleCrudOperationTransactionAdminIntegrationTestWithObjectStorage.java @@ -1,5 +1,6 @@ package com.scalar.db.storage.objectstorage; +import com.scalar.db.api.TableMetadata; import com.scalar.db.transaction.singlecrudoperation.SingleCrudOperationTransactionAdminIntegrationTestBase; import java.util.Properties; import org.junit.jupiter.api.Disabled; @@ -12,6 +13,14 @@ protected Properties getProps(String testName) { return ObjectStorageEnv.getProperties(testName); } + @Override + protected TableMetadata getTableMetadata() { + return TableMetadata.newBuilder(TABLE_METADATA) + .removeSecondaryIndex(COL_NAME5) + .removeSecondaryIndex(COL_NAME6) + .build(); + } + @Override @Disabled("Temporarily disabled because it includes DML operations") public void truncateTable_ShouldTruncateProperly() {} diff --git a/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java b/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java index e918e3c52e..cac1d5f7a0 100644 --- a/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java +++ b/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java @@ -87,6 +87,7 @@ public void createTable( String namespace, String table, TableMetadata metadata, Map options) throws ExecutionException { try { + checkMetadata(metadata); // Insert the table metadata String tableMetadataKey = getTableMetadataKey(namespace, table); Map readVersionMap = new HashMap<>(); @@ -268,6 +269,7 @@ public void repairTable( String namespace, String table, TableMetadata metadata, Map options) throws ExecutionException { try { + checkMetadata(metadata); // Upsert the table metadata String tableMetadataKey = getTableMetadataKey(namespace, table); Map readVersionMap = new HashMap<>(); @@ -470,4 +472,19 @@ private static String getTableNameFromTableMetadataKey(String tableMetadataKey) } return parts.get(1); } + + private void checkMetadata(TableMetadata metadata) { + for (String clusteringKeyName : metadata.getClusteringKeyNames()) { + if (metadata.getColumnDataType(clusteringKeyName) == DataType.BLOB) { + throw new IllegalArgumentException( + CoreError.COSMOS_CLUSTERING_KEY_BLOB_TYPE_NOT_SUPPORTED.buildMessage( + clusteringKeyName)); + } + } + Set secondaryIndexNames = metadata.getSecondaryIndexNames(); + if (!secondaryIndexNames.isEmpty()) { + throw new IllegalArgumentException( + CoreError.OBJECT_STORAGE_INDEX_NOT_SUPPORTED.buildMessage()); + } + } } diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java index 451746621b..806f3d0022 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java @@ -330,9 +330,12 @@ public void getTableMetadata_CorrectTableGiven_ShouldReturnCorrectMetadata() assertThat(tableMetadata.getClusteringOrder(getColumnName14())).isNull(); assertThat(tableMetadata.getClusteringOrder(getColumnName15())).isNull(); - assertThat(tableMetadata.getSecondaryIndexNames().size()).isEqualTo(2); - assertThat(tableMetadata.getSecondaryIndexNames().contains(getColumnName5())).isTrue(); - assertThat(tableMetadata.getSecondaryIndexNames().contains(getColumnName6())).isTrue(); + Set expectedSecondaryIndexNames = getTableMetadata().getSecondaryIndexNames(); + assertThat(tableMetadata.getSecondaryIndexNames().size()) + .isEqualTo(expectedSecondaryIndexNames.size()); + for (String indexName : expectedSecondaryIndexNames) { + assertThat(tableMetadata.getSecondaryIndexNames().contains(indexName)).isTrue(); + } } @Test diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminRepairIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminRepairIntegrationTestBase.java index cff7fdeadb..5af97d72be 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminRepairIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminRepairIntegrationTestBase.java @@ -27,21 +27,21 @@ public abstract class DistributedStorageAdminRepairIntegrationTestBase { private static final String TEST_NAME = "storage_admin_repair"; private static final String NAMESPACE = "int_test_" + TEST_NAME; private static final String TABLE = "test_table"; - private static final String COL_NAME1 = "c1"; - private static final String COL_NAME2 = "c2"; - private static final String COL_NAME3 = "c3"; - private static final String COL_NAME4 = "c4"; - private static final String COL_NAME5 = "c5"; - private static final String COL_NAME6 = "c6"; - private static final String COL_NAME7 = "c7"; - private static final String COL_NAME8 = "c8"; - private static final String COL_NAME9 = "c9"; - private static final String COL_NAME10 = "c10"; - private static final String COL_NAME11 = "c11"; - private static final String COL_NAME12 = "c12"; - private static final String COL_NAME13 = "c13"; - private static final String COL_NAME14 = "c14"; - private static final String COL_NAME15 = "c15"; + protected static final String COL_NAME1 = "c1"; + protected static final String COL_NAME2 = "c2"; + protected static final String COL_NAME3 = "c3"; + protected static final String COL_NAME4 = "c4"; + protected static final String COL_NAME5 = "c5"; + protected static final String COL_NAME6 = "c6"; + protected static final String COL_NAME7 = "c7"; + protected static final String COL_NAME8 = "c8"; + protected static final String COL_NAME9 = "c9"; + protected static final String COL_NAME10 = "c10"; + protected static final String COL_NAME11 = "c11"; + protected static final String COL_NAME12 = "c12"; + protected static final String COL_NAME13 = "c13"; + protected static final String COL_NAME14 = "c14"; + protected static final String COL_NAME15 = "c15"; protected DistributedStorageAdmin admin; diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java index e72933170e..0ffffe4eed 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java @@ -112,6 +112,10 @@ protected void initialize(String testName) throws Exception {} protected abstract Properties getProperties(String testName); + protected TableMetadata getTableMetadata() { + return TABLE_METADATA; + } + protected String getNamespaceBaseName() { return NAMESPACE_BASE_NAME; } @@ -121,7 +125,7 @@ private void createTables() throws ExecutionException { for (String namespace : Arrays.asList(namespace1, namespace2)) { admin.createNamespace(namespace, true, options); for (String table : Arrays.asList(TABLE1, TABLE2, TABLE3)) { - admin.createTable(namespace, table, TABLE_METADATA, true, options); + admin.createTable(namespace, table, getTableMetadata(), true, options); } } admin.createCoordinatorTables(true, options); @@ -241,9 +245,12 @@ public void getTableMetadata_CorrectTableGiven_ShouldReturnCorrectMetadata() assertThat(tableMetadata.getClusteringOrder(COL_NAME14)).isNull(); assertThat(tableMetadata.getClusteringOrder(COL_NAME15)).isNull(); - assertThat(tableMetadata.getSecondaryIndexNames().size()).isEqualTo(2); - assertThat(tableMetadata.getSecondaryIndexNames().contains(COL_NAME5)).isTrue(); - assertThat(tableMetadata.getSecondaryIndexNames().contains(COL_NAME6)).isTrue(); + Set expectedSecondaryIndexNames = getTableMetadata().getSecondaryIndexNames(); + assertThat(tableMetadata.getSecondaryIndexNames().size()) + .isEqualTo(expectedSecondaryIndexNames.size()); + for (String indexName : expectedSecondaryIndexNames) { + assertThat(tableMetadata.getSecondaryIndexNames().contains(indexName)).isTrue(); + } } @Test @@ -323,7 +330,7 @@ public void dropNamespace_ForNonEmptyNamespace_ShouldThrowIllegalArgumentExcepti try { // Arrange admin.createNamespace(namespace3, getCreationOptions()); - admin.createTable(namespace3, TABLE1, TABLE_METADATA, getCreationOptions()); + admin.createTable(namespace3, TABLE1, getTableMetadata(), getCreationOptions()); // Act Assert assertThatThrownBy(() -> admin.dropNamespace(namespace3)) @@ -350,7 +357,7 @@ public void createTable_ForNonExistingTable_ShouldCreateTableProperly() Map options = getCreationOptions(); // Act - admin.createTable(namespace1, TABLE4, TABLE_METADATA, options); + admin.createTable(namespace1, TABLE4, getTableMetadata(), options); // Assert assertThat(admin.tableExists(namespace1, TABLE4)).isTrue(); @@ -365,7 +372,7 @@ public void createTable_ForExistingTable_ShouldThrowIllegalArgumentException() { // Act Assert assertThatThrownBy( - () -> admin.createTable(namespace1, TABLE1, TABLE_METADATA, getCreationOptions())) + () -> admin.createTable(namespace1, TABLE1, getTableMetadata(), getCreationOptions())) .isInstanceOf(IllegalArgumentException.class); } @@ -375,7 +382,7 @@ public void createTable_ForNonExistingNamespace_ShouldThrowIllegalArgumentExcept // Act Assert assertThatThrownBy( - () -> admin.createTable(namespace3, TABLE1, TABLE_METADATA, getCreationOptions())) + () -> admin.createTable(namespace3, TABLE1, getTableMetadata(), getCreationOptions())) .isInstanceOf(IllegalArgumentException.class); } @@ -385,7 +392,9 @@ public void createTable_IfNotExists_ForExistingNamespace_ShouldNotThrowAnyExcept // Act Assert assertThatCode( - () -> admin.createTable(namespace1, TABLE1, TABLE_METADATA, true, getCreationOptions())) + () -> + admin.createTable( + namespace1, TABLE1, getTableMetadata(), true, getCreationOptions())) .doesNotThrowAnyException(); } @@ -394,7 +403,7 @@ public void dropTable_ForExistingTable_ShouldDropTableProperly() throws Executio try { // Arrange Map options = getCreationOptions(); - admin.createTable(namespace1, TABLE4, TABLE_METADATA, options); + admin.createTable(namespace1, TABLE4, getTableMetadata(), options); // Act admin.dropTable(namespace1, TABLE4); @@ -433,7 +442,7 @@ public void truncateTable_ShouldTruncateProperly() try { // Arrange Map options = getCreationOptions(); - admin.createTable(namespace1, table, TABLE_METADATA, true, options); + admin.createTable(namespace1, table, getTableMetadata(), true, options); Key partitionKey = Key.of(COL_NAME2, "aaa", COL_NAME1, 1); Key clusteringKey = Key.of(COL_NAME4, 2, COL_NAME3, "bbb"); transactionalInsert( diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminRepairIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminRepairIntegrationTestBase.java index 637bb4d497..20e9e2eeee 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminRepairIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminRepairIntegrationTestBase.java @@ -42,10 +42,10 @@ public abstract class DistributedTransactionAdminRepairIntegrationTestBase { protected static final String COL_NAME9 = "c9"; protected static final String COL_NAME10 = "c10"; protected static final String COL_NAME11 = "c11"; - private static final String COL_NAME12 = "c12"; - private static final String COL_NAME13 = "c13"; - private static final String COL_NAME14 = "c14"; - private static final String COL_NAME15 = "c15"; + protected static final String COL_NAME12 = "c12"; + protected static final String COL_NAME13 = "c13"; + protected static final String COL_NAME14 = "c14"; + protected static final String COL_NAME15 = "c15"; protected DistributedTransactionAdmin admin; protected DistributedStorageAdmin storageAdmin; From 3c55b6531631fab314ec5fb11d1c369471b593fa Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Fri, 7 Nov 2025 10:35:15 +0900 Subject: [PATCH 2/4] Fix --- core/src/main/java/com/scalar/db/common/CoreError.java | 6 ++++++ .../scalar/db/storage/objectstorage/ObjectStorageAdmin.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/scalar/db/common/CoreError.java b/core/src/main/java/com/scalar/db/common/CoreError.java index fa097bad68..a7a1f4928a 100644 --- a/core/src/main/java/com/scalar/db/common/CoreError.java +++ b/core/src/main/java/com/scalar/db/common/CoreError.java @@ -889,6 +889,12 @@ public enum CoreError implements ScalarDbError { "Object Storage does not support the feature for altering column types", "", ""), + OBJECT_STORAGE_CLUSTERING_KEY_BLOB_TYPE_NOT_SUPPORTED( + Category.USER_ERROR, + "0256", + "The BLOB type is not supported for clustering keys in Object Storage. Column: %s", + "", + ""), // // Errors for the concurrency error category diff --git a/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java b/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java index cac1d5f7a0..08494a385f 100644 --- a/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java +++ b/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java @@ -477,7 +477,7 @@ private void checkMetadata(TableMetadata metadata) { for (String clusteringKeyName : metadata.getClusteringKeyNames()) { if (metadata.getColumnDataType(clusteringKeyName) == DataType.BLOB) { throw new IllegalArgumentException( - CoreError.COSMOS_CLUSTERING_KEY_BLOB_TYPE_NOT_SUPPORTED.buildMessage( + CoreError.OBJECT_STORAGE_CLUSTERING_KEY_BLOB_TYPE_NOT_SUPPORTED.buildMessage( clusteringKeyName)); } } From ff0ac329ae6351373eb744bfc080c994b10ff0ba Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Fri, 7 Nov 2025 11:18:41 +0900 Subject: [PATCH 3/4] Fix --- .../main/java/com/scalar/db/common/CoreError.java | 6 ------ .../storage/objectstorage/ObjectStorageAdmin.java | 13 +++---------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/com/scalar/db/common/CoreError.java b/core/src/main/java/com/scalar/db/common/CoreError.java index a7a1f4928a..fa097bad68 100644 --- a/core/src/main/java/com/scalar/db/common/CoreError.java +++ b/core/src/main/java/com/scalar/db/common/CoreError.java @@ -889,12 +889,6 @@ public enum CoreError implements ScalarDbError { "Object Storage does not support the feature for altering column types", "", ""), - OBJECT_STORAGE_CLUSTERING_KEY_BLOB_TYPE_NOT_SUPPORTED( - Category.USER_ERROR, - "0256", - "The BLOB type is not supported for clustering keys in Object Storage. Column: %s", - "", - ""), // // Errors for the concurrency error category diff --git a/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java b/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java index 08494a385f..0f887bfe89 100644 --- a/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java +++ b/core/src/main/java/com/scalar/db/storage/objectstorage/ObjectStorageAdmin.java @@ -87,7 +87,7 @@ public void createTable( String namespace, String table, TableMetadata metadata, Map options) throws ExecutionException { try { - checkMetadata(metadata); + checkTableMetadata(metadata); // Insert the table metadata String tableMetadataKey = getTableMetadataKey(namespace, table); Map readVersionMap = new HashMap<>(); @@ -269,7 +269,7 @@ public void repairTable( String namespace, String table, TableMetadata metadata, Map options) throws ExecutionException { try { - checkMetadata(metadata); + checkTableMetadata(metadata); // Upsert the table metadata String tableMetadataKey = getTableMetadataKey(namespace, table); Map readVersionMap = new HashMap<>(); @@ -473,14 +473,7 @@ private static String getTableNameFromTableMetadataKey(String tableMetadataKey) return parts.get(1); } - private void checkMetadata(TableMetadata metadata) { - for (String clusteringKeyName : metadata.getClusteringKeyNames()) { - if (metadata.getColumnDataType(clusteringKeyName) == DataType.BLOB) { - throw new IllegalArgumentException( - CoreError.OBJECT_STORAGE_CLUSTERING_KEY_BLOB_TYPE_NOT_SUPPORTED.buildMessage( - clusteringKeyName)); - } - } + private void checkTableMetadata(TableMetadata metadata) { Set secondaryIndexNames = metadata.getSecondaryIndexNames(); if (!secondaryIndexNames.isEmpty()) { throw new IllegalArgumentException( From 73164dfebb99305303ab0cbb92030ca0879d7e03 Mon Sep 17 00:00:00 2001 From: Kodai Doki Date: Fri, 7 Nov 2025 11:27:45 +0900 Subject: [PATCH 4/4] Apply suggestions --- .../db/api/DistributedStorageAdminIntegrationTestBase.java | 7 ++----- .../DistributedTransactionAdminIntegrationTestBase.java | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java index 806f3d0022..64c746c2bf 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedStorageAdminIntegrationTestBase.java @@ -331,11 +331,8 @@ public void getTableMetadata_CorrectTableGiven_ShouldReturnCorrectMetadata() assertThat(tableMetadata.getClusteringOrder(getColumnName15())).isNull(); Set expectedSecondaryIndexNames = getTableMetadata().getSecondaryIndexNames(); - assertThat(tableMetadata.getSecondaryIndexNames().size()) - .isEqualTo(expectedSecondaryIndexNames.size()); - for (String indexName : expectedSecondaryIndexNames) { - assertThat(tableMetadata.getSecondaryIndexNames().contains(indexName)).isTrue(); - } + assertThat(tableMetadata.getSecondaryIndexNames()) + .containsExactlyInAnyOrderElementsOf(expectedSecondaryIndexNames); } @Test diff --git a/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java b/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java index 0ffffe4eed..f91bd7dc37 100644 --- a/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java +++ b/integration-test/src/main/java/com/scalar/db/api/DistributedTransactionAdminIntegrationTestBase.java @@ -246,11 +246,8 @@ public void getTableMetadata_CorrectTableGiven_ShouldReturnCorrectMetadata() assertThat(tableMetadata.getClusteringOrder(COL_NAME15)).isNull(); Set expectedSecondaryIndexNames = getTableMetadata().getSecondaryIndexNames(); - assertThat(tableMetadata.getSecondaryIndexNames().size()) - .isEqualTo(expectedSecondaryIndexNames.size()); - for (String indexName : expectedSecondaryIndexNames) { - assertThat(tableMetadata.getSecondaryIndexNames().contains(indexName)).isTrue(); - } + assertThat(tableMetadata.getSecondaryIndexNames()) + .containsExactlyInAnyOrderElementsOf(expectedSecondaryIndexNames); } @Test