You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2013/01/21 21:11:43 UTC
svn commit: r1436587 - in /hbase/trunk/hbase-server/src:
main/java/org/apache/hadoop/hbase/client/Scan.java
main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java
Author: stack
Date: Mon Jan 21 20:11:42 2013
New Revision: 1436587
URL: http://svn.apache.org/viewvc?rev=1436587&view=rev
Log:
HBASE-3170 RegionServer confused about empty row keys
Modified:
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/Scan.java
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/Scan.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/Scan.java?rev=1436587&r1=1436586&r2=1436587&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/Scan.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/client/Scan.java Mon Jan 21 20:11:42 2013
@@ -92,6 +92,7 @@ public class Scan extends OperationWithA
private int storeLimit = -1;
private int storeOffset = 0;
+ private boolean getScan;
// If application wants to collect scan metrics, it needs to
// call scan.setAttribute(SCAN_ATTRIBUTES_ENABLE, Bytes.toBytes(Boolean.TRUE))
@@ -141,6 +142,8 @@ public class Scan extends OperationWithA
public Scan(byte [] startRow, byte [] stopRow) {
this.startRow = startRow;
this.stopRow = stopRow;
+ //if the startRow and stopRow both are empty, it is not a Get
+ this.getScan = isStartRowAndEqualsStopRow();
}
/**
@@ -159,6 +162,7 @@ public class Scan extends OperationWithA
caching = scan.getCaching();
maxResultSize = scan.getMaxResultSize();
cacheBlocks = scan.getCacheBlocks();
+ getScan = scan.isGetScan();
filter = scan.getFilter(); // clone?
loadColumnFamiliesOnDemand = scan.getLoadColumnFamiliesOnDemandValue();
TimeRange ctr = scan.getTimeRange();
@@ -194,13 +198,17 @@ public class Scan extends OperationWithA
this.storeOffset = get.getRowOffsetPerColumnFamily();
this.tr = get.getTimeRange();
this.familyMap = get.getFamilyMap();
+ this.getScan = true;
}
public boolean isGetScan() {
- return this.startRow != null && this.startRow.length > 0 &&
- Bytes.equals(this.startRow, this.stopRow);
+ return this.getScan || isStartRowAndEqualsStopRow();
}
+ private boolean isStartRowAndEqualsStopRow() {
+ return this.startRow != null && this.startRow.length > 0 &&
+ Bytes.equals(this.startRow, this.stopRow);
+ }
/**
* Get all columns from the specified family.
* <p>
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1436587&r1=1436586&r2=1436587&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Mon Jan 21 20:11:42 2013
@@ -3406,7 +3406,7 @@ public class HRegion implements HeapSize
}
this.batch = scan.getBatch();
- if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW)) {
+ if (Bytes.equals(scan.getStopRow(), HConstants.EMPTY_END_ROW) && !scan.isGetScan()) {
this.stopRow = null;
} else {
this.stopRow = scan.getStopRow();
Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java?rev=1436587&r1=1436586&r2=1436587&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide3.java Mon Jan 21 20:11:42 2013
@@ -22,6 +22,7 @@ package org.apache.hadoop.hbase.client;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import java.util.Arrays;
import java.util.List;
import java.util.Random;
@@ -51,6 +52,9 @@ public class TestFromClientSide3 {
private static byte[] FAMILY = Bytes.toBytes("testFamily");
private static Random random = new Random();
private static int SLAVES = 3;
+ private final static byte[] COL_QUAL = Bytes.toBytes("f1");
+ private final static byte[] VAL_BYTES = Bytes.toBytes("v1");
+ private final static byte[] ROW_BYTES = Bytes.toBytes("r1");
/**
* @throws java.lang.Exception
@@ -256,4 +260,34 @@ public class TestFromClientSide3 {
"hbase.hstore.compaction.min"));
}
+ @Test
+ public void testGetEmptyRow() throws Exception {
+ //Create a table and put in 1 row
+ HBaseAdmin admin = TEST_UTIL.getHBaseAdmin();
+ HTableDescriptor desc = new HTableDescriptor(Bytes.toBytes("test"));
+ desc.addFamily(new HColumnDescriptor(FAMILY));
+ admin.createTable(desc);
+ HTable table = new HTable(TEST_UTIL.getConfiguration(), "test");
+
+ Put put = new Put(ROW_BYTES);
+ put.add(FAMILY, COL_QUAL, VAL_BYTES);
+ table.put(put);
+ table.flushCommits();
+
+ //Try getting the row with an empty row key and make sure the other base cases work as well
+ Result res = table.get(new Get(new byte[0]));
+ assertTrue(res.isEmpty() == true);
+ res = table.get(new Get(Bytes.toBytes("r1-not-exist")));
+ assertTrue(res.isEmpty() == true);
+ res = table.get(new Get(ROW_BYTES));
+ assertTrue(Arrays.equals(res.getValue(FAMILY, COL_QUAL), VAL_BYTES));
+
+ //Now actually put in a row with an empty row key
+ put = new Put(new byte[0]);
+ put.add(FAMILY, COL_QUAL, VAL_BYTES);
+ table.put(put);
+ table.flushCommits();
+ res = table.get(new Get(new byte[0]));
+ assertTrue(Arrays.equals(res.getValue(FAMILY, COL_QUAL), VAL_BYTES));
+ }
}