Mohammad Arshad created HBASE-19423:
---------------------------------------
Summary: Replication entries are not filtered correctly when
replication scope is set through WAL Co-processor
Key: HBASE-19423
URL: https://issues.apache.org/jira/browse/HBASE-19423
Project: HBase
Issue Type: Bug
Reporter: Mohammad Arshad
Fix For: 2.0.0, 1.4.0, 1.3.2
Replicaion scope set in WALObserver is getting reset in
Replication.scopeWALEdits().
Because of this problem custom implementation of WALObserver can not be used as
a replication filter.
Suppose WALObserver implementation has logic to filter all entries from family
f2
{code}
// Filter all family f2 rows
public static class ReplicationFilterWALCoprocessor extends BaseWALObserver {
@Override
public boolean preWALWrite(ObserverContext<? extends
WALCoprocessorEnvironment> ctx,
HRegionInfo info, WALKey logKey, WALEdit logEdit) throws IOException {
ArrayList<Cell> cells = logEdit.getCells();
for (Cell cell : cells) {
byte[] fam = CellUtil.cloneFamily(cell);
if ("f2".equals(Bytes.toString(fam))) {
NavigableMap<byte[], Integer> scopes = logKey.getScopes();
if (scopes == null) {
logKey.setScopes(new TreeMap<byte[],
Integer>(Bytes.BYTES_COMPARATOR));
}
logKey.getScopes().put(fam, HConstants.REPLICATION_SCOPE_LOCAL);
}
}
return false;
}
}
{code}
This logic can not work as
{{org.apache.hadoop.hbase.replication.regionserver.Replication.scopeWALEdits()}}
recreates and populates scopes.
*SOLUTION:*
In Replication.scopeWALEdits(), create scopes map only if WALKey does not have
it.
{code}
NavigableMap<byte[], Integer> scopes = logKey.getScopes();
if (scopes == null) {
scopes = new TreeMap<byte[], Integer>(Bytes.BYTES_COMPARATOR);
}
{code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)