Skip to content

Commit 91a6ef8

Browse files
CASSANDRA-21134: Add kernel-bug 1057843 startup-check test
Cover checkKernelBug1057843 for the new background-write Direct I/O data paths, and tidy the cassandra_latest.yaml comment wording.
1 parent 55edc34 commit 91a6ef8

2 files changed

Lines changed: 38 additions & 12 deletions

File tree

conf/cassandra_latest.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -704,8 +704,8 @@ commitlog_disk_access_mode: auto
704704
# (compaction, streaming, cleanup, repair, etc.). The allowed values are:
705705
# - standard: use buffered I/O (default)
706706
# - direct: use direct I/O, bypassing the OS page cache
707-
# Note: Only applies to compressed tables. Uncompressed tables always use buffered I/O.
708-
# Note: Memtable flushes always use buffered I/O regardless of this setting, as flushed
707+
# Only applies to compressed tables. Uncompressed tables always use buffered I/O.
708+
# Memtable flushes always use buffered I/O regardless of this setting, as flushed
709709
# data benefits from page cache for subsequent reads.
710710
background_write_disk_access_mode: direct
711711

test/unit/org/apache/cassandra/service/StartupChecksTest.java

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -303,12 +303,23 @@ public void testKernelBug1057843Check() throws Exception
303303
{
304304
Assume.assumeTrue(DatabaseDescriptor.getCommitLogCompression() == null); // we would not be able to enable direct io otherwise
305305
Assume.assumeTrue("Skipping this test on non-Linux OS", FBUtilities.isLinux);
306-
testKernelBug1057843Check("ext4", DiskAccessMode.direct, new Semver("6.1.63.1-generic"), false);
307-
testKernelBug1057843Check("ext4", DiskAccessMode.direct, new Semver("6.1.64.1-generic"), true);
308-
testKernelBug1057843Check("ext4", DiskAccessMode.direct, new Semver("6.1.65.1-generic"), true);
309-
testKernelBug1057843Check("ext4", DiskAccessMode.direct, new Semver("6.1.66.1-generic"), false);
310-
testKernelBug1057843Check("tmpfs", DiskAccessMode.direct, new Semver("6.1.64.1-generic"), false);
311-
testKernelBug1057843Check("ext4", DiskAccessMode.mmap, new Semver("6.1.64.1-generic"), false);
306+
307+
// Commit log direct writes
308+
testKernelBug1057843Check("ext4", DiskAccessMode.direct, DiskAccessMode.standard, new Semver("6.1.63.1-generic"), false);
309+
testKernelBug1057843Check("ext4", DiskAccessMode.direct, DiskAccessMode.standard, new Semver("6.1.64.1-generic"), true);
310+
testKernelBug1057843Check("ext4", DiskAccessMode.direct, DiskAccessMode.standard, new Semver("6.1.65.1-generic"), true);
311+
testKernelBug1057843Check("ext4", DiskAccessMode.direct, DiskAccessMode.standard, new Semver("6.1.66.1-generic"), false);
312+
testKernelBug1057843Check("tmpfs", DiskAccessMode.direct, DiskAccessMode.standard, new Semver("6.1.64.1-generic"), false);
313+
testKernelBug1057843Check("ext4", DiskAccessMode.mmap, DiskAccessMode.standard, new Semver("6.1.64.1-generic"), false);
314+
315+
// Background (data dir) direct writes hit the same check; kernel/fs-type logic is swept above, so
316+
// here we only prove the data-dir branch reaches it (ext4 trips, tmpfs filtered out). Commit log is
317+
// mmap, not standard: standard is rejected for the commit log unless compression/encryption is on.
318+
testKernelBug1057843Check("ext4", DiskAccessMode.mmap, DiskAccessMode.direct, new Semver("6.1.64.1-generic"), true);
319+
testKernelBug1057843Check("tmpfs", DiskAccessMode.mmap, DiskAccessMode.direct, new Semver("6.1.64.1-generic"), false);
320+
321+
// Both commit log and background data dir direct writes at once
322+
testKernelBug1057843Check("ext4", DiskAccessMode.direct, DiskAccessMode.direct, new Semver("6.1.64.1-generic"), true);
312323
}
313324

