Merge branch 'cassandra-2.1' into trunk

This commit is contained in:
Yuki Morishita 2015-05-15 11:24:30 -05:00
commit 266c5043c2
3 changed files with 44 additions and 1 deletions

View File

@ -135,6 +135,7 @@
* Fix anticompaction blocking ANTI_ENTROPY stage (CASSANDRA-9151)
* Repair waits for anticompaction to finish (CASSANDRA-9097)
* Fix streaming not holding ref when stream error (CASSANDRA-9295)
* Fix canonical view returning early opened SSTables (CASSANDRA-9396)
Merged from 2.0:
* Clone SliceQueryFilter in AbstractReadCommand implementations (CASSANDRA-8940)
* Push correct protocol notification for DROP INDEX (CASSANDRA-9310)

View File

@ -2776,7 +2776,9 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
public List<SSTableReader> apply(DataTracker.View view)
{
List<SSTableReader> sstables = new ArrayList<>();
sstables.addAll(view.compacting);
for (SSTableReader sstable : view.compacting)
if (sstable.openReason != SSTableReader.OpenReason.EARLY)
sstables.add(sstable);
for (SSTableReader sstable : view.sstables)
if (!view.compacting.contains(sstable) && sstable.openReason != SSTableReader.OpenReason.EARLY)
sstables.add(sstable);

View File

@ -18,6 +18,7 @@
package org.apache.cassandra.io.sstable;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
@ -781,6 +782,45 @@ public class SSTableRewriterTest extends SchemaLoader
validateCFS(cfs);
}
@Test
public void testCanonicalView() throws IOException
{
Keyspace keyspace = Keyspace.open(KEYSPACE);
ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF);
cfs.truncateBlocking();
SSTableReader s = writeFile(cfs, 1000);
cfs.addSSTable(s);
Set<SSTableReader> sstables = Sets.newHashSet(cfs.markAllCompacting());
assertEquals(1, sstables.size());
SSTableRewriter.overrideOpenInterval(10000000);
SSTableRewriter writer = new SSTableRewriter(cfs, sstables, 1000, false);
boolean checked = false;
try (AbstractCompactionStrategy.ScannerList scanners = cfs.getCompactionStrategy().getScanners(sstables))
{
ISSTableScanner scanner = scanners.scanners.get(0);
CompactionController controller = new CompactionController(cfs, sstables, cfs.gcBefore(System.currentTimeMillis()));
writer.switchWriter(getWriter(cfs, sstables.iterator().next().descriptor.directory));
while (scanner.hasNext())
{
AbstractCompactedRow row = new LazilyCompactedRow(controller, Collections.singletonList(scanner.next()));
writer.append(row);
if (!checked && writer.currentWriter().getFilePointer() > 15000000)
{
checked = true;
ColumnFamilyStore.ViewFragment viewFragment = cfs.select(ColumnFamilyStore.CANONICAL_SSTABLES);
// canonical view should have only one SSTable which is not opened early.
assertEquals(1, viewFragment.sstables.size());
SSTableReader sstable = viewFragment.sstables.get(0);
assertEquals(s.descriptor, sstable.descriptor);
assertTrue("Found early opened SSTable in canonical view: " + sstable.getFilename(), sstable.openReason != SSTableReader.OpenReason.EARLY);
}
}
}
writer.finish();
cfs.getDataTracker().unmarkCompacting(sstables);
}
private void validateKeys(Keyspace ks)
{
for (int i = 0; i < 100; i++)