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)

Reply via email to