/* * Copyright (C) 2015-present ScyllaDB */ /* * This file is part of Scylla. * * Scylla is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Scylla is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Scylla. If not, see . */ #include #include #include #include #include "sstables/sstables.hh" #include "timestamp.hh" #include "schema_builder.hh" #include "mutation_reader.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_THREAD_TEST_CASE(test_schema_changes) { 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 = env.make_sstable(base, dir.path().string(), gen, version, sstables::sstable::format_types::big); created_with_base_schema->write_components(mt->make_flat_reader(base, env.make_reader_permit()), base_mutations.size(), base, env.manager().configure_writer(), mt->get_encoding_stats()).get(); created_with_base_schema->load().get(); 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(); } }); }).get(); }