Patrick McFadin created CASSANDRA-21659:
-------------------------------------------

             Summary: Adding a large amount of schema allocates excessively
                 Key: CASSANDRA-21659
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-21659
             Project: Apache Cassandra
          Issue Type: Improvement
          Components: Cluster/Schema
            Reporter: Patrick McFadin


Every schema change allocates in proportion to the whole schema rather than to 
what changed.
h2. What

Keyspaces.diff and Tables.diff build created/dropped with filter(), which 
removes
every non-matching entry from a copy one at a time. On a CREATE TABLE no 
keyspace
is created or dropped, so Keyspaces.filter falls into withoutKsTablesViews and
removes every table in the cluster individually – twice per diff. Tables.diff
then calls TableMetadata.compare for every surviving table, and compare has no
identity fast path.

Several diffs run per DDL: AlterSchemaStatement:194 and :200, AlterSchema:160,
DistributedSchema:213, :260 and :325.
h2. Change
 * Collect created/dropped directly instead of filtering whole collections.
 * Skip comparing entries carried over by reference. Untouched TableMetadata are
reference-identical across a schema change (Tables.Builder.add stores the
instance verbatim), and x.compare(x) is empty by construction, so identity is
exact here, not an approximation.

No signature, format or API changes.
h2. Result

New KeyspacesDiffScalingTest measures allocation for adding one table at 400 and
3200 existing tables and asserts the growth ratio. Allocation rather than 
elapsed
time: counted exactly rather than sampled, independent of GC timing, and it is
what produces the failure (a GC wall, not gradual slowdown).
|| ||400 tables||3200 tables||growth||
|before|292,552 B|3,774,864 B|12.9x|
|after|3,944 B|3,944 B|1.0x|

Before is superlinear because the BTreeMap teardown is O(N log N).
h2. Scope – read before benchmarking

This removes the allocation term, not the scan. Time stays O(N) per diff and 
bulk
creation stays quadratic in wall-clock. What it removes is the allocation that
drives the GC wall. Wall-clock at small N will barely move.
h2. Tests

New KeyspacesDiffScalingTest: 2 scaling assertions, 3 correctness guards. 
Verified
red before and green after, and re-verified the final test fails with the fix
stashed. Regression: schema 27 suites/130 tests, tcm 13/55. checkstyle and
checkstyle-test clean.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to