This is an automated email from the ASF dual-hosted git repository.
szetszwo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ratis.git
The following commit(s) were added to refs/heads/master by this push:
new e7eed11a9 RATIS-1964. Avoid Ratis internal data from referring to
external input protobuf data (#986)
e7eed11a9 is described below
commit e7eed11a941e149bdf6f4e9b5037f950998c5793
Author: Duong Nguyen <[email protected]>
AuthorDate: Tue Dec 12 20:51:51 2023 -0800
RATIS-1964. Avoid Ratis internal data from referring to external input
protobuf data (#986)
---
.../java/org/apache/ratis/protocol/ClientId.java | 8 ++----
.../org/apache/ratis/protocol/RaftGroupId.java | 8 ++----
.../java/org/apache/ratis/protocol/RaftId.java | 31 +++++++---------------
.../java/org/apache/ratis/protocol/RaftPeerId.java | 7 ++++-
4 files changed, 19 insertions(+), 35 deletions(-)
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 82ae426d5..4de615730 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 @@ import java.util.UUID;
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 @@ public final class ClientId extends RaftId {
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 968b9e500..9caedf757 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 @@ import java.util.UUID;
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 @@ public final class RaftGroupId extends RaftId {
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 161bd830b..9c2a83ffa 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 @@ public abstract class RaftId {
.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 @@ public abstract class RaftId {
private final Supplier<ByteString> uuidBytes;
private final Supplier<String> uuidString;
- private RaftId(UUID uuid, Supplier<ByteString> uuidBytes) {
+ RaftId(UUID uuid) {
this.uuid = Preconditions.assertNotNull(uuid, "uuid");
- this.uuidBytes = uuidBytes;
+ this.uuidBytes = JavaUtils.memoize(() -> toByteString(uuid));
this.uuidString = JavaUtils.memoize(() -> createUuidString(uuid));
- }
-
- RaftId(UUID uuid) {
- this(uuid, JavaUtils.memoize(() -> toByteString(uuid)));
- Preconditions.assertTrue(!uuid.equals(ZERO_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 7458d9339..8098039d1 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 @@ public final class RaftPeerId {
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) {