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

Johnny Miller updated CASSANDRA-21814:
--------------------------------------
    Component/s: Local/Compaction/UCS

> UCS normalises flush and level 0 densities to the wrong token space with 
> multiple data directories
> --------------------------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-21814
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-21814
>             Project: Apache Cassandra
>          Issue Type: Bug
>          Components: Local/Compaction/UCS
>            Reporter: Johnny Miller
>            Priority: Normal
>
> With more than one data directory, UCS normalises two densities to the whole 
> local token space when they should be normalised to one directory's share of 
> it.
> Both lines date from the original UCS commit (CASSANDRA-18397), so 5.0, 6.0 
> and trunk are affected. With a single data directory {{shardSetCoverage()}} 
> equals {{localSpaceCoverage()}} and neither line has any effect.
> *1. Flush shard count* in 
> {{{}UnifiedCompactionStrategy.createSSTableMultiWriter{}}}:
> {code:java}
> double flushDensity = cfs.metric.flushSizeOnDisk.get() * 
> shardManager.shardSetCoverage() / shardManager.localSpaceCoverage();
> {code}
> {{flushSizeOnDisk}} is updated once per flush writer in 
> {{{}ColumnFamilyStore{}}}, and a flush has one writer per data directory. The 
> value is therefore already the size of data covering one directory's token 
> space, which is what {{Controller.getNumShards}} expects. Multiplying by 
> {{shardSetCoverage() / localSpaceCoverage()}} divides it again by the number 
> of directories, so flushes are split into fewer shards than the configuration 
> asks for.
> *2. Level 0 bound* in {{{}UnifiedCompactionStrategy.formLevels{}}}:
> {code:java}
> double maxDensity = controller.getMaxLevelDensity(0, 
> controller.getBaseSstableSize(controller.getFanout(0)) / 
> shardManager.localSpaceCoverage());
> {code}
> The base sstable size comes from the flush size, which covers one directory's 
> share of the token ring, so it should be divided by 
> {{{}shardSetCoverage(){}}}. With N directories the level 0 bound is N times 
> too low, and flushed sstables can be counted above level 0.
> [~blambov] fixed the same two calculations in the DataStax fork inĀ 
> [51acbd61|https://github.com/datastax/cassandra/commit/51acbd61feb8b04105e68a48fff37878e317df79],
>  together with tests in {{UnifiedCompactionStrategyTest}} and clarifications 
> in {{UnifiedCompactionStrategy.md}} and the {{Controller.getNumShards}} 
> javadoc.
> Found while working on CASSANDRA-21615 and kept separate from it.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

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

Reply via email to