[ https://issues.apache.org/jira/browse/IGNITE-24981?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17943581#comment-17943581 ]
Roman Puchkovskiy commented on IGNITE-24981: -------------------------------------------- The problem is that, if a zone and a table in that zone are created via a SQL script, they end up in the same catalog version, so the same Metastore revision corresponds to them. Zone creation triggers replica starts for some partitions. The result is that asynchronous parts of 'replica start' and 'table addition' handlers might run concurrently (as the 'events from different Metastore revisions are linearized' rule does not help when both events are triggered with the same revision). The idea of the fix is to acquire zone write lock when handling zone creation. This will make table additions (happening in the same revision) to be linearized after starts of replicas of zone partitions (because table addition acquires zone read lock). > Partition storage is missing on index build with colocation > ----------------------------------------------------------- > > Key: IGNITE-24981 > URL: https://issues.apache.org/jira/browse/IGNITE-24981 > Project: Ignite > Issue Type: Bug > Reporter: Roman Puchkovskiy > Assignee: Roman Puchkovskiy > Priority: Major > Labels: ignite-3 > Time Spent: 20m > Remaining Estimate: 0h > > From time to time the following test > class ItBigZoneStopTest extends ClusterPerTestIntegrationTest { > @Override > protected int initialNodes() { > return 2; > } > @Test > void test() { > Ignite node = cluster.node(0); > node.sql().executeScript( > "CREATE ZONE TEST_ZONE WITH STORAGE_PROFILES='default', PARTITIONS=96;" > + "CREATE TABLE TEST_TABLE(id INT PRIMARY KEY, val VARCHAR(255)) ZONE > TEST_ZONE" > ); > node.sql().execute(null, "SELECT * FROM TEST_TABLE").close(); > } > } > > > fails with the following: > > java.util.concurrent.CompletionException: java.lang.AssertionError: > Partition storage is missing [zoneId=18, tableId=19, partitionId=58]. > at > java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:757) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:731) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:2110) > ~[?:?] > at > org.apache.ignite.internal.index.IndexBuildController.lambda$onPrimaryReplicaElected$7(IndexBuildController.java:280) > ~[main/:?] > at > java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2075) > ~[?:?] > at > org.apache.ignite.internal.util.CompletableFutures.lambda$copyStateTo$2(CompletableFutures.java:160) > ~[main/:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:883) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2253) > ~[?:?] > at > org.apache.ignite.internal.causality.BaseVersionedValue.copyState(BaseVersionedValue.java:335) > ~[main/:?] > at > org.apache.ignite.internal.causality.BaseVersionedValue.complete(BaseVersionedValue.java:219) > ~[main/:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue.lambda$completeInternal$2(IncrementalVersionedValue.java:283) > ~[main/:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:883) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2253) > ~[?:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue.completeInternal(IncrementalVersionedValue.java:283) > ~[main/:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue$1.onUpdate(IncrementalVersionedValue.java:112) > ~[main/:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue.lambda$dependingOn$0(IncrementalVersionedValue.java:83) > ~[main/:?] > at > org.apache.ignite.internal.causality.BaseVersionedValue.lambda$notifyCompletionListeners$6(BaseVersionedValue.java:367) > ~[main/:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:883) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2253) > ~[?:?] > at > org.apache.ignite.internal.causality.BaseVersionedValue.notifyCompletionListeners(BaseVersionedValue.java:362) > ~[main/:?] > at > org.apache.ignite.internal.causality.BaseVersionedValue.complete(BaseVersionedValue.java:228) > ~[main/:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue.lambda$completeInternal$2(IncrementalVersionedValue.java:283) > ~[main/:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:883) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2253) > ~[?:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue.completeInternal(IncrementalVersionedValue.java:283) > ~[main/:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue$1.onUpdate(IncrementalVersionedValue.java:112) > ~[main/:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue.lambda$dependingOn$0(IncrementalVersionedValue.java:83) > ~[main/:?] > at > org.apache.ignite.internal.causality.BaseVersionedValue.lambda$notifyCompletionListeners$6(BaseVersionedValue.java:367) > ~[main/:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:883) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2253) > ~[?:?] > at > org.apache.ignite.internal.causality.BaseVersionedValue.notifyCompletionListeners(BaseVersionedValue.java:362) > ~[main/:?] > at > org.apache.ignite.internal.causality.BaseVersionedValue.complete(BaseVersionedValue.java:228) > ~[main/:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue.lambda$completeInternal$2(IncrementalVersionedValue.java:283) > ~[main/:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:883) > ~[?:?] > at > java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2253) > ~[?:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue.completeInternal(IncrementalVersionedValue.java:283) > ~[main/:?] > at > org.apache.ignite.internal.causality.IncrementalVersionedValue$1.onUpdate(IncrementalVersionedValue.java:112) > ~[main/:?] > at > org.apache.ignite.internal.metastorage.server.WatchProcessor.notifyUpdateRevisionListeners(WatchProcessor.java:377) > ~[main/:?] > > Looks like there is a race between electing a zone primary and creating a > table partition storage for the same partition. -- This message was sent by Atlassian Jira (v8.20.10#820010)