Thomas D'Silva created TEPHRA-208:
-------------------------------------
Summary: Compaction removes rows incorrectly for family deletes
with column level conflict detection
Key: TEPHRA-208
URL: https://issues.apache.org/jira/browse/TEPHRA-208
Project: Tephra
Issue Type: Bug
Affects Versions: 0.9.0-incubating
Reporter: Thomas D'Silva
Assignee: Poorna Chandra
In DeleteTracker we only check the timestamp while removing cells during
compaction. If the previous row had a family delete, cells from subsequent rows
could also be compacted.
The attached test fails without the following change
{code}
private static final class DeleteTracker {
private long familyDeleteTs;
+ private byte[] rowKey;
public static boolean isFamilyDelete(Cell cell) {
return !TxUtils.isPreExistingVersion(cell.getTimestamp()) &&
@@ -300,14 +301,17 @@ public class TransactionVisibilityFilter extends
FilterBase {
public void addFamilyDelete(Cell delete) {
this.familyDeleteTs = delete.getTimestamp();
+ this.rowKey = Bytes.copy(delete.getRowArray(), delete.getRowOffset(),
delete.getRowLength());
}
public boolean isDeleted(Cell cell) {
- return cell.getTimestamp() <= familyDeleteTs;
+ return rowKey != null && Bytes.compareTo(cell.getRowArray(),
cell.getRowOffset(),
+ cell.getRowLength(), rowKey, 0, rowKey.length) == 0 &&
cell.getTimestamp() <= familyDeleteTs;
}
public void reset() {
this.familyDeleteTs = 0;
+ this.rowKey = null;
}
}
}
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)