From e8da0d81619d3b0572e881ba3ad65272fc6c37d9 Mon Sep 17 00:00:00 2001 From: Wellington Chevreuil Date: Mon, 24 Dec 2018 14:46:55 +0000 Subject: [PATCH] initial proposal --- .../hadoop/hbase/regionserver/HRegion.java | 49 +++++++++++++++---- .../hbase/regionserver/StoreScanner.java | 6 +-- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 4b6da53edd..14b5cf8028 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -3019,15 +3019,18 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi count = kvCount.get(qual); Get get = new Get(CellUtil.cloneRow(cell)); - get.setMaxVersions(count); + get.setMaxVersions(Integer.MAX_VALUE); get.addColumn(family, qual); if (coprocessorHost != null) { if (!coprocessorHost.prePrepareTimeStampForDeleteVersion(mutation, cell, byteNow, get)) { - updateDeleteLatestVersionTimestamp(cell, get, count, byteNow); + e.setValue(updateDeleteLatestVersionTimestamp(cell, get, count, + this.htableDescriptor.getColumnFamily(family).getMaxVersions(), byteNow)); + } } else { - updateDeleteLatestVersionTimestamp(cell, get, count, byteNow); + e.setValue(updateDeleteLatestVersionTimestamp(cell, get, count, + this.htableDescriptor.getColumnFamily(family).getMaxVersions(),byteNow)); } } else { PrivateCellUtil.updateLatestStamp(cell, byteNow); @@ -3036,20 +3039,46 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi } } - void updateDeleteLatestVersionTimestamp(Cell cell, Get get, int count, byte[] byteNow) + List updateDeleteLatestVersionTimestamp(Cell cell, Get get, int count, int maxVersions, byte[] byteNow) throws IOException { - List result = get(get, false); - + List result = new ArrayList<>(); + Scan scan = new Scan(get); + scan.setRaw(true); + this.getScanner(scan).next(result); + List cells = new ArrayList<>(); if (result.size() < count) { // Nothing to delete PrivateCellUtil.updateLatestStamp(cell, byteNow); - return; + cells.add(cell); + return cells; } if (result.size() > count) { - throw new RuntimeException("Unexpected size: " + result.size()); + int currentVersion = 0; + for(Cell getCell : result){ + if(!PrivateCellUtil.isDeleteType(getCell)) { + if (currentVersion >= maxVersions) { + Cell tempCell = null; + try { + tempCell = PrivateCellUtil.deepClone(cell); + } catch (CloneNotSupportedException e) { + throw new IOException(e); + } + PrivateCellUtil.setTimestamp(tempCell, getCell.getTimestamp()); + cells.add(tempCell); + } else if (currentVersion == 0) { + PrivateCellUtil.setTimestamp(cell, getCell.getTimestamp()); + cells.add(cell); + } + currentVersion++; + } + } + + } else { + Cell getCell = result.get(0); + PrivateCellUtil.setTimestamp(cell, getCell.getTimestamp()); + cells.add(cell); } - Cell getCell = result.get(count - 1); - PrivateCellUtil.setTimestamp(cell, getCell.getTimestamp()); + return cells; } @Override diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java index 736c08ab03..6ba4f85529 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java @@ -228,9 +228,9 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner long readPt) throws IOException { this(store, scan, scanInfo, columns != null ? columns.size() : 0, readPt, scan.getCacheBlocks(), ScanType.USER_SCAN); - if (columns != null && scan.isRaw()) { - throw new DoNotRetryIOException("Cannot specify any column for a raw scan"); - } +// if (columns != null && scan.isRaw()) { +// throw new DoNotRetryIOException("Cannot specify any column for a raw scan"); +// } matcher = UserScanQueryMatcher.create(scan, scanInfo, columns, oldestUnexpiredTS, now, store.getCoprocessorHost()); -- 2.17.2 (Apple Git-113)