From 3f4f408bcf3ff7ad1c70aeca7cc8c7938d25b4bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Botond=20D=C3=A9nes?= Date: Mon, 20 Sep 2021 17:35:52 +0300 Subject: [PATCH] schema: add get_reversed() A variant of make_reversed() which goes through the schema registry, teaching the schema to the registry if necessary. This effectively caches the result of the reversing and as an added bonus double reversing yields the very same schema C++ object that was the starting point. Closes #9365 --- schema.cc | 6 ++++++ schema.hh | 13 +++++++++++++ test/boost/schema_change_test.cc | 20 ++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/schema.cc b/schema.cc index 3fe92e3790..d314752cf9 100644 --- a/schema.cc +++ b/schema.cc @@ -1595,6 +1595,12 @@ schema_ptr schema::make_reversed() const { return make_lw_shared(schema::reversed_tag{}, *this); } +schema_ptr schema::get_reversed() const { + return local_schema_registry().get_or_load(utils::UUID_gen::negate(_raw._version), [this] (table_schema_version) { + return frozen_schema(make_reversed()); + }); +} + raw_view_info::raw_view_info(utils::UUID base_id, sstring base_name, bool include_all_columns, sstring where_clause) : _base_id(std::move(base_id)) , _base_name(std::move(base_name)) diff --git a/schema.hh b/schema.hh index 9e23df3047..40580ed574 100644 --- a/schema.hh +++ b/schema.hh @@ -986,6 +986,19 @@ public: // different C++ objects). // The schema's version is also reversed using UUID_gen::negate(). schema_ptr make_reversed() const; + + // Get the reversed counterpart of this schema from the schema registry. + // + // If not present in the registry, create one (via \ref make_reversed()) and + // load it. Unlike \ref make_reversed(), this method guarantees that double + // reversing will return the very same C++ object: + // + // auto schema = make_schema(); + // auto reverse_schema = schema->get_reversed(); + // assert(reverse_schema->get_reversed().get() == schema.get()); + // assert(schema->get_reversed().get() == reverse_schema.get()); + // + schema_ptr get_reversed() const; }; lw_shared_ptr make_shared_schema(std::optional id, std::string_view ks_name, std::string_view cf_name, diff --git a/test/boost/schema_change_test.cc b/test/boost/schema_change_test.cc index 94b7f3a3cc..c93f6af928 100644 --- a/test/boost/schema_change_test.cc +++ b/test/boost/schema_change_test.cc @@ -835,3 +835,23 @@ SEASTAR_TEST_CASE(test_schema_make_reversed) { return make_ready_future<>(); } + +SEASTAR_TEST_CASE(test_schema_get_reversed) { + return do_with_cql_env([this] (cql_test_env& e) { + auto schema = schema_builder("tests", get_name()) + .with_column("pk", bytes_type, column_kind::partition_key) + .with_column("ck", bytes_type, column_kind::clustering_key) + .with_column("v1", bytes_type) + .build(); + schema = local_schema_registry().learn(schema); + auto reversed_schema = schema->get_reversed(); + + testlog.info(" &schema: {}", fmt::ptr(schema.get())); + testlog.info("&reverse_schema: {}", fmt::ptr(reversed_schema.get())); + + BOOST_REQUIRE_EQUAL(reversed_schema->get_reversed().get(), schema.get()); + BOOST_REQUIRE_EQUAL(schema->get_reversed().get(), reversed_schema.get()); + + return make_ready_future<>(); + }); +}