Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

schema_mutations, migration_manager: Ignore empty partitions in per-table digest #14441

Merged
merged 4 commits into from
Jul 28, 2023

Conversation

tgrabiec
Copy link
Contributor

@tgrabiec tgrabiec commented Jun 28, 2023

Schema digest is calculated by querying for mutations of all schema
tables, then compacting them so that all tombstones in them are
dropped. However, even if the mutation becomes empty after compaction,
we still feed its partition key. If the same mutations were compacted
prior to the query, because the tombstones expire, we won't get any
mutation at all and won't feed the partition key. So schema digest
will change once an empty partition of some schema table is compacted
away.

Tombstones expire 7 days after schema change which introduces them. If
one of the nodes is restarted after that, it will compute a different
table schema digest on boot. This may cause performance problems. When
sending a request from coordinator to replica, the replica needs
schema_ptr of exact schema version request by the coordinator. If it
doesn't know that version, it will request it from the coordinator and
perform a full schema merge. This adds latency to every such request.
Schema versions which are not referenced are currently kept in cache
for only 1 second, so if request flow has low-enough rate, this
situation results in perpetual schema pulls.

After ae8d2a5 (5.2.0), it is more liekly to
run into this situation, because table creation generates tombstones
for all schema tables relevant to the table, even the ones which
will be otherwise empty for the new table (e.g. computed_columns).

This change inroduces a cluster feature which when enabled will change
digest calculation to be insensitive to expiry by ignoring empty
partitions in digest calculation. When the feature is enabled,
schema_ptrs are reloaded so that the window of discrepancy during
transition is short and no rolling restart is required.

A similar problem was fixed for per-node digest calculation in
c2ba94dc39e4add9db213751295fb17b95e6b962. Per-table digest calculation
was not fixed at that time because we didn't persist enabled features
and they were not enabled early-enough on boot for us to depend on
them in digest calculation. Now they are enabled before non-system
tables are loaded so digest calculation can rely on cluster features.

Fixes #4485.

Manually tested using ccm on cluster upgrade scenarios and node restarts.

@tgrabiec tgrabiec requested a review from nyh as a code owner June 28, 2023 23:30
@scylladb-promoter
Copy link
Contributor

@bhalevy
Copy link
Member

bhalevy commented Jun 29, 2023

CI state FAILURE - https://jenkins.scylladb.com/job/scylla-master/job/scylla-ci/2144/

https://jenkins.scylladb.com/job/scylla-master/job/scylla-ci/2144/artifact/testlog/x86_64/debug/cql-pytest.test_tools.1.log

db/schema_tables.cc:3133:47: runtime error: member call on null pointer of type 'replica::database'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior db/schema_tables.cc:3133:47 in 
Aborting on shard 0.
Backtrace:
  0xd4f4350
  /jenkins/workspace/scylla-master/scylla-ci/scylla/build/debug/seastar/libseastar.so+0x48197bc
  /jenkins/workspace/scylla-master/scylla-ci/scylla/build/debug/seastar/libseastar.so+0x4819413
  /jenkins/workspace/scylla-master/scylla-ci/scylla/build/debug/seastar/libseastar.so+0x466bae9
  /jenkins/workspace/scylla-master/scylla-ci/scylla/build/debug/seastar/libseastar.so+0x469ae85
  /jenkins/workspace/scylla-master/scylla-ci/scylla/build/debug/seastar/libseastar.so+0x478c669
  /jenkins/workspace/scylla-master/scylla-ci/scylla/build/debug/seastar/libseastar.so+0x478c89e
  /jenkins/workspace/scylla-master/scylla-ci/scylla/build/debug/seastar/libseastar.so+0x478c6ea
  /lib64/libc.so.6+0x3cb1f
  /lib64/libc.so.6+0x8ce5b
  /lib64/libc.so.6+0x3ca75
  /lib64/libc.so.6+0x267fb
  0xd566eee
  0xd5649c0
  0xd57d44e
  0xd580da8
  0xd581ebe
  0x1023d275
  0x11f26151
  0x11f2345a
  /jenkins/workspace/scylla-master/scylla-ci/scylla/build/debug/seastar/libseastar.so+0x435851d
  /jenkins/workspace/scylla-master/scylla-ci/scylla/build/debug/seastar/libseastar.so+0x4b5f2a7

