Swap long for int inside Node.Id
patch by Aleksey Yeschenko; reviewed by Benedict Elliott Smith for
CASSANDRA-18135
diff --git a/accord-core/build.gradle b/accord-core/build.gradle
index 146f9fa..32e1164 100644
--- a/accord-core/build.gradle
+++ b/accord-core/build.gradle
@@ -36,7 +36,7 @@
// Dependencies we depend on that are not part of our API.
// These act as runtimeOnly dependencies to users
implementation 'org.slf4j:slf4j-api:1.7.36'
- implementation 'com.carrotsearch:hppc:0.8.1'
+ implementation 'org.agrona:agrona:1.17.1'
}
task burn(type: JavaExec) {
diff --git a/accord-core/src/main/java/accord/local/CommandStores.java b/accord-core/src/main/java/accord/local/CommandStores.java
index 09ad0fc..467e23e 100644
--- a/accord-core/src/main/java/accord/local/CommandStores.java
+++ b/accord-core/src/main/java/accord/local/CommandStores.java
@@ -26,9 +26,9 @@
import accord.utils.MapReduceConsume;
import accord.utils.ReducingFuture;
-import com.carrotsearch.hppc.IntObjectMap;
-import com.carrotsearch.hppc.IntObjectScatterMap;
import com.google.common.annotations.VisibleForTesting;
+import org.agrona.collections.Hashing;
+import org.agrona.collections.Int2ObjectHashMap;
import org.apache.cassandra.utils.concurrent.Future;
import java.util.ArrayList;
@@ -200,14 +200,14 @@
static class Snapshot
{
final ShardHolder[] shards;
- final IntObjectMap<CommandStore> byId;
+ final Int2ObjectHashMap<CommandStore> byId;
final Topology local;
final Topology global;
Snapshot(ShardHolder[] shards, Topology local, Topology global)
{
this.shards = shards;
- this.byId = new IntObjectScatterMap<>(shards.length);
+ this.byId = new Int2ObjectHashMap<>(shards.length, Hashing.DEFAULT_LOAD_FACTOR, true);
for (ShardHolder shard : shards)
byId.put(shard.store.id(), shard.store);
this.local = local;
diff --git a/accord-core/src/main/java/accord/local/Node.java b/accord-core/src/main/java/accord/local/Node.java
index 4ccc05c..70be03a 100644
--- a/accord-core/src/main/java/accord/local/Node.java
+++ b/accord-core/src/main/java/accord/local/Node.java
@@ -57,18 +57,16 @@
import org.apache.cassandra.utils.concurrent.AsyncFuture;
import org.apache.cassandra.utils.concurrent.Future;
-import static accord.primitives.Routable.Domain.Key;
-
public class Node implements ConfigurationService.Listener, NodeTimeService
{
public static class Id implements Comparable<Id>
{
public static final Id NONE = new Id(0);
- public static final Id MAX = new Id(Long.MAX_VALUE);
+ public static final Id MAX = new Id(Integer.MAX_VALUE);
- public final long id;
+ public final int id;
- public Id(long id)
+ public Id(int id)
{
this.id = id;
}
@@ -76,7 +74,7 @@
@Override
public int hashCode()
{
- return Long.hashCode(id);
+ return Integer.hashCode(id);
}
@Override
@@ -93,12 +91,12 @@
@Override
public int compareTo(Id that)
{
- return Long.compare(this.id, that.id);
+ return Integer.compare(this.id, that.id);
}
public String toString()
{
- return Long.toString(id);
+ return Integer.toString(id);
}
}
diff --git a/accord-core/src/main/java/accord/local/Status.java b/accord-core/src/main/java/accord/local/Status.java
index 158bb89..98e9e23 100644
--- a/accord-core/src/main/java/accord/local/Status.java
+++ b/accord-core/src/main/java/accord/local/Status.java
@@ -51,7 +51,8 @@
* So, for execution of other transactions we may treat a PreCommitted transaction as Committed,
* using the timestamp to update our dependency set to rule it out as a dependency.
* But we do not have enough information to execute the transaction, and when recovery calculates
- * {@link BeginRecovery#acceptedStartedBeforeWithoutWitnessing}, {@link BeginRecovery#committedExecutesAfterWithoutWitnessing}
+ * {@link BeginRecovery#acceptedStartedBeforeWithoutWitnessing}, {@link BeginRecovery#hasCommittedExecutesAfterWithoutWitnessing}
+ *
* and {@link BeginRecovery#committedStartedBeforeAndWitnessed} we may not have the dependencies
* to calculate the result. For these operations we treat ourselves as whatever Accepted status
* we may have previously taken, using any proposed dependencies to compute the result.
diff --git a/accord-core/src/main/java/accord/messages/Defer.java b/accord-core/src/main/java/accord/messages/Defer.java
index b7e018e..d28810a 100644
--- a/accord-core/src/main/java/accord/messages/Defer.java
+++ b/accord-core/src/main/java/accord/messages/Defer.java
@@ -24,7 +24,7 @@
import accord.local.Status.Known;
import accord.primitives.TxnId;
import accord.utils.Invariants;
-import com.carrotsearch.hppc.IntHashSet;
+import org.agrona.collections.IntHashSet;
import static accord.messages.Defer.Ready.Expired;
import static accord.messages.Defer.Ready.No;
@@ -36,7 +36,7 @@
final Function<Command, Ready> waitUntil;
final TxnRequest<?> request;
- final IntHashSet waitingOn = new IntHashSet(); // TODO (easy): use Agrona when available
+ final IntHashSet waitingOn = new IntHashSet();
int waitingOnCount;
boolean isDone;
diff --git a/accord-core/src/main/java/accord/utils/ArrayBuffers.java b/accord-core/src/main/java/accord/utils/ArrayBuffers.java
index c021f25..d8261b1 100644
--- a/accord-core/src/main/java/accord/utils/ArrayBuffers.java
+++ b/accord-core/src/main/java/accord/utils/ArrayBuffers.java
@@ -33,7 +33,7 @@
* A set of utility classes and interfaces for managing a collection of buffers for arrays of certain types.
*
* These buffers are designed to be used to combine simple one-shot methods that consume and produce one or more arrays
- * with methods that may (or may not) call them repeatedly. Specifically, {@link accord.primitives.Deps#linearUnion},
+ * with methods that may (or may not) call them repeatedly. Specifically, {@link accord.utils.RelationMultiMap#linearUnion},
* {@link SortedArrays#linearUnion} and {@link SortedArrays#linearIntersection}
*
* To support this efficiently and ergonomically for users of the one-shot methods, the cache management must
diff --git a/accord-core/src/test/java/accord/verify/StrictSerializabilityVerifierTest.java b/accord-core/src/test/java/accord/verify/StrictSerializabilityVerifierTest.java
index c78513f..39e9a4a 100644
--- a/accord-core/src/test/java/accord/verify/StrictSerializabilityVerifierTest.java
+++ b/accord-core/src/test/java/accord/verify/StrictSerializabilityVerifierTest.java
@@ -26,8 +26,6 @@
import java.util.regex.Pattern;
import java.util.stream.Stream;
-import com.carrotsearch.hppc.IntHashSet;
-import com.carrotsearch.hppc.IntSet;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -209,7 +207,6 @@
private void fromLog(String log)
{
- IntSet pks = new IntHashSet();
class Read
{
final int pk, id, count;
@@ -283,10 +280,7 @@
if (line.startsWith("Witness"))
{
if (current != null)
- {
witnesses.add(current);
- current = null;
- }
Matcher matcher = Pattern.compile("Witness\\(start=(.+), end=(.+)\\)").matcher(line);
if (!matcher.find()) throw new AssertionError("Unable to match start/end of " + line);
current = new Witness(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)));
@@ -296,7 +290,6 @@
Matcher matcher = Pattern.compile("\tread\\(pk=(.+), id=(.+), count=(.+), seq=\\[(.*)\\]\\)").matcher(line);
if (!matcher.find()) throw new AssertionError("Unable to match read of " + line);
int pk = Integer.parseInt(matcher.group(1));
- pks.add(pk);
int id = Integer.parseInt(matcher.group(2));
int count = Integer.parseInt(matcher.group(3));
String seqStr = matcher.group(4);
@@ -308,28 +301,22 @@
Matcher matcher = Pattern.compile("\twrite\\(pk=(.+), id=(.+), success=(.+)\\)").matcher(line);
if (!matcher.find()) throw new AssertionError("Unable to match write of " + line);
int pk = Integer.parseInt(matcher.group(1));
- pks.add(pk);
int id = Integer.parseInt(matcher.group(2));
boolean success = Boolean.parseBoolean(matcher.group(3));
current.write(pk, id, success);
}
else
{
- throw new IllegalArgumentException("Unknow line: " + line);
+ throw new IllegalArgumentException("Unknown line: " + line);
}
}
+
if (current != null)
- {
witnesses.add(current);
- current = null;
- }
- int[] keys = pks.toArray();
- Arrays.sort(keys);
+
StrictSerializabilityVerifier validator = new StrictSerializabilityVerifier(3);
for (Witness w : witnesses)
- {
w.process(validator);
- }
}
@Test
diff --git a/accord-maelstrom/src/main/java/accord/maelstrom/Json.java b/accord-maelstrom/src/main/java/accord/maelstrom/Json.java
index 958f895..fcb56df 100644
--- a/accord-maelstrom/src/main/java/accord/maelstrom/Json.java
+++ b/accord-maelstrom/src/main/java/accord/maelstrom/Json.java
@@ -79,8 +79,8 @@
{
switch (id.charAt(0))
{
- case 'c': return new Id(-Long.parseLong(id.substring(1)));
- case 'n':return new Id( Long.parseLong(id.substring(1)));
+ case 'c': return new Id(-Integer.parseInt(id.substring(1)));
+ case 'n':return new Id( Integer.parseInt(id.substring(1)));
default: throw new IllegalStateException();
}
}