ACCUMULO-4113 Fix ByteBuffer misuse thats occurs in 1.8 and not in 1.7
Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/739f906c Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/739f906c Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/739f906c Branch: refs/heads/master Commit: 739f906cfba9ca300f615f820f588de3f195cff9 Parents: 90a4c61 Author: Keith Turner <ktur...@apache.org> Authored: Wed Jan 20 14:40:43 2016 -0500 Committer: Keith Turner <ktur...@apache.org> Committed: Wed Jan 20 14:40:43 2016 -0500 ---------------------------------------------------------------------- .../org/apache/accumulo/core/util/ByteBufferUtil.java | 8 ++++++++ .../org/apache/accumulo/core/util/ByteBufferUtilTest.java | 10 ++++++++++ .../replication/BatchWriterReplicationReplayer.java | 4 ++-- .../org/apache/accumulo/test/proxy/SimpleProxyBase.java | 8 ++++---- 4 files changed, 24 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/accumulo/blob/739f906c/core/src/main/java/org/apache/accumulo/core/util/ByteBufferUtil.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/util/ByteBufferUtil.java b/core/src/main/java/org/apache/accumulo/core/util/ByteBufferUtil.java index 85c3e12..006755f 100644 --- a/core/src/main/java/org/apache/accumulo/core/util/ByteBufferUtil.java +++ b/core/src/main/java/org/apache/accumulo/core/util/ByteBufferUtil.java @@ -18,6 +18,7 @@ package org.apache.accumulo.core.util; import static java.nio.charset.StandardCharsets.UTF_8; +import java.io.ByteArrayInputStream; import java.io.DataOutput; import java.io.IOException; import java.nio.ByteBuffer; @@ -102,6 +103,13 @@ public class ByteBufferUtil { } else { out.write(toBytes(buffer)); } + } + public static ByteArrayInputStream toByteArrayInputStream(ByteBuffer buffer){ + if (buffer.hasArray()) { + return new ByteArrayInputStream(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining()); + } else { + return new ByteArrayInputStream(toBytes(buffer)); + } } } http://git-wip-us.apache.org/repos/asf/accumulo/blob/739f906c/core/src/test/java/org/apache/accumulo/core/util/ByteBufferUtilTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/accumulo/core/util/ByteBufferUtilTest.java b/core/src/test/java/org/apache/accumulo/core/util/ByteBufferUtilTest.java index f27a1ba..d6e1b35 100644 --- a/core/src/test/java/org/apache/accumulo/core/util/ByteBufferUtilTest.java +++ b/core/src/test/java/org/apache/accumulo/core/util/ByteBufferUtilTest.java @@ -17,6 +17,7 @@ package org.apache.accumulo.core.util; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -54,6 +55,15 @@ public class ByteBufferUtilTest { } Assert.assertEquals(expected, new String(baos.toByteArray(), Charsets.UTF_8)); + + ByteArrayInputStream bais = ByteBufferUtil.toByteArrayInputStream(bb); + byte[] buffer = new byte[expected.length()]; + try { + bais.read(buffer); + Assert.assertEquals(expected, new String(buffer, Charsets.UTF_8)); + } catch (IOException e) { + throw new RuntimeException(e); + } } @Test http://git-wip-us.apache.org/repos/asf/accumulo/blob/739f906c/server/tserver/src/main/java/org/apache/accumulo/tserver/replication/BatchWriterReplicationReplayer.java ---------------------------------------------------------------------- diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/replication/BatchWriterReplicationReplayer.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/replication/BatchWriterReplicationReplayer.java index 8a80ea3..e5e9e80 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/replication/BatchWriterReplicationReplayer.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/replication/BatchWriterReplicationReplayer.java @@ -16,7 +16,6 @@ */ package org.apache.accumulo.tserver.replication; -import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import java.nio.ByteBuffer; @@ -40,6 +39,7 @@ import org.apache.accumulo.core.replication.thrift.RemoteReplicationErrorCode; import org.apache.accumulo.core.replication.thrift.RemoteReplicationException; import org.apache.accumulo.core.replication.thrift.WalEdits; import org.apache.accumulo.core.security.ColumnVisibility; +import org.apache.accumulo.core.util.ByteBufferUtil; import org.apache.accumulo.server.data.ServerMutation; import org.apache.accumulo.tserver.logger.LogFileKey; import org.apache.accumulo.tserver.logger.LogFileValue; @@ -64,7 +64,7 @@ public class BatchWriterReplicationReplayer implements AccumuloReplicationReplay long mutationsApplied = 0l; try { for (ByteBuffer edit : data.getEdits()) { - DataInputStream dis = new DataInputStream(new ByteArrayInputStream(edit.array())); + DataInputStream dis = new DataInputStream(ByteBufferUtil.toByteArrayInputStream(edit)); try { key.readFields(dis); // TODO this is brittle because AccumuloReplicaSystem isn't actually calling LogFileValue.write, but we're expecting http://git-wip-us.apache.org/repos/asf/accumulo/blob/739f906c/test/src/main/java/org/apache/accumulo/test/proxy/SimpleProxyBase.java ---------------------------------------------------------------------- diff --git a/test/src/main/java/org/apache/accumulo/test/proxy/SimpleProxyBase.java b/test/src/main/java/org/apache/accumulo/test/proxy/SimpleProxyBase.java index 8c6811f..5c892ef 100644 --- a/test/src/main/java/org/apache/accumulo/test/proxy/SimpleProxyBase.java +++ b/test/src/main/java/org/apache/accumulo/test/proxy/SimpleProxyBase.java @@ -16,6 +16,7 @@ */ package org.apache.accumulo.test.proxy; +import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -126,7 +127,6 @@ import org.slf4j.LoggerFactory; import com.google.common.collect.Iterators; import com.google.common.net.HostAndPort; -import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly; /** * Call every method on the proxy and try to verify that it works. @@ -1188,7 +1188,7 @@ public abstract class SimpleProxyBase extends SharedMiniClusterBase { if (!isKerberosEnabled()) { password = s2bb(""); client.changeLocalUserPassword(creds, user, password); - assertTrue(client.authenticateUser(creds, user, s2pp(new String(password.array(), password.position(), password.limit(), UTF_8)))); + assertTrue(client.authenticateUser(creds, user, s2pp(ByteBufferUtil.toString(password)))); } if (isKerberosEnabled()) { @@ -1207,7 +1207,7 @@ public abstract class SimpleProxyBase extends SharedMiniClusterBase { } } else { // check login with new password - client.login(user, s2pp(new String(password.array(), password.position(), password.limit(), UTF_8))); + client.login(user, s2pp(ByteBufferUtil.toString(password))); } } @@ -1242,7 +1242,7 @@ public abstract class SimpleProxyBase extends SharedMiniClusterBase { userName = getUniqueNames(1)[0]; // create a user client.createLocalUser(creds, userName, password); - user = client.login(userName, s2pp(new String(password.array(), password.position(), password.limit(), UTF_8))); + user = client.login(userName, s2pp(ByteBufferUtil.toString(password))); } // check permission failure