diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 934daecf552..436bf643551 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -58,6 +58,9 @@ Release 2.1.1-beta - UNRELEASED HADOOP-9803. Add a generic type parameter to RetryInvocationHandler. (szetszwo) + HADOOP-9821. ClientId should have getMsb/getLsb methods. + (Tsuyoshi OZAWA via jing9) + OPTIMIZATIONS BUG FIXES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/ClientId.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/ClientId.java index 83df4f932d4..c95dbb9faca 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/ClientId.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/ClientId.java @@ -33,6 +33,7 @@ public class ClientId { /** The byte array of a UUID should be 16 */ public static final int BYTE_LENGTH = 16; + private static final int shiftWidth = 8; /** * Return clientId as byte[] @@ -53,17 +54,27 @@ public class ClientId { } // otherwise should be 16 bytes Preconditions.checkArgument(clientId.length == BYTE_LENGTH); - long msb = 0; - long lsb = 0; - for (int i = 0; i < 8; i++) { - msb = (msb << 8) | (clientId[i] & 0xff); - } - for (int i = 8; i < 16; i++) { - lsb = (lsb << 8) | (clientId[i] & 0xff); - } + long msb = getMsb(clientId); + long lsb = getLsb(clientId); return (new UUID(msb, lsb)).toString(); } + public static long getMsb(byte[] clientId) { + long msb = 0; + for (int i = 0; i < BYTE_LENGTH/2; i++) { + msb = (msb << shiftWidth) | (clientId[i] & 0xff); + } + return msb; + } + + public static long getLsb(byte[] clientId) { + long lsb = 0; + for (int i = BYTE_LENGTH/2; i < BYTE_LENGTH; i++) { + lsb = (lsb << shiftWidth) | (clientId[i] & 0xff); + } + return lsb; + } + /** Convert from clientId string byte[] representation of clientId */ public static byte[] toBytes(String id) { if (id == null || "".equals(id)) { diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/RetryCache.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/RetryCache.java index 173e7bce1bb..aeb7ac174ce 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/RetryCache.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/RetryCache.java @@ -70,16 +70,8 @@ public class RetryCache { "Invalid clientId - length is " + clientId.length + " expected length " + ClientId.BYTE_LENGTH); // Convert UUID bytes to two longs - long tmp = 0; - for (int i=0; i<8; i++) { - tmp = (tmp << 8) | (clientId[i] & 0xff); - } - clientIdMsb = tmp; - tmp = 0; - for (int i=8; i<16; i++) { - tmp = (tmp << 8) | (clientId[i] & 0xff); - } - clientIdLsb = tmp; + clientIdMsb = ClientId.getMsb(clientId); + clientIdLsb = ClientId.getLsb(clientId); this.callId = callId; this.expirationTime = expirationTime; }