diff --git a/test/src/unit-capi-consolidation.cc b/test/src/unit-capi-consolidation.cc index 36e7d485050..ee4d186b6dc 100644 --- a/test/src/unit-capi-consolidation.cc +++ b/test/src/unit-capi-consolidation.cc @@ -7895,3 +7895,48 @@ TEST_CASE_METHOD( remove_sparse_array(); } } + +TEST_CASE_METHOD( + ConsolidationFx, + "C API: Test consolidating empty array metadata", + "[capi][consolidation][array-meta][empty][sc-62900][non-rest]") { + remove_dense_array(); + create_dense_array(); + + SECTION("Consolidate empty array metadata") { + // Configuration for consolidating array metadata + tiledb_config_t* config = nullptr; + tiledb_error_t* error = nullptr; + REQUIRE(tiledb_config_alloc(&config, &error) == TILEDB_OK); + REQUIRE(error == nullptr); + int rc = tiledb_config_set( + config, "sm.consolidation.mode", "array_meta", &error); + REQUIRE(rc == TILEDB_OK); + REQUIRE(error == nullptr); + + // Consolidate without having added any array meta + rc = tiledb_array_consolidate(ctx_, dense_array_uri_.c_str(), config); + CHECK(rc == TILEDB_OK); + + // We must have 0 vacuum files after consolidation. + std::vector array_meta_vac_files; + get_array_meta_vac_files_dense(array_meta_vac_files); + CHECK(array_meta_vac_files.size() == 0); + + tiledb_array_t* array; + rc = tiledb_array_alloc(ctx_, dense_array_uri_.c_str(), &array); + REQUIRE(rc == TILEDB_OK); + + // Open for Delete, so that array metadata are loaded from disk, and check + // there is no failure + rc = tiledb_array_open(ctx_, array, TILEDB_DELETE); + REQUIRE(rc == TILEDB_OK); + + // Vacuum consolidated array metadata (empty) and check there is no failure + rc = tiledb_config_set(config, "sm.vacuum.mode", "array_meta", &error); + REQUIRE(rc == TILEDB_OK); + REQUIRE(error == nullptr); + rc = tiledb_array_vacuum(ctx_, dense_array_uri_.c_str(), config); + CHECK(rc == TILEDB_OK); + } +} diff --git a/test/src/unit-capi-group.cc b/test/src/unit-capi-group.cc index 52f82e89082..e0001af07ea 100644 --- a/test/src/unit-capi-group.cc +++ b/test/src/unit-capi-group.cc @@ -1083,6 +1083,19 @@ TEST_CASE_METHOD( tiledb::sm::URI group_uri(temp_dir + "group"); REQUIRE(tiledb_group_create(ctx_, group_uri.c_str()) == TILEDB_OK); + // Consolidate empty metadata + tiledb_config_t* cfg; + tiledb_error_t* err = nullptr; + REQUIRE(tiledb_config_alloc(&cfg, &err) == TILEDB_OK); + int rc = tiledb_group_consolidate_metadata(ctx_, group_uri.c_str(), cfg); + REQUIRE(rc == TILEDB_OK); + + // Check no .vac file is created + std::vector group_empty_meta_vac_files; + get_meta_vac_files(group_uri, group_empty_meta_vac_files); + CHECK(group_empty_meta_vac_files.size() == 0); + tiledb_config_free(&cfg); + write_group_metadata(group_uri.c_str()); std::this_thread::sleep_for(std::chrono::milliseconds(1)); auto start = tiledb::sm::utils::time::timestamp_now_ms(); @@ -1100,7 +1113,7 @@ TEST_CASE_METHOD( CHECK(group_meta_files.size() == 4); uint64_t file_size = 0; - int rc = tiledb_vfs_file_size( + rc = tiledb_vfs_file_size( ctx_, vfs_, group_meta_vac_files[0].c_str(), &file_size); REQUIRE(rc == TILEDB_OK); diff --git a/tiledb/sm/consolidator/array_meta_consolidator.cc b/tiledb/sm/consolidator/array_meta_consolidator.cc index 0608227adcc..35456729da4 100644 --- a/tiledb/sm/consolidator/array_meta_consolidator.cc +++ b/tiledb/sm/consolidator/array_meta_consolidator.cc @@ -80,6 +80,12 @@ Status ArrayMetaConsolidator::consolidate( encryption_key, key_length)); + // Check if there's actually more than 1 file to consolidate + auto& metadata_r = array_for_reads.metadata(); + if (metadata_r.loaded_metadata_uris().size() <= 1) { + return Status::Ok(); + } + // Open array for writing Array array_for_writes(resources_, array_uri); RETURN_NOT_OK_ELSE( @@ -88,7 +94,6 @@ Status ArrayMetaConsolidator::consolidate( throw_if_not_ok(array_for_reads.close())); // Copy-assign the read metadata into the metadata of the array for writes - auto& metadata_r = array_for_reads.metadata(); array_for_writes.opened_array()->metadata() = metadata_r; URI new_uri = metadata_r.get_uri(array_uri); const auto& to_vacuum = metadata_r.loaded_metadata_uris(); diff --git a/tiledb/sm/consolidator/group_meta_consolidator.cc b/tiledb/sm/consolidator/group_meta_consolidator.cc index d534e1e89fe..625d5a0361c 100644 --- a/tiledb/sm/consolidator/group_meta_consolidator.cc +++ b/tiledb/sm/consolidator/group_meta_consolidator.cc @@ -83,8 +83,13 @@ Status GroupMetaConsolidator::consolidate( group_for_reads.close(); } - // Copy-assign the read metadata into the metadata of the group for writes + // Check if there's actually more than 1 file to consolidate auto metadata_r = group_for_reads.metadata(); + if (metadata_r->loaded_metadata_uris().size() <= 1) { + return Status::Ok(); + } + + // Copy-assign the read metadata into the metadata of the group for writes *(group_for_writes.metadata()) = *metadata_r; URI new_uri = metadata_r->get_uri(group_uri); const auto& to_vacuum = metadata_r->loaded_metadata_uris();