You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by gj...@apache.org on 2019/03/12 23:44:54 UTC

[phoenix] branch 4.x-HBase-1.2 updated: PHOENIX-5188 - IndexedKeyValue should populate KeyValue fields

This is an automated email from the ASF dual-hosted git repository.

gjacoby pushed a commit to branch 4.x-HBase-1.2
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/4.x-HBase-1.2 by this push:
     new dbadc51  PHOENIX-5188 - IndexedKeyValue should populate KeyValue fields
dbadc51 is described below

commit dbadc517ba699cde7e7c0a82ce7c6346a6002279
Author: Geoffrey Jacoby <gj...@apache.org>
AuthorDate: Tue Mar 12 11:17:50 2019 -0700

    PHOENIX-5188 - IndexedKeyValue should populate KeyValue fields
---
 .../phoenix/hbase/index/wal/IndexedKeyValue.java   | 25 ++++++++
 .../regionserver/wal/IndexedKeyValueTest.java      | 67 ++++++++++++++++++++++
 2 files changed, 92 insertions(+)

diff --git a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/wal/IndexedKeyValue.java b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/wal/IndexedKeyValue.java
index b04cf0a..f01dc06 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/wal/IndexedKeyValue.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/wal/IndexedKeyValue.java
@@ -53,6 +53,7 @@ public class IndexedKeyValue extends KeyValue {
     public IndexedKeyValue() {}
 
     public IndexedKeyValue(byte[] bs, Mutation mutation) {
+        super(mutation.getRow(), 0, mutation.getRow().length);
         this.indexTableName = new ImmutableBytesPtr(bs);
         this.mutation = mutation;
         this.hashCode = calcHashCode(indexTableName, mutation);
@@ -117,6 +118,24 @@ public class IndexedKeyValue extends KeyValue {
     }
 
     @Override
+    public int getRowOffset() {
+        return this.offset;
+    }
+
+    @Override
+    public short getRowLength() {
+        return (short) this.length;
+    }
+
+    @Override
+    public int getKeyLength(){
+        //normally the key is row key + other key fields such as timestamp,
+        // but those aren't defined here because a Mutation can contain multiple,
+        // so we just return the length of the row key
+        return this.length;
+    }
+
+    @Override
     public String toString() {
         return "IndexWrite:\n\ttable: " + indexTableName + "\n\tmutation:" + mutation;
     }
@@ -179,6 +198,12 @@ public class IndexedKeyValue extends KeyValue {
         MutationProto mProto = MutationProto.parseFrom(mutationData);
         this.mutation = org.apache.hadoop.hbase.protobuf.ProtobufUtil.toMutation(mProto);
         this.hashCode = calcHashCode(indexTableName, mutation);
+        if (mutation != null){
+            bytes = mutation.getRow();
+            offset = 0;
+            length = bytes.length;
+        }
+
     }
 
     public boolean getBatchFinished() {
diff --git a/phoenix-core/src/test/java/org/apache/hadoop/hbase/regionserver/wal/IndexedKeyValueTest.java b/phoenix-core/src/test/java/org/apache/hadoop/hbase/regionserver/wal/IndexedKeyValueTest.java
new file mode 100644
index 0000000..7f34fcd
--- /dev/null
+++ b/phoenix-core/src/test/java/org/apache/hadoop/hbase/regionserver/wal/IndexedKeyValueTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.regionserver.wal;
+
+import org.apache.hadoop.hbase.client.Mutation;
+import org.apache.hadoop.hbase.client.Put;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
+import org.apache.phoenix.hbase.index.wal.IndexedKeyValue;
+import org.apache.phoenix.hbase.index.wal.KeyValueCodec;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+
+
+public class IndexedKeyValueTest {
+
+    @Test
+    public void testIndexedKeyValuePopulatesKVFields() throws Exception {
+        byte[] row = Bytes.toBytes("foo");
+        byte[] tableNameBytes = Bytes.toBytes("MyTableName");
+        Mutation mutation = new Put(row);
+        IndexedKeyValue indexedKeyValue = new IndexedKeyValue(tableNameBytes, mutation);
+        testIndexedKeyValueHelper(indexedKeyValue, row, tableNameBytes, mutation);
+
+        //now serialize the IndexedKeyValue and make sure the deserialized copy also
+        //has all the right fields
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DataOutputStream out = new DataOutputStream(baos);
+        KeyValueCodec.write(out, indexedKeyValue);
+
+        IndexedKeyValue deSerializedKV = (IndexedKeyValue)
+            KeyValueCodec.readKeyValue(new DataInputStream(
+                new ByteArrayInputStream(baos.toByteArray())));
+        testIndexedKeyValueHelper(deSerializedKV, row, tableNameBytes, mutation);
+
+    }
+
+    private void testIndexedKeyValueHelper(IndexedKeyValue indexedKeyValue, byte[] row, byte[] tableNameBytes, Mutation mutation) {
+        Assert.assertArrayEquals(row, indexedKeyValue.getRowArray());
+        Assert.assertEquals(0, indexedKeyValue.getRowOffset());
+        Assert.assertEquals(row.length, indexedKeyValue.getRowLength());
+        Assert.assertArrayEquals(tableNameBytes, indexedKeyValue.getIndexTable());
+        Assert.assertEquals(mutation.toString(), indexedKeyValue.getMutation().toString());
+        Assert.assertArrayEquals(WALEdit.METAFAMILY, indexedKeyValue.getFamilyArray());
+    }
+
+}