On Wed, Oct 11, 2017 at 11:57 AM, Andrew Purtell <apurt...@apache.org> wrote:
> > What about the Duo suggestion? Purge bypass flag and replace it w/ preXXX > in a few select methods returning a boolean on whether bypass? Would that > work? (Would have to figure metrics still). > > That would work. > > Let me take a look at what'd be involved then. Thanks, S > > On Wed, Oct 11, 2017 at 11:56 AM, Stack <st...@duboce.net> wrote: > > > The YARN Timeline Server has the FlowRunCoprocessor. It does bypass when > > user does a Get returning instead the result of its own (Flow) Scan > result. > > Not sure how we'd do alternative here; Timeline Server is keeping Tags > > internally. > > > > > > On Wed, Oct 11, 2017 at 10:59 AM, Andrew Purtell <apurt...@apache.org> > > wrote: > > > > > Rather than continue to support a weird bypass() which works in some > > places > > > and not in others, perhaps we can substitute it with an exception? So > if > > > the coprocessor throws this exception in the pre hook then where it is > > > allowed we catch it and do the right thing, and where it is not allowed > > we > > > don't catch it and the server aborts. This will at least improve the > > silent > > > bypass() failure problem. I also don't like, in retrospect, that > calling > > > this environment method has magic side effects. Everyone understands > how > > > exceptions work, so it will be clearer. > > > > > > > > We could do that though throw and catch of exceptions would be costly. > > > > What about the Duo suggestion? Purge bypass flag and replace it w/ preXXX > > in a few select methods returning a boolean on whether bypass? Would that > > work? (Would have to figure metrics still). > > > > > > > > > In any case we should try to address the Tephra and Phoenix cases > brought > > > up in this discussion. They look like we can find alternatives. Shall I > > > file JIRAs to follow up? > > > > > > > > > > > On Phoenix Increment by-pass, an ornery item is that Phoenix wants to use > > its long encoding writing Increments. Not sure how we'd do that, > > selectively. > > > > St.Ack > > > > > > > > > On Wed, Oct 11, 2017 at 6:00 AM, 张铎(Duo Zhang) <palomino...@gmail.com> > > > wrote: > > > > > > > These examples are great. > > > > > > > > And I think for normal region operations such as get, put, delete, > > > > checkAndXXX, increment, it is OK to bypass the real operation after > > > preXXX > > > > as the semantic is clear enough. Instead of calling env.bypass, maybe > > > just > > > > let these preXXX methods return a boolean is enough to tell the HBase > > > > framework that we have already done the real operation so just give > up > > > and > > > > return? > > > > > > > > Thanks. > > > > > > > > 2017-10-11 3:19 GMT+08:00 Gary Helmling <ghelml...@gmail.com>: > > > > > > > > > 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 > > > > > > > > > -- > Best regards, > Andrew > > Words like orphans lost among the crosstalk, meaning torn from truth's > decrepit hands > - A23, Crosstalk >