[ 
https://issues.apache.org/jira/browse/PHOENIX-1245?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14128021#comment-14128021
 ] 

Anoop Sam John commented on PHOENIX-1245:
-----------------------------------------

bq.If we remove usage of empty KeyValue object BATCH_MARKER from Indexer, does 
this mean we'll no longer work with 0.98.1 - 0.98.5?
I don't think so James and Jesse.
I checked the Indexer code in 4.0 and master branch. Here is how it is the 
usage of empty KV
{code}
private static KeyValue BATCH_MARKER = new KeyValue();
....
....
public void preSingleUpdate(final ObserverContext<RegionCoprocessorEnvironment> 
c, final Mutation put,
      final WALEdit edit, final Durability durability) throws IOException {
      // just have to add a batch marker to the WALEdit so we get the edit 
again in the batch
      // processing step. We let it throw an exception here because something 
terrible has happened.
      edit.add(BATCH_MARKER);
  }
....
....
public void 
preBatchMutateWithExceptions(ObserverContext<RegionCoprocessorEnvironment> c,
      MiniBatchOperationInProgress<Mutation> miniBatchOp) throws Throwable {
...
// remove the batch keyvalue marker - its added for all puts
      WALEdit edit = miniBatchOp.getWalEdit(i);
      // we don't have a WALEdit for immutable index cases, which still see 
this path
      // we could check is indexing is enable for the mutation in prePut and 
then just skip this
      // after checking here, but this saves us the checking again.
      if (edit != null) {
        KeyValue kv = edit.getKeyValues().get(0);
        if (kv == BATCH_MARKER) {
          // remove batch marker from the WALEdit
          edit.getKeyValues().remove(0);
        }
      }
...
{code}
You can see the object is added to WALEdit in one CP hook and in another it is 
just removed. And this is private instance in this class so no other places 
this is being used. If there were some code path which checks for the presence 
of this object in WALEdit and have diff code flows, it would have been needed. 
(well that is what the 3.0 branch code doing I believe)
So if the present code in 4.0 and master branches can work with 0.98.1-0.98.5 
versions of HBase, after the suggested removal also, it can work with all these 
older version.
Pls note that the change in HBase is making such that the above remove attempt 
of the empty KV from WALEdit is NOT removing. And that is why finally we get 
NPE down the line from HBase code.

As per the discussion we are having in HBASE-11805 , we will restore the old 
behavior to 0.98.  That is a must for Phoenix even if we remove the empty KV as 
proposed here.  Because  Phoenix 4.0, 4.1 versions should work with HBase 
0.98.7+ right?  So we will get issues there. That is why we will restore the 
old behavior in HBase 0.98

Still I suggest we can remove this unwanted op now.

Hope I am making it clear now. What do u say [~giacomotaylor], [~jesse_yates]

> Remove usage of empty KeyValue object BATCH_MARKER from Indexer
> ---------------------------------------------------------------
>
>                 Key: PHOENIX-1245
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-1245
>             Project: Phoenix
>          Issue Type: Improvement
>    Affects Versions: 4.0.0, 5.0.0
>            Reporter: Anoop Sam John
>            Assignee: Anoop Sam John
>            Priority: Critical
>             Fix For: 5.0.0, 4.2
>
>
> This is added to WALEdit in one CP hook and removed in a later CP hook. But 
> not really used.
> Now after HBASE-11805, the removal won't really happen. Later this empty KV 
> is used in other part of HBase core code and resulting in NPE as the bytes 
> ref in this KV is null.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to