/* * Copyright (C) 2021-present ScyllaDB */ /* * SPDX-License-Identifier: AGPL-3.0-or-later */ #include "test/lib/scylla_test_case.hh" #include "sstables/sstable_set_impl.hh" #include "sstables/shared_sstable.hh" #include "sstables/sstable_set.hh" #include "sstables/sstables.hh" #include "test/lib/simple_schema.hh" #include "test/lib/sstable_utils.hh" #include "readers/from_mutations_v2.hh" using namespace sstables; static sstables::sstable_set make_sstable_set(schema_ptr schema, lw_shared_ptr all = {}, bool use_level_metadata = true) { auto ret = sstables::sstable_set(std::make_unique(schema, use_level_metadata)); for (auto& sst : *all) { ret.insert(sst); } return ret; } SEASTAR_TEST_CASE(test_sstables_sstable_set_read_modify_write) { return test_env::do_with_async([] (test_env& env) { simple_schema ss; auto s = ss.schema(); auto pk = tests::generate_partition_key(s); auto mut = mutation(s, pk); ss.add_row(mut, ss.make_ckey(0), "val"); auto mr = make_flat_mutation_reader_from_mutations_v2(s, env.make_reader_permit(), mut); sstable_writer_config cfg = env.manager().configure_writer(""); auto sst1 = make_sstable_easy(env, std::move(mr), cfg); auto ss1 = make_lw_shared(make_sstable_set(ss.schema(), make_lw_shared({sst1}))); BOOST_REQUIRE_EQUAL(ss1->all()->size(), 1); // Test that a random sstable_origin is stored and retrieved properly. mr = make_flat_mutation_reader_from_mutations_v2(s, env.make_reader_permit(), mut); auto sst2 = make_sstable_easy(env, std::move(mr), cfg); auto ss2 = make_lw_shared(*ss1); ss2->insert(sst2); BOOST_REQUIRE_EQUAL(ss2->all()->size(), 2); BOOST_REQUIRE_EQUAL(ss1->all()->size(), 1); }); } SEASTAR_TEST_CASE(test_time_series_sstable_set_read_modify_write) { return test_env::do_with_async([] (test_env& env) { simple_schema ss; auto s = ss.schema(); auto pk = tests::generate_partition_key(s); auto mut = mutation(s, pk); ss.add_row(mut, ss.make_ckey(0), "val"); sstable_writer_config cfg = env.manager().configure_writer(""); auto mr = make_flat_mutation_reader_from_mutations_v2(s, env.make_reader_permit(), mut); auto sst1 = make_sstable_easy(env, std::move(mr), cfg); auto ss1 = make_lw_shared(ss.schema(), true); ss1->insert(sst1); BOOST_REQUIRE_EQUAL(ss1->all()->size(), 1); // Test that a random sstable_origin is stored and retrieved properly. mr = make_flat_mutation_reader_from_mutations_v2(s, env.make_reader_permit(), mut); auto sst2 = make_sstable_easy(env, std::move(mr), cfg); auto ss2 = make_lw_shared(*ss1); ss2->insert(sst2); BOOST_REQUIRE_EQUAL(ss2->all()->size(), 2); BOOST_REQUIRE_EQUAL(ss1->all()->size(), 1); std::set in_set; ss2->for_each_sstable_gently_until([&] (sstables::shared_sstable sst) { in_set.insert(sst); return make_ready_future(false); }).get(); BOOST_REQUIRE(in_set == std::set({sst1, sst2})); auto lookup_sst = [&] (sstables::shared_sstable sst) { bool found = false; ss2->for_each_sstable_gently_until([&] (sstables::shared_sstable cur) { found = (cur == sst); return make_ready_future(found); }).get(); return found; }; BOOST_REQUIRE(lookup_sst(sst1)); BOOST_REQUIRE(lookup_sst(sst2)); }); } SEASTAR_TEST_CASE(test_time_series_sstable_set_bytes_on_disk) { return test_env::do_with_async([] (test_env& env) { simple_schema ss; auto s = ss.schema(); auto pk = tests::generate_partition_key(s); auto mut = mutation(s, pk); ss.add_row(mut, ss.make_ckey(0), "val"); sstable_writer_config cfg = env.manager().configure_writer(""); auto mr = make_flat_mutation_reader_from_mutations_v2(s, env.make_reader_permit(), mut); auto sst1 = make_sstable_easy(env, std::move(mr), cfg); auto size1 = sst1->bytes_on_disk(); auto ss1 = make_lw_shared(std::make_unique(ss.schema(), true)); ss1->insert(sst1); BOOST_REQUIRE_EQUAL(ss1->bytes_on_disk(), size1); // Test that a random sstable_origin is stored and retrieved properly. mr = make_flat_mutation_reader_from_mutations_v2(s, env.make_reader_permit(), mut); auto sst2 = make_sstable_easy(env, std::move(mr), cfg); auto size2 = sst2->bytes_on_disk(); auto ss2 = make_lw_shared(*ss1); BOOST_REQUIRE_EQUAL(ss2->bytes_on_disk(), ss1->bytes_on_disk()); ss2->insert(sst2); BOOST_REQUIRE_EQUAL(ss2->bytes_on_disk(), size1 + size2); std::vector> sets = {ss1, ss2}; auto sst_set = make_lw_shared(std::make_unique(s, std::move(sets))); BOOST_REQUIRE_EQUAL(sst_set->bytes_on_disk(), ss1->bytes_on_disk() + ss2->bytes_on_disk()); }); } SEASTAR_TEST_CASE(test_partitioned_sstable_set_bytes_on_disk) { return test_env::do_with_async([] (test_env& env) { simple_schema ss; auto s = ss.schema(); auto pk = tests::generate_partition_key(s); auto mut = mutation(s, pk); ss.add_row(mut, ss.make_ckey(0), "val"); sstable_writer_config cfg = env.manager().configure_writer(""); auto mr = make_flat_mutation_reader_from_mutations_v2(s, env.make_reader_permit(), mut); auto sst1 = make_sstable_easy(env, std::move(mr), cfg); auto size1 = sst1->bytes_on_disk(); auto ss1 = make_lw_shared(std::make_unique(ss.schema(), true)); ss1->insert(sst1); BOOST_REQUIRE_EQUAL(ss1->bytes_on_disk(), size1); // Test that a random sstable_origin is stored and retrieved properly. mr = make_flat_mutation_reader_from_mutations_v2(s, env.make_reader_permit(), mut); auto sst2 = make_sstable_easy(env, std::move(mr), cfg); auto size2 = sst2->bytes_on_disk(); auto ss2 = make_lw_shared(*ss1); BOOST_REQUIRE_EQUAL(ss2->bytes_on_disk(), ss1->bytes_on_disk()); ss2->insert(sst2); BOOST_REQUIRE_EQUAL(ss2->bytes_on_disk(), size1 + size2); std::vector> sets = {ss1, ss2}; auto sst_set = make_lw_shared(std::make_unique(s, std::move(sets))); BOOST_REQUIRE_EQUAL(sst_set->bytes_on_disk(), ss1->bytes_on_disk() + ss2->bytes_on_disk()); }); }