314325
@SuppressWarnings("unchecked")
@@ -549,19 +560,25 @@ public FileSystem getFileSystem()
549560
}
550561
}
551562

552-
private void testKernelBug1057843Check(String fsType, DiskAccessMode diskAccessMode, Semver kernelVersion, boolean expectToFail) throws Exception
563+
private void testKernelBug1057843Check(String fsType,
564+
DiskAccessMode commitLogMode,
565+
DiskAccessMode backgroundMode,
566+
Semver kernelVersion,
567+
boolean expectToFail) throws Exception
553568
{
554569
String commitLogLocation = Files.createTempDirectory("testKernelBugCheck").toString();
555570

556571
String savedCommitLogLocation = DatabaseDescriptor.getCommitLogLocation();
557572
DiskAccessMode savedCommitLogWriteDiskAccessMode = DatabaseDescriptor.getCommitLogWriteDiskAccessMode();
573+
DiskAccessMode savedBackgroundWriteDiskAccessMode = DatabaseDescriptor.getBackgroundWriteDiskAccessMode();
558574
SystemInfo savedSystemInfo = FBUtilities.getSystemInfo();
559575
try
560576
{
577+
DatabaseDescriptor.setBackgroundWriteDiskAccessMode(backgroundMode);
561578
DatabaseDescriptor.setCommitLogLocation(commitLogLocation);
562-
DatabaseDescriptor.setCommitLogWriteDiskAccessMode(diskAccessMode);
579+
DatabaseDescriptor.setCommitLogWriteDiskAccessMode(commitLogMode);
563580
DatabaseDescriptor.initializeCommitLogDiskAccessMode();
564-
assertThat(DatabaseDescriptor.getCommitLogWriteDiskAccessMode()).isEqualTo(diskAccessMode);
581+
assertThat(DatabaseDescriptor.getCommitLogWriteDiskAccessMode()).isEqualTo(commitLogMode);
565582
FBUtilities.setSystemInfoSupplier(() -> new SystemInfo()
566583
{
567584
@Override
@@ -570,7 +587,15 @@ public Semver getKernelVersion()
570587
return kernelVersion;
571588
}
572589
});
573-
withPathOverriddingFileSystem(Map.of(commitLogLocation, fsType), () -> {
590+
591+
// Override the filesystem type for every path getDirectIOWritePaths() may return (commit log and
592+
// all data dirs) so the check sees only our synthetic type, never the real test filesystem.
593+
Map<String, String> pathOverrides = new HashMap<>();
594+
pathOverrides.put(commitLogLocation, fsType);
595+
for (String dataDir : DatabaseDescriptor.getAllDataFileLocations())
596+
pathOverrides.put(dataDir, fsType);
597+
598+
withPathOverriddingFileSystem(pathOverrides, () -> {
574599
if (expectToFail)
575600
assertThatExceptionOfType(StartupException.class).isThrownBy(() -> StartupChecks.checkKernelBug1057843.execute(options));
576601
else
@@ -583,6 +608,7 @@ public Semver getKernelVersion()
583608
DatabaseDescriptor.setCommitLogLocation(savedCommitLogLocation);
584609
DatabaseDescriptor.setCommitLogWriteDiskAccessMode(savedCommitLogWriteDiskAccessMode);
585610
DatabaseDescriptor.initializeCommitLogDiskAccessMode();
611+
DatabaseDescriptor.setBackgroundWriteDiskAccessMode(savedBackgroundWriteDiskAccessMode);
586612
FBUtilities.setSystemInfoSupplier(() -> savedSystemInfo);
587613
}
588614
}

0 commit comments

Comments
 (0)