You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Split out of #5630, which classified Bolt5002RoutingTableIT.neo4jSchemeRoutesReadsAndWrites as an "unsettled replication" flake wanting a bounded poll. That classification is wrong - the state never settles, so this is a real defect and not a test-hardening problem.
Evidence
PR #5704 added a poll over every started node, waiting up to 60 s for the Bolt5002Route type and its single record after the routed write. CI (run 30706875826, integration-tests):
org.awaitility.core.ConditionTimeoutException:
Assertion condition defined as a Lambda expression in com.arcadedb.bolt.Bolt5002RoutingTableIT
[server 1 must have replicated type Bolt5002Route]
Expecting value to be true but was false within 1 minutes
at Bolt5002RoutingTableIT.awaitTypeReplicatedOnEveryNode(Bolt5002RoutingTableIT.java:187)
at Bolt5002RoutingTableIT.neo4jSchemeRoutesReadsAndWrites(Bolt5002RoutingTableIT.java:140)
Suppressed: com.arcadedb.database.DatabaseComparator$DatabaseAreNotIdentical:
Types: DB1 6 <> DB2 5
at DatabaseComparator.compareTypes(DatabaseComparator.java:129)
at BaseGraphServerTest.checkDatabasesAreIdentical(BaseGraphServerTest.java:560)
Two independent signals for the same divergence:
Server 1 does not have the type after 60 seconds of polling. Not lag.
The poll was reverted in #5704 (the file there is byte-identical to main); polling would only have turned a fast failure into a slow one.
Reproduction
Bolt5002RoutingTableIT.neo4jSchemeRoutesReadsAndWrites. The write is a Cypher CREATE (n:Bolt5002Route {name: 'routed'}) issued through a neo4j:// driver session against the leader, which implicitly creates the vertex type. It passes when run in isolation (#5630 reports 3/3) and fails under a loaded CI runner, so it is load- or timing-sensitive rather than deterministic.
Where to look first
Hypothesis, not a diagnosis. This has the shape of the #5492 / #5655 family: code that commits while holding the inner LocalDatabase instead of the wrapped replicated instance applies its pages locally and replicates nothing, and nothing throws at the point of the mistake.
ha-raft/CLAUDE.md documents the rule and getWrappedDatabaseInstance() as the always-correct resolution. #5655 fixed exactly this for Cypher statements (commit 7469a24) and #5492 for SQL (e64160a) - both are already in main, so if this is the same family it is a path those did not cover. The implicit type creation on the Bolt write path is worth checking specifically, since the record and the schema entry may not travel the same route.
Worth confirming before assuming: whether the record replicates while only the type does not.
Split out of #5630, which classified
Bolt5002RoutingTableIT.neo4jSchemeRoutesReadsAndWritesas an "unsettled replication" flake wanting a bounded poll. That classification is wrong - the state never settles, so this is a real defect and not a test-hardening problem.Evidence
PR #5704 added a poll over every started node, waiting up to 60 s for the
Bolt5002Routetype and its single record after the routed write. CI (run 30706875826,integration-tests):Two independent signals for the same divergence:
Types: DB1 6 <> DB2 5that [Misc] Flaky CI tests: wall-clock budgets, short read timeouts, and unsettled counters #5630 recorded as a suppressed error.The poll was reverted in #5704 (the file there is byte-identical to
main); polling would only have turned a fast failure into a slow one.Reproduction
Bolt5002RoutingTableIT.neo4jSchemeRoutesReadsAndWrites. The write is a CypherCREATE (n:Bolt5002Route {name: 'routed'})issued through aneo4j://driver session against the leader, which implicitly creates the vertex type. It passes when run in isolation (#5630 reports 3/3) and fails under a loaded CI runner, so it is load- or timing-sensitive rather than deterministic.Where to look first
Hypothesis, not a diagnosis. This has the shape of the #5492 / #5655 family: code that commits while holding the inner
LocalDatabaseinstead of the wrapped replicated instance applies its pages locally and replicates nothing, and nothing throws at the point of the mistake.ha-raft/CLAUDE.mddocuments the rule andgetWrappedDatabaseInstance()as the always-correct resolution. #5655 fixed exactly this for Cypher statements (commit 7469a24) and #5492 for SQL (e64160a) - both are already inmain, so if this is the same family it is a path those did not cover. The implicit type creation on the Bolt write path is worth checking specifically, since the record and the schema entry may not travel the same route.Worth confirming before assuming: whether the record replicates while only the type does not.