@@ -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