[ 
https://issues.apache.org/jira/browse/CASSANDRA-20445?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ruslan Fomkin reassigned CASSANDRA-20445:
-----------------------------------------

    Assignee: Ruslan Fomkin

> Failures on creating index with too long names
> ----------------------------------------------
>
>                 Key: CASSANDRA-20445
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-20445
>             Project: Apache Cassandra
>          Issue Type: Bug
>          Components: CQL/Semantics
>            Reporter: Ruslan Fomkin
>            Assignee: Ruslan Fomkin
>            Priority: Normal
>
> Creating any index with long index name is problematic, since index names are 
> used in file names, thus leading to too long file name errors.
> Creating i2 index with a name of 255 characters or longer fails on the create 
> index statement.
> Creating SAI index with a name of ~222 characters or longer fails on flush.
> Creating SASI index with a name of ~241 characters or longer produces 
> incorrect result after flush, while log contains an exception similar to the 
> SAI flush error. The incorrect result issue was introduced by ignoring 
> exceptions during SASI flush in 
> https://issues.apache.org/jira/browse/CASSANDRA-11383
> Index name length was never validated to my understanding, however, it is 
> used in file names. The bug might exist from version 3.
> The following test reproduces the problem on trunk:
>  
> {code:java}
> @RunWith(Parameterized.class)
> public class IndexNameTest extends CQLTester
> {
>     @Parameterized.Parameter(0)
>     public String createIndexQuery;
>     @Parameterized.Parameter(1)
>     public int maxLength;
>     @Parameterized.Parameters(name = "{0}")
>     public static List<Object[]> parameters()
>     {
>         return List.of(
>         new Object[]{ "CREATE INDEX %s ON %s(%s)", 255 },
>         new Object[]{ "CREATE CUSTOM INDEX %s ON %s(%s) USING 
> 'org.apache.cassandra.index.sasi.SASIIndex'", 213 },
>         new Object[]{ "CREATE CUSTOM INDEX %s ON %s(%s) USING 
> 'StorageAttachedIndex'", 190 }
>         );
>     }  
> @Test
> public void testMaxAcceptableLongNamesNewIndex() throws Throwable
> {
>     String longName = "a".repeat(maxLength);
>     createTable("CREATE TABLE %s (" +
>                 "key int PRIMARY KEY," +
>                 "value int)"
>     );
>     createIndex(String.format(createIndexQuery, longName, "%s", "value"));
>     execute(String.format("INSERT INTO %%s (\"key\", %s) VALUES (1, 1)", 
> "value"));
>     execute(String.format("INSERT INTO %%s (\"key\", %s) VALUES (2, 2)", 
> "value"));
>     assertRows(execute(String.format("SELECT key, %s FROM %%s WHERE %<s = 1", 
> "value")), row(1, 1));
>     flush();
>     assertRows(execute(String.format("SELECT key, %s FROM %%s WHERE %<s = 1", 
> "value")), row(1, 1));
> }
> } {code}
> For i2 the error is:
>  
>  
> {code:java}
> ERROR [GlobalLogFollower] 2025-03-17 18:33:55,716 Directories.java:276 - 
> Failed to create 
> build/test/cassandra/data/cql_test_keyspace/table_testmaxacceptablelongnamesnewindex_crea_00-1b255f4def2540a60000000000000006/.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>  directory
> {code}
> {code:java}
> java.lang.RuntimeException: Failed to list files in 
> build/test/cassandra/data/cql_test_keyspace/table_testmaxacceptablelongnamesnewindex_crea_00-1b255f4def2540a60000000000000006/.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>     at 
> org.apache.cassandra.db.lifecycle.LogAwareFileLister.list(LogAwareFileLister.java:77)
>     at 
> org.apache.cassandra.db.lifecycle.LifecycleTransaction.getFiles(LifecycleTransaction.java:636)
>     at 
> org.apache.cassandra.db.Directories$SSTableLister.filter(Directories.java:1139)
>     at 
> org.apache.cassandra.db.Directories$SSTableLister.list(Directories.java:1086)
>     at 
> org.apache.cassandra.db.Directories$SSTableLister.list(Directories.java:1072)
>     at 
> org.apache.cassandra.db.Directories.lambda$getUIDGenerator$5(Directories.java:1297)
>     at 
> java.base/java.util.stream.AbstractPipeline.sourceSpliterator(AbstractPipeline.java:405)
>     at 
> java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>     at java.base/java.util.stream.IntPipeline.reduce(IntPipeline.java:496)
>     at java.base/java.util.stream.IntPipeline.max(IntPipeline.java:459)
>     at 
> org.apache.cassandra.io.sstable.SequenceBasedSSTableId$Builder.generator(SequenceBasedSSTableId.java:102)
>     at 
> org.apache.cassandra.db.Directories.getUIDGenerator(Directories.java:1302)
>     at 
> org.apache.cassandra.db.ColumnFamilyStore.createColumnFamilyStore(ColumnFamilyStore.java:768)
>     at 
> org.apache.cassandra.db.ColumnFamilyStore.createColumnFamilyStore(ColumnFamilyStore.java:756)
>     at 
> org.apache.cassandra.index.internal.CassandraIndex.setMetadata(CassandraIndex.java:235)
>     at 
> org.apache.cassandra.index.internal.CassandraIndex.<init>(CassandraIndex.java:85)
>     at 
> org.apache.cassandra.index.internal.composites.RegularColumnIndex.<init>(RegularColumnIndex.java:53)
>     at 
> org.apache.cassandra.index.internal.CassandraIndexFunctions$2.newIndexInstance(CassandraIndexFunctions.java:121)
>     at 
> org.apache.cassandra.index.internal.CassandraIndex.newIndex(CassandraIndex.java:763)
>     at 
> org.apache.cassandra.index.SecondaryIndexManager.createInstance(SecondaryIndexManager.java:894)
>     at 
> org.apache.cassandra.index.SecondaryIndexManager.createIndex(SecondaryIndexManager.java:224)
>     at 
> org.apache.cassandra.index.SecondaryIndexManager.addIndex(SecondaryIndexManager.java:293)
>     at 
> org.apache.cassandra.index.SecondaryIndexManager.reload(SecondaryIndexManager.java:210)
>     at 
> org.apache.cassandra.db.ColumnFamilyStore.reload(ColumnFamilyStore.java:392)
>     at 
> org.apache.cassandra.schema.DistributedSchema.alterTable(DistributedSchema.java:353)
>     at 
> org.apache.cassandra.schema.DistributedSchema.lambda$initializeKeyspaceInstances$8(DistributedSchema.java:217)
>     at com.google.common.collect.ImmutableList.forEach(ImmutableList.java:422)
>     at 
> org.apache.cassandra.schema.DistributedSchema.lambda$initializeKeyspaceInstances$10(DistributedSchema.java:217)
>     at com.google.common.collect.ImmutableList.forEach(ImmutableList.java:422)
>     at 
> org.apache.cassandra.schema.DistributedSchema.initializeKeyspaceInstances(DistributedSchema.java:199)
>     at 
> org.apache.cassandra.tcm.listeners.SchemaListener.notifyInternal(SchemaListener.java:50)
>     at 
> org.apache.cassandra.tcm.listeners.SchemaListener.notifyPreCommit(SchemaListener.java:43)
>     at 
> org.apache.cassandra.tcm.log.LocalLog.notifyPreCommit(LocalLog.java:626)
>     at 
> org.apache.cassandra.tcm.log.LocalLog.processPendingInternal(LocalLog.java:527)
>     at 
> org.apache.cassandra.tcm.log.LocalLog$Async$AsyncRunnable.run(LocalLog.java:819)
>     at 
> org.apache.cassandra.concurrent.InfiniteLoopExecutor.loop(InfiniteLoopExecutor.java:121)
>     at 
> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
>     at java.base/java.lang.Thread.run(Thread.java:829)
>  {code}
> For SAI:
> {code:java}
> ERROR [MemtableFlushWriter:1] 2025-03-17 19:04:01,654 
> MemtableIndexWriter.java:157 - 
> [cql_test_keyspace.table_testmaxacceptablelongnamesnewindex_crea_01.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]
>  Error while flushing index java.nio.file.FileSystemException: 
> /Users/ruslan/GitRepos/Apache/cassandra/build/test/cassandra/data/cql_test_keyspace/table_testmaxacceptablelongnamesnewindex_crea_01-1b255f4def2540a6000000000000000b/oa-1-big-SAI+aa+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+ColumnComplete.db:
>  File name too long
> java.lang.RuntimeException: java.nio.file.FileSystemException: 
> /Users/ruslan/GitRepos/Apache/cassandra/build/test/cassandra/data/cql_test_keyspace/table_testmaxacceptablelongnamesnewindex_crea_01-1b255f4def2540a6000000000000000b/oa-1-big-SAI+aa+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+ColumnComplete.db:
>  File name too long
>     at 
> org.apache.cassandra.io.util.SequentialWriter.openChannel(SequentialWriter.java:133)
>     at 
> org.apache.cassandra.io.util.SequentialWriter.<init>(SequentialWriter.java:166)
>     at 
> org.apache.cassandra.io.util.SequentialWriter.<init>(SequentialWriter.java:155)
>     at 
> org.apache.cassandra.index.sai.disk.io.IndexFileUtils$ChecksummingWriter.<init>(IndexFileUtils.java:108)
>     at 
> org.apache.cassandra.index.sai.disk.io.IndexFileUtils.openOutput(IndexFileUtils.java:64)
>     at 
> org.apache.cassandra.index.sai.disk.format.IndexDescriptor.openPerIndexOutput(IndexDescriptor.java:252)
>     at 
> org.apache.cassandra.index.sai.disk.format.IndexDescriptor.openPerIndexOutput(IndexDescriptor.java:242)
>     at 
> org.apache.cassandra.index.sai.disk.v1.ColumnCompletionMarkerUtil.create(ColumnCompletionMarkerUtil.java:51)
>     at 
> org.apache.cassandra.index.sai.disk.v1.MemtableIndexWriter.completeIndexFlush(MemtableIndexWriter.java:219)
>     at 
> org.apache.cassandra.index.sai.disk.v1.MemtableIndexWriter.complete(MemtableIndexWriter.java:151)
>     at 
> org.apache.cassandra.index.sai.disk.StorageAttachedIndexWriter.complete(StorageAttachedIndexWriter.java:185)
>     at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
>     at 
> java.base/java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1085)
>     at 
> org.apache.cassandra.io.sstable.format.SSTableWriter.commit(SSTableWriter.java:289)
>     at 
> org.apache.cassandra.io.sstable.SimpleSSTableMultiWriter.commit(SimpleSSTableMultiWriter.java:90)
>     at 
> org.apache.cassandra.db.ColumnFamilyStore$Flush.flushMemtable(ColumnFamilyStore.java:1352)
>     at 
> org.apache.cassandra.db.ColumnFamilyStore$Flush.run(ColumnFamilyStore.java:1251)
>     at 
> org.apache.cassandra.concurrent.ExecutionFailure$1.run(ExecutionFailure.java:133)
>     at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>     at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>     at 
> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
>     at java.base/java.lang.Thread.run(Thread.java:829)
>  {code}
> For SASI assertion failure
> {code:java}
> java.lang.AssertionError: Got less rows than expected. Expected 1 but got 0
>       at org.junit.Assert.fail(Assert.java:88)        at 
> org.junit.Assert.assertTrue(Assert.java:41)  at 
> org.apache.cassandra.cql3.CQLTester.assertRows(CQLTester.java:2115)  at 
> org.apache.cassandra.index.IndexNameTest.testMaxAcceptableLongNamesNewIndex(IndexNameTest.java:67)
>    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
> Method)       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>      at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>      at java.base/java.lang.reflect.Method.invoke(Method.java:566)   at 
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
>  at 
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
>   at 
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
>    at 
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
>     at 
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
>        at 
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)  
> at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)  at 
> org.junit.rules.RunRules.evaluate(RunRules.java:20)  at 
> org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)        at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
>     at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
>     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)  at 
> org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)      at 
> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)    at 
> org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)      at 
> org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)     at 
> org.junit.runners.ParentRunner.run(ParentRunner.java:363)    at 
> org.junit.runners.Suite.runChild(Suite.java:128)     at 
> org.junit.runners.Suite.runChild(Suite.java:27)      at 
> org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)  at 
> org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)      at 
> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)    at 
> org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)      at 
> org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)     at 
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
>        at 
> org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)  
> at org.junit.runners.ParentRunner.run(ParentRunner.java:363)    at 
> org.junit.runner.JUnitCore.run(JUnitCore.java:137)   at 
> com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
>    at 
> com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
>       at 
> com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)  
> at 
> com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
>     at 
> com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
>      at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
>  {code}
> and an exception in the log
> {code:java}
> ERROR [SASI-Memtable:1] 2025-03-17 19:05:23,968 
> PerSSTableIndexWriter.java:270 - Failed to build index segment 
> /Users/ruslan/GitRepos/Apache/cassandra/build/test/cassandra/data/cql_test_keyspace/table_testmaxacceptablelongnamesnewindex_crea_00-1b255f4def2540a60000000000000006/oa-1-big-SI_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.db
> java.lang.RuntimeException: java.nio.file.FileSystemException: 
> /Users/ruslan/GitRepos/Apache/cassandra/build/test/cassandra/data/cql_test_keyspace/table_testmaxacceptablelongnamesnewindex_crea_00-1b255f4def2540a60000000000000006/oa-1-big-SI_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.db:
>  File name too long
>     at 
> org.apache.cassandra.io.util.SequentialWriter.openChannel(SequentialWriter.java:133)
>     at 
> org.apache.cassandra.io.util.SequentialWriter.<init>(SequentialWriter.java:166)
>     at 
> org.apache.cassandra.io.util.SequentialWriter.<init>(SequentialWriter.java:155)
>     at 
> org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder.finish(OnDiskIndexBuilder.java:272)
>     at 
> org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder.finish(OnDiskIndexBuilder.java:262)
>     at 
> org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder.finish(OnDiskIndexBuilder.java:242)
>     at 
> org.apache.cassandra.index.sasi.disk.PerSSTableIndexWriter$Index.lambda$scheduleSegmentFlush$0(PerSSTableIndexWriter.java:266)
>     at 
> org.apache.cassandra.index.sasi.disk.PerSSTableIndexWriter$Index.lambda$complete$1(PerSSTableIndexWriter.java:295)
>     at org.apache.cassandra.concurrent.FutureTask$2.call(FutureTask.java:124)
>     at org.apache.cassandra.concurrent.FutureTask.call(FutureTask.java:61)
>     at org.apache.cassandra.concurrent.FutureTask.run(FutureTask.java:71)
>     at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>     at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>     at 
> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
>     at java.base/java.lang.Thread.run(Thread.java:829)
>  {code}
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to