Hi,

Currently Region.processRowsWithLocks() API takes
o.a.h.h.regionserver.RowProcessor as an argument and only implementation of
this class is MultiRowMutationProcessor. This implementation is internal
and used from HRegion.mutateRows...() methods.

HRegion.processRowsWithLocks() implementation, doesn't call coprocessor
hooks but instead calls RowProcessor hooks at appropriate point in
execution. Many of these hooks/ methods have same names and are called at
similar points during the course of execution but they are not related!

HRegion.batchMutate() methods call coprocessor hooks but not row
RowProcessor hooks.

Internal implementation MultiRowMutationProcessor, call coprocessor hooks
from inside it's own methods/ hooks. But this can not be expected of all
implementations for RowProcessors.

In case of HRegion.batchMutate...() methods, CP mutations are merged with
input mutations and these merged mutations are applied to WALEdit fetched
from CPs.

In case of processRowsWithLocks(), mutations are fetched from RowProcessor
instance and are applied on WALEdit built by RowProcessor.

The major inconsistency here is, one code path uses coprocessors while
other uses RowProcessor. There are other minor inconsistencies along those
two code paths.

Proposed fix:

* Unify two code paths.
* Deprecate RowProcessor and API Region.processRowsWithLocks() that takes
RowProcessor as an argument.
* Provide alternate API that doesn't take RowProcessor.
* Modify batchMutate...() to take additional arguments: rowsToLock
(byte[][]) and atomic/ allOrNone (boolean).
* Remove MultiRowMutationProcessor. Make HRegion.mutateRows() methods to
use batchMutate().
* Make new implementation of Region.processRowsWithLocks() which doesn't
take RowProcessor as an argument use batchMutate().

Suggestion is that coprocessors can be used to do things RowProcessors are
doing.

Related JIRAs: HBASE-18703, HBASE-18183

Let me know your thoughts.

Thanks,
Umesh

Reply via email to