[
https://issues.apache.org/jira/browse/CASSANDRA-19779?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17869194#comment-17869194
]
Stefan Miklosovic edited comment on CASSANDRA-19779 at 7/28/24 7:16 PM:
------------------------------------------------------------------------
Good news is that I fixed it for cassandra.yaml, the default config there is
"legacy".
The bad news is that it fails these tests while using *cassandra_latest.yaml*
profile
org.apache.cassandra.repair.ConcurrentIrWithPreviewFuzzTest
org.apache.cassandra.repair.FailedAckTest
org.apache.cassandra.repair.FailingRepairFuzzTest
org.apache.cassandra.repair.HappyPathFuzzTest
org.apache.cassandra.repair.SlowMessageFuzzTest
Exception it throws for all cases is
{code}
java.lang.UnsupportedOperationException
at
java.base/java.nio.file.FileStore.getBlockSize(FileStore.java:158)
at
org.apache.cassandra.io.util.FileUtils.getBlockSize(FileUtils.java:825)
at
org.apache.cassandra.db.commitlog.DirectIOSegment$DirectIOSegmentBuilder.<init>(DirectIOSegment.java:166)
at
org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.createSegmentBuilder(AbstractCommitLogSegmentManager.java:135)
at
org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.start(AbstractCommitLogSegmentManager.java:154)
at
org.apache.cassandra.db.commitlog.CommitLog.start(CommitLog.java:146)
at
org.apache.cassandra.db.commitlog.CommitLog.restartUnsafe(CommitLog.java:563)
at
org.apache.cassandra.ServerTestUtils.cleanupAndLeaveDirs(ServerTestUtils.java:148)
at
org.apache.cassandra.ServerTestUtils.prepareServer(ServerTestUtils.java:106)
at
org.apache.cassandra.cql3.CQLTester.prepareServer(CQLTester.java:360)
at
org.apache.cassandra.cql3.CQLTester.setUpClass(CQLTester.java:411)
at
org.apache.cassandra.cql3.CQLTester$InMemory.setUpClass(CQLTester.java:2876)
at
org.apache.cassandra.repair.FuzzTestBase.setUpClass(FuzzTestBase.java:280)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
{code}
The reason this is happening is that it uses "InMemory.setUpClass" (5th line
from the bottom). That does this:
{code}
@BeforeClass
public static void setUpClass()
{
fs = FileSystems.newGlobalInMemoryFileSystem();
CassandraRelevantProperties.IGNORE_MISSING_NATIVE_FILE_HINTS.setBoolean(true);
FileSystems.maybeCreateTmp();
CQLTester.setUpClass();
}
{code}
So, when it is "auto", previously, this failure was hidden, because commitlog
dir was not created, hence "directIOSupported" was evaluated to false (the case
described in the previous comment), so these tests have probably ever run with
"legacy" only. So once we want to enable that, it does not play together,
because here "FileUtils.getBlockSize" fails with UnsupportedOperationException
because it is most probably not supported in
"FileSystems.newGlobalInMemoryFileSystem();".
{code}
public DirectIOSegmentBuilder(AbstractCommitLogSegmentManager
segmentManager)
{
this(segmentManager, FileUtils.getBlockSize(new
File(segmentManager.storageDirectory)));
}
{code}
I am trying to figure out what to do. This also means that we have never fuzz
tested "direct" mode for cassandra_latest.yaml because it the missing commitlog
dir never triggered it.
was (Author: smiklosovic):
Good news is that I fixed it for cassandra.yaml, the default config there is
"legacy".
The bad news is that it fails these tests while using *cassandra_latest.yaml*
profile
org.apache.cassandra.repair.ConcurrentIrWithPreviewFuzzTest
org.apache.cassandra.repair.FailedAckTest
org.apache.cassandra.repair.FailingRepairFuzzTest
org.apache.cassandra.repair.HappyPathFuzzTest
org.apache.cassandra.repair.SlowMessageFuzzTest
Exception it throws for all cases is
{code}
java.lang.UnsupportedOperationException
at
java.base/java.nio.file.FileStore.getBlockSize(FileStore.java:158)
at
org.apache.cassandra.io.util.FileUtils.getBlockSize(FileUtils.java:825)
at
org.apache.cassandra.db.commitlog.DirectIOSegment$DirectIOSegmentBuilder.<init>(DirectIOSegment.java:166)
at
org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.createSegmentBuilder(AbstractCommitLogSegmentManager.java:135)
at
org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager.start(AbstractCommitLogSegmentManager.java:154)
at
org.apache.cassandra.db.commitlog.CommitLog.start(CommitLog.java:146)
at
org.apache.cassandra.db.commitlog.CommitLog.restartUnsafe(CommitLog.java:563)
at
org.apache.cassandra.ServerTestUtils.cleanupAndLeaveDirs(ServerTestUtils.java:148)
at
org.apache.cassandra.ServerTestUtils.prepareServer(ServerTestUtils.java:106)
at
org.apache.cassandra.cql3.CQLTester.prepareServer(CQLTester.java:360)
at
org.apache.cassandra.cql3.CQLTester.setUpClass(CQLTester.java:411)
at
org.apache.cassandra.cql3.CQLTester$InMemory.setUpClass(CQLTester.java:2876)
at
org.apache.cassandra.repair.FuzzTestBase.setUpClass(FuzzTestBase.java:280)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
{code}
The reason this is happening is that it uses "InMemory.setUpClass" (5th line
from the bottom). That does this:
{code}
@BeforeClass
public static void setUpClass()
{
fs = FileSystems.newGlobalInMemoryFileSystem();
CassandraRelevantProperties.IGNORE_MISSING_NATIVE_FILE_HINTS.setBoolean(true);
FileSystems.maybeCreateTmp();
CQLTester.setUpClass();
}
{code}
So, when it is "auto", previously, this failure was hidden, because commitlog
dir was not created, hence "directIOSupported" was evaluated to false (the case
described in the previous comment), so these test have probably ever run with
"legacy" only. So once we want to enable that, it does not play together,
because here "FileUtils.getBlockSize" fails with UnsupportedOperationException
because it is most probably not supported in
"FileSystems.newGlobalInMemoryFileSystem();".
{code}
public DirectIOSegmentBuilder(AbstractCommitLogSegmentManager
segmentManager)
{
this(segmentManager, FileUtils.getBlockSize(new
File(segmentManager.storageDirectory)));
}
{code}
I am trying to figure out what to do. This also means that we have never fuzz
tested "direct" mode for cassandra_latest.yaml because it the missing commitlog
dir never triggered it.
> direct IO support is always evaluated to false upon the very first start of a
> node
> ----------------------------------------------------------------------------------
>
> Key: CASSANDRA-19779
> URL: https://issues.apache.org/jira/browse/CASSANDRA-19779
> Project: Cassandra
> Issue Type: Bug
> Components: Legacy/Tools
> Reporter: Stefan Miklosovic
> Assignee: Stefan Miklosovic
> Priority: Normal
> Fix For: 5.0-rc
>
> Time Spent: 10m
> Remaining Estimate: 0h
>
> When I extract the distribution tarball and I want to use tools in tools/bin,
> there is this warn log visible every time for tools when they are started
> (does not happen on "help" command, obviously)
> {code:java}
> WARN 14:25:11,835 Unable to determine block size for commit log directory:
> null {code}
> This is because we introduced this (1) in CASSANDRA-18464
> What that does is that it will go and try to create a temporary file in
> commit log directory to get "block size" for a "file store" that file is in.
> The problem with that is that when we just extract a tarball and run the
> tools - Cassandra was never started - then such commit log directory does not
> exist yet, so it tries to create a temporary file in a non-existing
> directory, which fails, hence the log message.
> The fix is to check if commitlog dir exists and return / skip the resolution
> of block size if it does not.
> Another approach might be to check if this is executed in the context of a
> tool and skip it from resolution altogether. The problem with this is that
> not all tools we have in bin/log call DatabaseDescriptor.
> toolInitialization() so we might combine these two.
> (1)
> [https://github.com/apache/cassandra/blob/cassandra-5.0/src/java/org/apache/cassandra/config/DatabaseDescriptor.java#L1455-L1462]
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]