Author: jdcryans
Date: Wed Nov 4 01:26:02 2009
New Revision: 832640
URL: http://svn.apache.org/viewvc?rev=832640&view=rev
Log:
HBASE-1951 Stack overflow when calling HTable.checkAndPut()
when deleting a lot of values
Modified:
hadoop/hbase/trunk/CHANGES.txt
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/GetDeleteTracker.java
hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestGetDeleteTracker.java
Modified: hadoop/hbase/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=832640&r1=832639&r2=832640&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Wed Nov 4 01:26:02 2009
@@ -90,6 +90,8 @@
no content changes (Lars Francke via Stack)
HBASE-1954 Transactional scans do not see newest put (Clint Morgan via
Stack)
HBASE-1919 code: HRS.delete seems to ignore exceptions it shouldnt
+ HBASE-1951 Stack overflow when calling HTable.checkAndPut()
+ when deleting a lot of values
IMPROVEMENTS
HBASE-1760 Cleanup TODOs in HTable
Modified:
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/GetDeleteTracker.java
URL:
http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/GetDeleteTracker.java?rev=832640&r1=832639&r2=832640&view=diff
==============================================================================
---
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/GetDeleteTracker.java
(original)
+++
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/GetDeleteTracker.java
Wed Nov 4 01:26:02 2009
@@ -102,20 +102,25 @@
int ret = Bytes.compareTo(buffer, qualifierOffset, qualifierLength,
this.delete.buffer, this.delete.qualifierOffset,
this.delete.qualifierLength);
- if (ret <= -1) {
- // Have not reached the next delete yet
- return false;
- } else if(ret >= 1) {
- // Deletes an earlier column, need to move down deletes
- if(this.iterator.hasNext()) {
- this.delete = this.iterator.next();
- } else {
- this.delete = null;
+ while (ret != 0) {
+ if (ret <= -1) {
+ // Have not reached the next delete yet
return false;
+ } else if (ret >= 1) {
+ // Deletes an earlier column, need to move down deletes
+ if (this.iterator.hasNext()) {
+ this.delete = this.iterator.next();
+ } else {
+ this.delete = null;
+ return false;
+ }
+ ret = Bytes.compareTo(buffer, qualifierOffset, qualifierLength,
+ this.delete.buffer, this.delete.qualifierOffset,
+ this.delete.qualifierLength);
+
}
- return isDeleted(buffer, qualifierOffset, qualifierLength, timestamp);
}
-
+
// Check Timestamp
if(timestamp > this.delete.timestamp) {
return false;
Modified:
hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestGetDeleteTracker.java
URL:
http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestGetDeleteTracker.java?rev=832640&r1=832639&r2=832640&view=diff
==============================================================================
---
hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestGetDeleteTracker.java
(original)
+++
hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestGetDeleteTracker.java
Wed Nov 4 01:26:02 2009
@@ -310,5 +310,20 @@
assertEquals(true, dt.isDeleted(col2, 0, col2Len, ts1));
}
+
+ // HBASE-1951
+ public void testStackOverflow() {
+ List<Delete> dels = new ArrayList<Delete>();
+ Delete adel = new Delete(col1, 0, col1Len, del, 0L);
+ for(long i = 0; i < 9000; i++) {
+ dt.add(adel.buffer, adel.qualifierOffset, adel.qualifierLength,
+ i, adel.type);
+ }
+
+
+ //update()
+ dt.update();
+ assertEquals(false, dt.isDeleted(col2, 0, col2Len, 7000000));
+ }
}