/* * Copyright (C) 2015-present ScyllaDB */ /* * SPDX-License-Identifier: AGPL-3.0-or-later */ #include #include #include #include #include "sstables/sstables.hh" #include "timestamp.hh" #include "schema_builder.hh" #include "test/lib/mutation_source_test.hh" #include "test/lib/flat_mutation_reader_assertions.hh" #include "test/lib/sstable_utils.hh" using namespace sstables; using namespace std::chrono_literals; SEASTAR_TEST_CASE(test_schema_changes) { return sstables::test_env::do_with_async([] (sstables::test_env& env) { auto dir = tmpdir(); int gen = 1; std::map, std::tuple> cache; for_each_schema_change([&] (schema_ptr base, const std::vector& base_mutations, schema_ptr changed, const std::vector& changed_mutations) { for (auto version : writable_sstable_versions) { auto it = cache.find(std::tuple { version, base }); shared_sstable created_with_base_schema; shared_sstable created_with_changed_schema; if (it == cache.end()) { auto mt = make_lw_shared(base); for (auto& m : base_mutations) { mt->apply(m); } created_with_base_schema = make_sstable_easy(env, dir.path(), mt, env.manager().configure_writer(), gen, version, base_mutations.size()); created_with_changed_schema = env.make_sstable(changed, dir.path().string(), gen, version, sstables::sstable::format_types::big); created_with_changed_schema->load().get(); cache.emplace(std::tuple { version, base }, std::tuple { created_with_base_schema, gen }); gen++; } else { created_with_base_schema = std::get(it->second); created_with_changed_schema = env.make_sstable(changed, dir.path().string(), std::get(it->second), version, sstables::sstable::format_types::big); created_with_changed_schema->load().get(); } const auto pr = dht::partition_range::make_open_ended_both_sides(); auto mr = assert_that(created_with_base_schema->as_mutation_source() .make_reader(changed, env.make_reader_permit(), pr, changed->full_slice())); for (auto& m : changed_mutations) { mr.produces(m); } mr.produces_end_of_stream(); mr = assert_that(created_with_changed_schema->as_mutation_source() .make_reader(changed, env.make_reader_permit(), pr, changed->full_slice())); for (auto& m : changed_mutations) { mr.produces(m); } mr.produces_end_of_stream(); } }); }); }