@tgrabiec says that the schema context is probably not initialized.

…f tables

Currently not reachable, because selectors are always constructed with
both kinds initailized. Will be triggered by the next patch.
…_schema()

Will recreate schema_ptr's from schema tables like during table
alter. Will be needed when digest calculation changes in reaction to
cluster feature at run time.
@scylladb-promoter
Copy link
Contributor

…able digest

Schema digest is calculated by querying for mutations of all schema
tables, then compacting them so that all tombstones in them are
dropped. However, even if the mutation becomes empty after compaction,
we still feed its partition key. If the same mutations were compacted
prior to the query, because the tombstones expire, we won't get any
mutation at all and won't feed the partition key. So schema digest
will change once an empty partition of some schema table is compacted
away.

Tombstones expire 7 days after schema change which introduces them. If
one of the nodes is restarted after that, it will compute a different
table schema digest on boot. This may cause performance problems. When
sending a request from coordinator to replica, the replica needs
schema_ptr of exact schema version request by the coordinator. If it
doesn't know that version, it will request it from the coordinator and
perform a full schema merge. This adds latency to every such request.
Schema versions which are not referenced are currently kept in cache
for only 1 second, so if request flow has low-enough rate, this
situation results in perpetual schema pulls.

After ae8d2a5, it is more liekly to
run into this situation, because table creation generates tombstones
for all schema tables relevant to the table, even the ones which
will be otherwise empty for the new table (e.g. computed_columns).

This change inroduces a cluster feature which when enabled will change
digest calculation to be insensitive to expiry by ignoring empty
partitions in digest calculation. When the feature is enabled,
schema_ptrs are reloaded so that the window of discrepancy during
transition is short and no rolling restart is required.

A similar problem was fixed for per-node digest calculation in
18f484cc753d17d1e3658bcb5c73ed8f319d32e8. Per-table digest calculation
was not fixed at that time because we didn't persist enabled features
and they were not enabled early-enough on boot for us to depend on
them in digest calculation. Now they are enabled before non-system
tables are loaded so digest calculation can rely on cluster features.

Fixes scylladb#4485.
@scylladb-promoter
Copy link
Contributor

@tgrabiec
Copy link
Contributor Author

tgrabiec commented Jul 4, 2023

In V2:

  • Fixed SIGSEGV in schema loader due to uninitialized db in schema_ctx
  • Fixed schema_change_test failure due to change in digest calculation. Updated expected digests.
  • Extended schema_change_test to verify that digest doesn't change after gc_clock is advanced past tombstone expiration point

@kbr-scylla
Copy link
Contributor

@tgrabiec who should review this PR?

@avikivity
Copy link
Member

How likely is this to happen? If likely, we should fall back to the old computation on mixed clusters To avoid unreconcilable schema while the cluster is being upgraded.

@mykaul
Copy link
Contributor

mykaul commented Jul 10, 2023

How likely is this to happen? If likely, we should fall back to the old computation on mixed clusters To avoid unreconcilable schema while the cluster is being upgraded.

We've seen it in customer cases.

@tgrabiec
Copy link
Contributor Author

tgrabiec commented Jul 10, 2023

How likely is this to happen? If likely, we should fall back to the old computation on mixed clusters To avoid unreconcilable schema while the cluster is being upgraded.

Since 5.2.0, it is guaranteed to happen after 7 days since table creation when you restart a single server but not the others.

We use old computation during rolling upgrade, this is controlled by a cluster feature. When the feature transitions to being enabled and it wasn't enabled at boot time, digests are recomputed. Normally that should happen on all nodes at more or less the same time.

@tgrabiec
Copy link
Contributor Author

On older versions, it can still happen, but scenarios to trigger are more complex.

