Skip to content

Commit 313c56c

Browse files
CASSANDRA-21134: Address review feedback for background write Direct I/O
Fail fast on unsupported background_write_disk_access_mode values, drop "scrub" from the DIO operation docs (it's UNSUPPORTED_CORRECTNESS), and tighten AntiCompactionTest/CompactionsTest to assert Direct I/O actually engages rather than passing spuriously.
1 parent ca8ef09 commit 313c56c

5 files changed

Lines changed: 17 additions & 2 deletions

File tree

conf/cassandra.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ commitlog_disk_access_mode: legacy
694694
# compaction_read_disk_access_mode: auto
695695

696696
# Set the disk access mode for writing compressed SSTables during background operations
697-
# (compaction, streaming, scrub, cleanup, repair, etc.). The allowed values are:
697+
# (compaction, streaming, cleanup, repair, etc.). The allowed values are:
698698
# - standard: use buffered I/O (default)
699699
# - direct: use direct I/O, bypassing the OS page cache
700700
# Note: Only applies to compressed tables. Uncompressed tables always use buffered I/O.

src/java/org/apache/cassandra/config/Config.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ public MemtableOptions()
362362

363363
public DataStorageSpec.IntKibibytesBound compressed_read_ahead_buffer_size = new DataStorageSpec.IntKibibytesBound("256KiB");
364364

365-
// Direct IO for background SSTable writes (compaction, streaming, scrub, cleanup, etc.)
365+
// Direct IO for background SSTable writes (compaction, streaming, cleanup, etc.)
366366
// When 'direct' is set, background writes bypass the OS page cache using O_DIRECT.
367367
// Memtable flushes always use buffered I/O regardless of this setting.
368368
// Default is 'standard' (buffered I/O) - users must opt-in to Direct IO

src/java/org/apache/cassandra/config/DatabaseDescriptor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3481,6 +3481,11 @@ public static void initializeBackgroundWriteDiskAccessMode()
34813481
}
34823482
}
34833483
}
3484+
else if (providedMode != DiskAccessMode.standard)
3485+
{
3486+
throw new ConfigurationException("Unsupported disk access mode for background_write_disk_access_mode " +
3487+
"(options: standard/direct/auto): " + providedMode, false);
3488+
}
34843489

34853490
backgroundWriteDiskAccessMode = providedMode;
34863491
}

test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ public void testAntiCompactionWithCompressedTableAndDirectWrites() throws Throwa
265265
store.truncateBlocking();
266266

267267
populateDeterministic(store, ts);
268+
DirectIoTestUtils.activatedDirectWriteOperations().clear();
268269
SSTableStats directStats = DirectIoTestUtils.withDirectWrites(() ->
269270
antiCompactRanges(store, atEndpoint(range(0, 4), NO_RANGES)));
270271
assertEquals(2, directStats.numLiveSSTables);

test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
import org.apache.cassandra.io.sstable.format.SSTableFormat.Components;
8787
import org.apache.cassandra.io.sstable.format.SSTableReader;
8888
import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
89+
import org.apache.cassandra.io.util.DirectIoTestUtils;
8990
import org.apache.cassandra.schema.CompactionParams;
9091
import org.apache.cassandra.schema.CompressionParams;
9192
import org.apache.cassandra.schema.KeyspaceParams;
@@ -491,8 +492,16 @@ public CompactionAwareWriter getCompactionAwareWriter(ColumnFamilyStore cfs,
491492
return new MaxSSTableSizeWriter(cfs, directories, transaction, nonExpiredSSTables, maxSSTableSize, 0);
492493
}
493494
};
495+
DirectIoTestUtils.activatedDirectWriteOperations().clear();
494496
task.execute(CompactionManager.instance.active);
495497

498+
if (backgroundWriteDiskAccessMode == DiskAccessMode.direct)
499+
{
500+
Set<OperationType> activated = DirectIoTestUtils.activatedDirectWriteOperations();
501+
assertTrue("DirectCompressedSequentialWriter must have engaged for COMPACTION; activated=" + activated,
502+
activated.contains(OperationType.COMPACTION));
503+
}
504+
496505
Set<SSTableReader> result = cfs.getLiveSSTables();
497506
assertTrue("expected segment rotation to produce >= 2 SSTables, got " + result.size(), result.size() >= 2);
498507

0 commit comments

Comments
 (0)