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) {