You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Paulo Motta (JIRA)" <ji...@apache.org> on 2014/05/23 02:19:01 UTC

[jira] [Created] (CASSANDRA-7290) Compaction strategy is not reloaded when compaction strategy options is updated

Paulo Motta created CASSANDRA-7290:
--------------------------------------

             Summary: Compaction strategy is not reloaded when compaction strategy options is updated
                 Key: CASSANDRA-7290
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-7290
             Project: Cassandra
          Issue Type: Bug
          Components: Core
            Reporter: Paulo Motta
             Fix For: 1.2.17, 2.0.9


The AbstractCompactionStrategy constructor receives an options map on its constructor:
{code:java}
    protected AbstractCompactionStrategy(ColumnFamilyStore cfs, Map<String, String> options)
    {
        assert cfs != null;
        this.cfs = cfs;
        this.options = options;
    ...
{code}
This map is currently the same reference as CFMetadata.compactionStrategyOptions, so ColumnFamilyStore.reload() does not reload the compaction strategy when a compaction strategy option changes:
{code:java}
    private void maybeReloadCompactionStrategy()
    {
        // Check if there is a need for reloading
        if (metadata.compactionStrategyClass.equals(compactionStrategy.getClass()) 
            && metadata.compactionStrategyOptions.equals(compactionStrategy.options)) //metadata.compactionStrategyOptions == compactionStrategy.options, so compaction is never reloaded
            return;
{code}

I spotted this in my test, when I tried changing the value of "unchecked_tombstone_compaction" from false to true and calling ColumnFamilyStore.reload() was not reloading the compaction strategy. I don't know if ColumnFamilyStore.reload() is only called during tests, or also whenever the schema changes. 

In order to fix the bug, I made AbstractCompactionStrategy.options an ImmutableMap, so if CFMetadata.compactionStrategyOptions is updated, ColumnFamilyStore.maybeReloadCompactionStrategy will actually reload the compaction strategy:
{code:java}
    protected AbstractCompactionStrategy(ColumnFamilyStore cfs, Map<String, String> options)
    {
        assert cfs != null;
        this.cfs = cfs;
        this.options = ImmutableMap.copyOf(options);
    ...
{code}




--
This message was sent by Atlassian JIRA
(v6.2#6252)