[ 
https://issues.apache.org/jira/browse/CASSANDRA-21659?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Patrick McFadin updated CASSANDRA-21659:
----------------------------------------
    Resolution: Duplicate
        Status: Resolved  (was: Triage Needed)

New Jira superceeds this one

> 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
>            Assignee: Patrick McFadin
>            Priority: Normal
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> 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