@tgrabiec tgrabiec requested a review from avikivity July 10, 2023 12:38
@@ -151,7 +151,8 @@ static future<> merge_tables_and_views(distributed<service::storage_proxy>& prox
std::map<table_id, schema_mutations>&& tables_before,
std::map<table_id, schema_mutations>&& tables_after,
std::map<table_id, schema_mutations>&& views_before,
std::map<table_id, schema_mutations>&& views_after);
std::map<table_id, schema_mutations>&& views_after,
bool reload);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand the motivation. How will schemas change? Isn't it a no-op?

if (!_feat.table_digest_insensitive_to_expiry) {
_feature_listeners.push_back(_feat.table_digest_insensitive_to_expiry.when_enabled([this] {
(void) with_gate(_background_tasks, [this] {
return reload_schema();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So is the goal to reload the mutations just to re-run them through the digester? If we generated the mutations from the schema object, could be have avoided it (don't remember if we have such an ability).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could generate digests from schema_ptr in memory. The reason I go through the schema merge path is to make sure that this process is synchronized with other schema changes which could be happening concurrently, and that I reuse the existing mechanism for redistributing schema_ptrs. It's less efficient but on the safe side. Having a single path means less risk due to the two paths diverging over time.

@avikivity
Copy link
Member

Looks good. I didn't understand everything so I asked questions.

…SITIVE_TO_EXPIRY enabled

The new test cases are a mirror of old test cases, but with updated digests.
@tgrabiec
Copy link
Contributor Author

In V2:

  • preserve test cases which check the old digests without the new feature enabled, in addition to the new digest.
  • drop the last patch which verified that expiry doesn't change table digests, which does not really add any value because table digests are taken from memory.

@scylladb-promoter
Copy link
Contributor

@DoronArazii
Copy link

@nyh ping review please

@tgrabiec
Copy link
Contributor Author

ping @avikivity. You comments were addressed.

@scylladb-promoter scylladb-promoter merged commit cf81eef into scylladb:master Jul 28, 2023
3 checks passed
@mykaul
Copy link
Contributor

mykaul commented Nov 1, 2023

next-5.2 (https://jenkins.scylladb.com/job/scylla-5.2/job/next/334/consoleFull#874834529dae97f28-980f-4dce-a662-1b9b15a76cc1 ) seem to fail:

00:17:04  [547/2956] CXX build/debug/service/migration_manager.o
00:17:04  FAILED: build/debug/service/migration_manager.o 
00:17:04  clang++ -MD -MT build/debug/service/migration_manager.o -MF build/debug/service/migration_manager.o.d -I/jenkins/workspace/scylla-5.2/next/scylla/seastar/include -I/jenkins/workspace/scylla-5.2/next/scylla/build/debug/seastar/gen/include -U_FORTIFY_SOURCE -DSEASTAR_SSTRING -Werror=unused-result -fstack-clash-protection -fsanitize=address -fsanitize=undefined -fno-sanitize=vptr -DSEASTAR_API_LEVEL=6 -DSEASTAR_SCHEDULING_GROUPS_COUNT=16 -DSEASTAR_DEBUG -DSEASTAR_DEFAULT_ALLOCATOR -DSEASTAR_SHUFFLE_TASK_QUEUE -DSEASTAR_DEBUG_SHARED_PTR -DSEASTAR_TYPE_ERASE_MORE -DFMT_SHARED -DSEASTAR_BROKEN_SOURCE_LOCATION -I/usr/include/p11-kit-1   -ffile-prefix-map=/jenkins/workspace/scylla-5.2/next/scylla=. -march=westmere -DDEBUG -DSANITIZE -DDEBUG_LSA_SANITIZER -DSCYLLA_ENABLE_ERROR_INJECTION -Og -DSCYLLA_BUILD_MODE=debug -g -gz -iquote. -iquote build/debug/gen --std=gnu++20  -ffile-prefix-map=/jenkins/workspace/scylla-5.2/next/scylla=. -march=westmere  -DBOOST_TEST_DYN_LINK   -DNOMINMAX -DNOMINMAX -fvisibility=hidden  -Wall -Werror -Wno-mismatched-tags -Wno-tautological-compare -Wno-parentheses-equality -Wno-c++11-narrowing -Wno-sometimes-uninitialized -Wno-return-stack-address -Wno-missing-braces -Wno-unused-lambda-capture -Wno-overflow -Wno-noexcept-type -Wno-error=cpp -Wno-ignored-attributes -Wno-overloaded-virtual -Wno-unused-command-line-argument -Wno-defaulted-function-deleted -Wno-redeclared-class-member -Wno-unsupported-friend -Wno-unused-variable -Wno-delete-non-abstract-non-virtual-dtor -Wno-braced-scalar-init -Wno-implicit-int-float-conversion -Wno-delete-abstract-non-virtual-dtor -Wno-uninitialized-const-reference -Wno-psabi -Wno-narrowing -Wno-array-bounds -Wno-nonnull -Wno-uninitialized -Wno-error=deprecated-declarations -DXXH_PRIVATE_API -DSEASTAR_TESTING_MAIN -DFMT_DEPRECATED_OSTREAM -DHAVE_LZ4_COMPRESS_DEFAULT  -c -o build/debug/service/migration_manager.o service/migration_manager.cc
00:17:04 
 service/migration_manager.cc:99:28: error: use of undeclared identifier 'reload_schema'
00:17:04                      return reload_schema();
00:17:04                             ^
00:17:04  In file included from service/migration_manager.cc:11:
00:17:04  In file included from /jenkins/workspace/scylla-5.2/next/scylla/seastar/include/seastar/core/sleep.hh:25:
00:17:04  In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/chrono:39:
00:17:04  In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/chrono.h:37:
00:17:04  In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/ratio:39:
00:17:04  /usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/type_traits:3034:5: error: no type named 'type' in 'std::invoke_result<(lambda at service/migration_manager.cc:98:53)>'
00:17:04      using invoke_result_t = typename invoke_result<_Fn, _Args...>::type;
00:17:04      ^~~~~
00:17:04  /jenkins/workspace/scylla-5.2/next/scylla/seastar/include/seastar/core/future.hh:2177:37: note: in instantiation of template type alias 'invoke_result_t' requested here
00:17:04      using futurator = futurize<std::invoke_result_t<Func, Args&&...>>;
00:17:04                                      ^
00:17:04  /jenkins/workspace/scylla-5.2/next/scylla/seastar/include/seastar/core/gate.hh:270:12: note: in instantiation of function template specialization 'seastar::futurize_invoke<(lambda at service/migration_manager.cc:98:53)>' requested here
00:17:04      return futurize_invoke(std::forward<Func>(func)).finally([&g] { g.leave(); });
00:17:04             ^
00:17:04  /jenkins/workspace/scylla-5.2/next/scylla/seastar/include/seastar/core/gate.hh:288:22: note: in instantiation of function template specialization 'seastar::internal::invoke_func_with_gate<(lambda at service/migration_manager.cc:98:53)>' requested here
00:17:04      return internal::invoke_func_with_gate(g, std::forward<Func>(func));
00:17:04                       ^
00:17:04  service/migration_manager.cc:98:24: note: in instantiation of function template specialization 'seastar::with_gate<(lambda at service/migration_manager.cc:98:53)>' requested here
00:17:04                  (void) with_gate(_background_tasks, [this] {
00:17:04                         ^
00:17:04  2 errors generated.
00:17:04  [548/2956] CXX build/debug/cql3/statements/alter_keyspace_statement.o
00:17:04  [549/2956] CXX build/debug/cql3/statements/alter_type_statement.o
00:17:04  [550/2956] CXX build/debug/cql3/statements/cas_request.o
00:17:05  [551/2956] CXX build/debug/data_dictionary/data_dictionary.o
00:17:08  [552/2956] CXX build/debug/cql3/query_options.o
00:17:08  [553/2956] CXX build/debug/test/boost/test_table.o
00:17:08  [554/2956] CXX build/debug/test/boost/loading_cache_test.o
00:17:10  [555/2956] CXX build/debug/thrift/server.o
00:17:11  [556/2956] CXX build/debug/cql3/statements/role-management-statements.o
00:17:11  [557/2956] CXX build/debug/cql3/statements/modification_statement.o
00:17:11  [558/2956] CXX build/debug/test/boost/mutation_reader_test.o
00:17:12  [559/2956] CXX build/debug/db/consistency_level.o
00:17:12  [560/2956] CXX build/debug/thrift/controller.o
00:17:17  [561/2956] CXX build/debug/db/schema_tables.o
00:17:17  FAILED: build/debug/db/schema_tables.o 
00:17:17  clang++ -MD -MT build/debug/db/schema_tables.o -MF build/debug/db/schema_tables.o.d -I/jenkins/workspace/scylla-5.2/next/scylla/seastar/include -I/jenkins/workspace/scylla-5.2/next/scylla/build/debug/seastar/gen/include -U_FORTIFY_SOURCE -DSEASTAR_SSTRING -Werror=unused-result -fstack-clash-protection -fsanitize=address -fsanitize=undefined -fno-sanitize=vptr -DSEASTAR_API_LEVEL=6 -DSEASTAR_SCHEDULING_GROUPS_COUNT=16 -DSEASTAR_DEBUG -DSEASTAR_DEFAULT_ALLOCATOR -DSEASTAR_SHUFFLE_TASK_QUEUE -DSEASTAR_DEBUG_SHARED_PTR -DSEASTAR_TYPE_ERASE_MORE -DFMT_SHARED -DSEASTAR_BROKEN_SOURCE_LOCATION -I/usr/include/p11-kit-1   -ffile-prefix-map=/jenkins/workspace/scylla-5.2/next/scylla=. -march=westmere -DDEBUG -DSANITIZE -DDEBUG_LSA_SANITIZER -DSCYLLA_ENABLE_ERROR_INJECTION -Og -DSCYLLA_BUILD_MODE=debug -g -gz -iquote. -iquote build/debug/gen --std=gnu++20  -ffile-prefix-map=/jenkins/workspace/scylla-5.2/next/scylla=. -march=westmere  -DBOOST_TEST_DYN_LINK   -DNOMINMAX -DNOMINMAX -fvisibility=hidden  -Wall -Werror -Wno-mismatched-tags -Wno-tautological-compare -Wno-parentheses-equality -Wno-c++11-narrowing -Wno-sometimes-uninitialized -Wno-return-stack-address -Wno-missing-braces -Wno-unused-lambda-capture -Wno-overflow -Wno-noexcept-type -Wno-error=cpp -Wno-ignored-attributes -Wno-overloaded-virtual -Wno-unused-command-line-argument -Wno-defaulted-function-deleted -Wno-redeclared-class-member -Wno-unsupported-friend -Wno-unused-variable -Wno-delete-non-abstract-non-virtual-dtor -Wno-braced-scalar-init -Wno-implicit-int-float-conversion -Wno-delete-abstract-non-virtual-dtor -Wno-uninitialized-const-reference -Wno-psabi -Wno-narrowing -Wno-array-bounds -Wno-nonnull -Wno-uninitialized -Wno-error=deprecated-declarations -DXXH_PRIVATE_API -DSEASTAR_TESTING_MAIN -DFMT_DEPRECATED_OSTREAM -DHAVE_LZ4_COMPRESS_DEFAULT  -c -o build/debug/db/schema_tables.o db/schema_tables.cc
00:17:17  db/schema_tables.cc:97:7: error: field '_extensions' will be initialized after field '_features' [-Werror,-Wreorder-ctor]
00:17:17      : _extensions(cfg.extensions())
00:17:17        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00:17:17        _features(features)
00:17:17  1 error generated.

tgrabiec pushed a commit that referenced this pull request Nov 21, 2023
…n per-table digest' from Tomasz Grabiec

Schema digest is calculated by querying for mutations of all schema
tables, then compacting them so that all tombstones in them are
dropped. However, even if the mutation becomes empty after compaction,
we still feed its partition key. If the same mutations were compacted
prior to the query, because the tombstones expire, we won't get any
mutation at all and won't feed the partition key. So schema digest
will change once an empty partition of some schema table is compacted
away.

Tombstones expire 7 days after schema change which introduces them. If
one of the nodes is restarted after that, it will compute a different
table schema digest on boot. This may cause performance problems. When
sending a request from coordinator to replica, the replica needs
schema_ptr of exact schema version request by the coordinator. If it
doesn't know that version, it will request it from the coordinator and
perform a full schema merge. This adds latency to every such request.
Schema versions which are not referenced are currently kept in cache
for only 1 second, so if request flow has low-enough rate, this
situation results in perpetual schema pulls.

After ae8d2a5 (5.2.0), it is more liekly to
run into this situation, because table creation generates tombstones
for all schema tables relevant to the table, even the ones which
will be otherwise empty for the new table (e.g. computed_columns).

This change inroduces a cluster feature which when enabled will change
digest calculation to be insensitive to expiry by ignoring empty
partitions in digest calculation. When the feature is enabled,
schema_ptrs are reloaded so that the window of discrepancy during
transition is short and no rolling restart is required.

A similar problem was fixed for per-node digest calculation in
c2ba94dc39e4add9db213751295fb17b95e6b962. Per-table digest calculation
was not fixed at that time because we didn't persist enabled features
and they were not enabled early-enough on boot for us to depend on
them in digest calculation. Now they are enabled before non-system
tables are loaded so digest calculation can rely on cluster features.

Fixes #4485.

Manually tested using ccm on cluster upgrade scenarios and node restarts.

Closes #14441

* github.com:scylladb/scylladb:
  test: schema_change_test: Verify digests also with TABLE_DIGEST_INSENSITIVE_TO_EXPIRY enabled
  schema_mutations, migration_manager: Ignore empty partitions in per-table digest
  migration_manager, schema_tables: Implement migration_manager::reload_schema()
  schema_tables: Avoid crashing when table selector has only one kind of tables

(cherry picked from commit cf81eef)
tgrabiec pushed a commit that referenced this pull request Nov 21, 2023
…n per-table digest' from Tomasz Grabiec

Schema digest is calculated by querying for mutations of all schema
tables, then compacting them so that all tombstones in them are
dropped. However, even if the mutation becomes empty after compaction,
we still feed its partition key. If the same mutations were compacted
prior to the query, because the tombstones expire, we won't get any
mutation at all and won't feed the partition key. So schema digest
will change once an empty partition of some schema table is compacted
away.

Tombstones expire 7 days after schema change which introduces them. If
one of the nodes is restarted after that, it will compute a different
table schema digest on boot. This may cause performance problems. When
sending a request from coordinator to replica, the replica needs
schema_ptr of exact schema version request by the coordinator. If it
doesn't know that version, it will request it from the coordinator and
perform a full schema merge. This adds latency to every such request.
Schema versions which are not referenced are currently kept in cache
for only 1 second, so if request flow has low-enough rate, this
situation results in perpetual schema pulls.

After ae8d2a5 (5.2.0), it is more liekly to
run into this situation, because table creation generates tombstones
for all schema tables relevant to the table, even the ones which
will be otherwise empty for the new table (e.g. computed_columns).

This change inroduces a cluster feature which when enabled will change
digest calculation to be insensitive to expiry by ignoring empty
partitions in digest calculation. When the feature is enabled,
schema_ptrs are reloaded so that the window of discrepancy during
transition is short and no rolling restart is required.

A similar problem was fixed for per-node digest calculation in
c2ba94dc39e4add9db213751295fb17b95e6b962. Per-table digest calculation
was not fixed at that time because we didn't persist enabled features
and they were not enabled early-enough on boot for us to depend on
them in digest calculation. Now they are enabled before non-system
tables are loaded so digest calculation can rely on cluster features.

Fixes #4485.

Manually tested using ccm on cluster upgrade scenarios and node restarts.

Closes #14441

* github.com:scylladb/scylladb:
  test: schema_change_test: Verify digests also with TABLE_DIGEST_INSENSITIVE_TO_EXPIRY enabled
  schema_mutations, migration_manager: Ignore empty partitions in per-table digest
  migration_manager, schema_tables: Implement migration_manager::reload_schema()
  schema_tables: Avoid crashing when table selector has only one kind of tables

(cherry picked from commit cf81eef)
(cherry picked from commit 40eed1f)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Schema digest changes once all tombstones inside an empty partition of some schema table expire
7 participants