RATIS-1964. Avoid Ratis internal data from referring to external input protobuf data (#986)
diff --git a/ratis-common/src/main/java/org/apache/ratis/protocol/ClientId.java b/ratis-common/src/main/java/org/apache/ratis/protocol/ClientId.java
index 82ae426..4de6157 100644
--- a/ratis-common/src/main/java/org/apache/ratis/protocol/ClientId.java
+++ b/ratis-common/src/main/java/org/apache/ratis/protocol/ClientId.java
@@ -28,8 +28,8 @@
public final class ClientId extends RaftId {
private static final Factory<ClientId> FACTORY = new Factory<ClientId>() {
@Override
- ClientId newInstance(UUID uuid, ByteString bytes) {
- return bytes == null? new ClientId(uuid): new ClientId(uuid, bytes);
+ ClientId newInstance(UUID uuid) {
+ return new ClientId(uuid);
}
};
@@ -49,10 +49,6 @@
return FACTORY.valueOf(uuid);
}
- private ClientId(UUID uuid, ByteString bytes) {
- super(uuid, bytes);
- }
-
private ClientId(UUID uuid) {
super(uuid);
}
diff --git a/ratis-common/src/main/java/org/apache/ratis/protocol/RaftGroupId.java b/ratis-common/src/main/java/org/apache/ratis/protocol/RaftGroupId.java
index 968b9e5..9caedf7 100644
--- a/ratis-common/src/main/java/org/apache/ratis/protocol/RaftGroupId.java
+++ b/ratis-common/src/main/java/org/apache/ratis/protocol/RaftGroupId.java
@@ -29,8 +29,8 @@
public final class RaftGroupId extends RaftId {
private static final Factory<RaftGroupId> FACTORY = new Factory<RaftGroupId>() {
@Override
- RaftGroupId newInstance(UUID uuid, ByteString bytes) {
- return bytes == null? new RaftGroupId(uuid) : new RaftGroupId(uuid, bytes);
+ RaftGroupId newInstance(UUID uuid) {
+ return new RaftGroupId(uuid);
}
};
@@ -54,10 +54,6 @@
super(id);
}
- private RaftGroupId(UUID uuid, ByteString bytes) {
- super(uuid, bytes);
- }
-
@Override
String createUuidString(UUID uuid) {
return "group-" + super.createUuidString(uuid);
diff --git a/ratis-common/src/main/java/org/apache/ratis/protocol/RaftId.java b/ratis-common/src/main/java/org/apache/ratis/protocol/RaftId.java
index 161bd83..9c2a83f 100644
--- a/ratis-common/src/main/java/org/apache/ratis/protocol/RaftId.java
+++ b/ratis-common/src/main/java/org/apache/ratis/protocol/RaftId.java
@@ -57,30 +57,26 @@
.weakValues()
.build();
- abstract ID newInstance(UUID uuid, ByteString bytes);
+ abstract ID newInstance(UUID uuid);
- private ID valueOf(UUID uuid, ByteString bytes) {
+ final ID valueOf(UUID uuid) {
try {
- return cache.get(uuid, () -> newInstance(uuid, bytes));
+ return cache.get(uuid, () -> newInstance(uuid));
} catch (ExecutionException e) {
throw new IllegalStateException("Failed to valueOf(" + uuid + ")", e);
}
}
- final ID valueOf(UUID uuid) {
- return valueOf(uuid, null);
- }
-
final ID valueOf(ByteString bytes) {
- return bytes != null? valueOf(toUuid(bytes), bytes): emptyId();
+ return bytes != null? valueOf(toUuid(bytes)): emptyId();
}
ID emptyId() {
- return valueOf(ZERO_UUID, ZERO_UUID_BYTESTRING);
+ return valueOf(ZERO_UUID);
}
ID randomId() {
- return valueOf(UUID.randomUUID(), null);
+ return valueOf(UUID.randomUUID());
}
}
@@ -88,23 +84,14 @@
private final Supplier<ByteString> uuidBytes;
private final Supplier<String> uuidString;
- private RaftId(UUID uuid, Supplier<ByteString> uuidBytes) {
- this.uuid = Preconditions.assertNotNull(uuid, "uuid");
- this.uuidBytes = uuidBytes;
- this.uuidString = JavaUtils.memoize(() -> createUuidString(uuid));
- }
-
RaftId(UUID uuid) {
- this(uuid, JavaUtils.memoize(() -> toByteString(uuid)));
- Preconditions.assertTrue(!uuid.equals(ZERO_UUID),
+ this.uuid = Preconditions.assertNotNull(uuid, "uuid");
+ this.uuidBytes = JavaUtils.memoize(() -> toByteString(uuid));
+ this.uuidString = JavaUtils.memoize(() -> createUuidString(uuid));
+ Preconditions.assertTrue(ZERO_UUID == uuid || !uuid.equals(ZERO_UUID),
() -> "Failed to create " + JavaUtils.getClassSimpleName(getClass()) + ": UUID " + ZERO_UUID + " is reserved.");
}
- RaftId(UUID uuid, ByteString bytes) {
- this(uuid, () -> bytes);
- Preconditions.assertTrue(toUuid(bytes).equals(uuid));
- }
-
/** @return the last 12 hex digits. */
String createUuidString(UUID id) {
final String s = id.toString().toUpperCase();
diff --git a/ratis-common/src/main/java/org/apache/ratis/protocol/RaftPeerId.java b/ratis-common/src/main/java/org/apache/ratis/protocol/RaftPeerId.java
index 7458d93..8098039 100644
--- a/ratis-common/src/main/java/org/apache/ratis/protocol/RaftPeerId.java
+++ b/ratis-common/src/main/java/org/apache/ratis/protocol/RaftPeerId.java
@@ -40,7 +40,12 @@
private static final Map<String, RaftPeerId> STRING_MAP = new ConcurrentHashMap<>();
public static RaftPeerId valueOf(ByteString id) {
- return BYTE_STRING_MAP.computeIfAbsent(id, RaftPeerId::new);
+ final RaftPeerId cached = BYTE_STRING_MAP.get(id);
+ if (cached != null) {
+ return cached;
+ }
+ ByteString cloned = ByteString.copyFrom(id.asReadOnlyByteBuffer());
+ return BYTE_STRING_MAP.computeIfAbsent(cloned, RaftPeerId::new);
}
public static RaftPeerId valueOf(String id) {