I'm +1 on remove the general bypass support, but I think we can still
provide the bypass logic for some operations if we can give a clear and
stable semantic of what will be bypassed. Need to know some usages and
review the methods case by case.

Thanks.

2017-10-11 6:30 GMT+08:00 Andrew Purtell <apurt...@apache.org>:

> > The Tephra TransactionProcessor CP makes use of bypass() in preDelete()
> to override handling of delete tombstones in a transactional way
>
> Hmm. This is an interesting case. I can't think of how Deletes could be
> converted into Puts from this code, from when the handling of the Delete is
> already in progress, but it could be possible to add another hook somewhere
> in RPC dispatch ahead of when we have moved through RsRpcServices down into
> HRegion, and replace the incoming Delete with Puts there without a need to
> bypass.
>
> > The CDAP IncrementHandler CP also makes use of bypass() in preGetOp() and
> preIncrementAfterRRowLock() to provide a transaction implementation of
> readless increments
>
> This one might be possible to achieve using the wrapped scanner and a
> replacement of the Get object handed down into core code with something
> that is useless and harmless rather than a bypass.
>
> ​These are great examples.​
>
>
> On Tue, Oct 10, 2017 at 12:19 PM, Gary Helmling <ghelml...@gmail.com>
> wrote:
>
> > The Tephra TransactionProcessor CP makes use of bypass() in preDelete()
> to
> > override handling of delete tombstones in a transactional way:
> > https://github.com/apache/incubator-tephra/blob/master/
> > tephra-hbase-compat-1.3/src/main/java/org/apache/tephra/
> hbase/coprocessor/
> > TransactionProcessor.java#L244
> >
> > The CDAP IncrementHandler CP also makes use of bypass() in preGetOp() and
> > preIncrementAfterRRowLock() to provide a transaction implementation of
> > readless increments:
> > https://github.com/caskdata/cdap/blob/develop/cdap-hbase-
> > compat-1.1/src/main/java/co/cask/cdap/data2/increment/
> > hbase11/IncrementHandler.java#L121
> >
> > What would be the alternate approach for these applications?  In both
> cases
> > they need to impose their own semantics on the underlying KeyValue
> > storage.  Is there a different way this can be done?
> >
> >
> > On Tue, Oct 10, 2017 at 11:58 AM Anoop John <anoop.hb...@gmail.com>
> wrote:
> >
> > > Wrap core scanners is different right?  That can be done in post
> > > hooks.  I have seen many use cases for this..  Its the question abt
> > > the pre hooks where we have not yet created the core object (like
> > > scanner).  The CP pre code itself doing the work of object creation
> > > and so the core code is been bypassed.    Well the wrapping thing can
> > > be done in pre hook also. First create the core object by CP code
> > > itself and then do the wrapped object and return.. I have seen in one
> > > jira issue where the usage was this way..   The wrapping can be done
> > > in post also in such cases I believe.
> > >
> > > -Anoop-
> > >
> > > On Wed, Oct 11, 2017 at 12:23 AM, Andrew Purtell <apurt...@apache.org>
> > > wrote:
> > > > I think we should continue to support overriding function by object
> > > > inheritance. I didn't mention this and am not proposing more than
> > > removing
> > > > the bypass() sematic. No more no less. Phoenix absolutely depends on
> > > being
> > > > able to wrap core scanners and return the wrappers.
> > > >
> > > >
> > > > On Tue, Oct 10, 2017 at 11:50 AM, Anoop John <anoop.hb...@gmail.com>
> > > wrote:
> > > >
> > > >> When we say bypass the core code, it can be done today not only by
> > > >> calling bypass but by returning a not null object for some of the
> pre
> > > >> hooks.  Like preScannerOpen() if it return a scanner object, we will
> > > >> avoid the remaining core code execution for creation of the
> > > >> scanner(s).  So this proposal include this aspect also and remove
> any
> > > >> possible way of bypassing the core code by the CP hook code
> execution
> > > >> ?   Am +1.
> > > >>
> > > >> -Anoop-
> > > >>
> > > >> On Tue, Oct 10, 2017 at 11:40 PM, Andrew Purtell <
> apurt...@apache.org
> > >
> > > >> wrote:
> > > >> > The coprocessor API provides an environment method, bypass(), that
> > > when
> > > >> > called from a preXXX hook will cause the core code to skip all
> > > remaining
> > > >> > processing. This capability was introduced on HBASE-3348. Since
> this
> > > >> time I
> > > >> > think we are more enlightened about the complications of this
> > feature.
> > > >> (Or,
> > > >> > anyway, speaking for myself:)
> > > >> >
> > > >> > Not all hooks provide the bypass semantic. Where this is the case
> > the
> > > >> > javadoc for the hook says so, but it can be missed. If you call
> > > bypass()
> > > >> in
> > > >> > a hook where it is not supported it is a no-op. This can lead to a
> > > poor
> > > >> > developer experience.
> > > >> >
> > > >> > Where bypass is supported what is being bypassed is all of the
> core
> > > code
> > > >> > implementing the remainder of the operation. In order to
> understand
> > > what
> > > >> > calling bypass() will skip, a coprocessor implementer should read
> > and
> > > >> > understand all of the remaining code and its nuances. Although I
> > think
> > > >> this
> > > >> > is good practice for coprocessor developers in general, it
> demands a
> > > >> lot. I
> > > >> > think it would provide a much better developer experience if we
> > didn't
> > > >> > allow bypass, even though it means - in theory - a coprocessor
> would
> > > be a
> > > >> > lot more limited in some ways than before. What is skipped is
> > > extremely
> > > >> > version dependent. That core code will vary, perhaps
> significantly,
> > > even
> > > >> > between point releases. We do not provide the promise of
> consistent
> > > >> > behavior even between point releases for the bypass semantic. To
> > > achieve
> > > >> > that we could not change any code between hook points. Therefore
> the
> > > >> > coprocessor implementer becomes an HBase core developer in
> practice
> > as
> > > >> soon
> > > >> > as they rely on bypass(). Every release of HBase may break the
> > > assumption
> > > >> > that the replacement for the bypassed code takes care of all
> > necessary
> > > >> > skipped concerns. Because those concerns can change at any point,
> > > such an
> > > >> > assumption is never safe.
> > > >> >
> > > >> > I say "in theory" because I would be surprised if anyone is
> relying
> > on
> > > >> the
> > > >> > bypass for the above reason. I seem to recall that Phoenix might
> use
> > > it
> > > >> in
> > > >> > one place to promote a normal mutation into an atomic operation,
> by
> > > >> > substituting one for the other, but if so that objective could be
> > > >> > reimplemented using their new locking manager.
> > > >> >
> > > >> > --
> > > >> > Best regards,
> > > >> > Andrew
> > > >>
> > > >
> > > >
> > > >
> > > > --
> > > > Best regards,
> > > > Andrew
> > > >
> > > > Words like orphans lost among the crosstalk, meaning torn from
> truth's
> > > > decrepit hands
> > > >    - A23, Crosstalk
> > >
> >
>
>
>
> --
> Best regards,
> Andrew
>
> Words like orphans lost among the crosstalk, meaning torn from truth's
> decrepit hands
>    - A23, Crosstalk
>

Reply via email to