On Mon, Oct 30, 2017 at 1:56 PM, Stack <st...@duboce.net> wrote:

> On Mon, Oct 30, 2017 at 1:45 PM, Andrew Purtell <apurt...@apache.org>
> wrote:
>
>> I think complete and bypass are separate considerations and complete can
>> be
>> used universally while we've decided to make bypass work only in some
>> contexts.
>>
>> That said, we can consider removing the complete semantic. Let's pose the
>> same question we did about bypass. Does anyone use it? Can we live without
>> it? As you point out, security interrupts processing by throwing an
>> exception, which is meant to propagate all the way back to the user. It
>> simplifies the theory of operation for coprocessors if we can assume
>> either
>> the entire chain will complete or one of the coprocessors in the chain
>> will
>> throw an exception that not only terminates processing of the rest of the
>> chain but also the operation in progress.
>>
>>
>
> I'd be game for removing 'complete'.
>
> I can leave this question hang a while. Purge would be internals and
> javadoc changes so it can happen after alpha-4 (HBASE-19123 is the
> issue-to-purge).
>
>
Ok. No calls for the preservation of 'complete'.

HBASE-19123 "Purge 'complete' support from Coprocesor Observers" has a
patch up and I'll commit it in the morning unless objection. It removes the
complete facility.

Thanks,
S



> Thanks,
> S
>
>
>
>
>
>>
>> On Mon, Oct 30, 2017 at 10:46 AM, Stack <st...@duboce.net> wrote:
>>
>> > HBASE-18770 (bypass) is coming along (thanks for the helpful reviews so
>> > far!).
>> >
>> > Of note, I have changed the Coprocessor Observer 'complete' function so
>> it
>> > is only available on 'bypassable' methods. Is this ok to do (I'm no
>> expert
>> > on coprocessoring)? I do it in in the name of KISS. Having any
>> Coprocessor
>> > being able to 'complete' overriding any Coprocessor that comes behind
>> it in
>> > the processing chain seems obnoxious. I can see the need if a
>> Coprocessor
>> > is bypasable and has conjured an answer it wants to be back to the
>> client
>> > without tainting by subsequent Coprocessors -- which seems to be how it
>> is
>> > used in my survey of Coprocessor implementations -- but perhaps I am
>> > missing a use case? (AccessController throws an exception when access is
>> > denied). Downside of supporting 'complete' globally is more overrides
>> > internally and messaging gets a bit more muddled.
>> >
>> > Here is more on 'complete' in case you don't know what it is about. If a
>> > method's 'pre' hook is wrapped by 10 Coprocessor observers, each
>> observer
>> > gets called one after the other before we go ahead and do the actual
>> > method invocation. If the first Coprocessor in the chain calls
>> 'complete'
>> > in its context, we will skip calling the remaining 9 coprocessors and
>> then
>> > go ahead and make the method invocation.
>> >
>> > Any opinions out there on 'complete'? Any objections to my only allowing
>> > 'complete' on bypassable methods?
>> >
>> > Thanks,
>> > St.Ack
>> >
>> >
>> >
>> > On Tue, Oct 24, 2017 at 9:53 PM, Stack <st...@duboce.net> wrote:
>> >
>> > > I made a start on HBASE-18770. It has edit of RegionObserver which
>> > denotes
>> > > methods that support bypass (Unfortunately, because of the varied
>> > > signatures, how bypass is signaled varies too). Would appreciate a
>> > > once-over.
>> > >
>> > > of note, a CP cannot bypass flush. Speak up if you think otherwise (or
>> > you
>> > > can think of a case where this needed). My rationale is CPs won't have
>> > > enough insider knowledge to do memory accounting in a world of
>> in-memory
>> > > compactions, and on/offheap memory in our hosting process. What ye
>> > reckon?
>> > >
>> > > Coprocessors have always been able to adjust what gets compacted in
>> any
>> > > run and even skirt compaction altogether by returning an empty set of
>> > files
>> > > to compact. This works as it ever did.
>> > >
>> > > Thanks,
>> > > S
>> > >
>> > >
>> > >
>> > > On Tue, Oct 17, 2017 at 9:46 PM, Stack <st...@duboce.net> wrote:
>> > >
>> > >> I was going to pick up on the bypass after HBASE-19007 lands,
>> cleaning
>> > up
>> > >> our exposure of Master/RegionServerServices to Coprocessors
>> (HBASE-19007
>> > >> was going bad for a good while but lots of contributors and good
>> > discussion
>> > >> and now I think we have it). Shouldn't be too much longer.
>> > >>
>> > >> Its CP API so I was figuring it an alpha-4 item.
>> > >>
>> > >> St.Ack
>> > >>
>> > >> On Tue, Oct 17, 2017 at 6:56 PM, 张铎(Duo Zhang) <
>> palomino...@gmail.com>
>> > >> wrote:
>> > >>
>> > >>> Fine. Let me change the title of HBASE-18770 and prepare a patch
>> there.
>> > >>>
>> > >>> May still a week or two before alpha4 I think. The scan injection,
>> and
>> > >>> flush/compaction trigger/track API is still unstable...
>> > >>>
>> > >>> 2017-10-18 6:12 GMT+08:00 Josh Elser <els...@apache.org>:
>> > >>>
>> > >>> > (catching up here)
>> > >>> >
>> > >>> > I'm glad to see you fine folks came to a conclusion around a
>> > >>> reduced-scope
>> > >>> > solution (correct me if I'm wrong). "Some" bypass mechanism would
>> > stay
>> > >>> for
>> > >>> > preXXX methods, and we'd remove it for the other methods? What
>> > exactly
>> > >>> the
>> > >>> > "bypass API" would be is up in the air, correct?
>> > >>> >
>> > >>> > Duo -- maybe you could put the "current plan" on HBASE-18770 since
>> > >>> > discussion appears to have died down?
>> > >>> >
>> > >>> > I was originally lamenting yet another big, sweeping change to CPs
>> > >>> when I
>> > >>> > had expected alpha-4 to have already landed. But, let me play
>> devil's
>> > >>> > advocate: is this something we still think is critical to do in
>> > >>> alpha-4? I
>> > >>> > can respect wanting to get address all of these smells, but I'd be
>> > >>> worry it
>> > >>> > delays us further.
>> > >>> >
>> > >>> >
>> > >>> > On 10/11/17 9:53 PM, 张铎(Duo Zhang) wrote:
>> > >>> >
>> > >>> >> Creating an exception is expensive so if it is not suggested to
>> do
>> > it
>> > >>> in a
>> > >>> >> normal case. A common trick is to create a global exception
>> > instance,
>> > >>> and
>> > >>> >> always throw it to avoid creating every time but I think it is
>> more
>> > >>> >> friendly to just use a return value?
>> > >>> >>
>> > >>> >> And for me, the bypass after preXXX for normal region operations
>> > just
>> > >>> >> equals to a 'cancel', which is very clear and easy to understand,
>> > so I
>> > >>> >> think it is OK to add bypass support for them. And also for
>> > >>> compaction and
>> > >>> >> flush, it is OK to give CP users the ability to cancel the
>> operation
>> > >>> as
>> > >>> >> the
>> > >>> >> semantic is clear, although I'm not sure how CP users would use
>> this
>> > >>> >> feature.
>> > >>> >>
>> > >>> >> In general, I think we can provide bypass/cancel support in
>> preXXX
>> > >>> methods
>> > >>> >> where it is the very beginning of an operation.
>> > >>> >>
>> > >>> >> Thanks.
>> > >>> >>
>> > >>> >> 2017-10-12 3:10 GMT+08:00 Andrew Purtell <apurt...@apache.org>:
>> > >>> >>
>> > >>> >> 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.
>> > >>> >>>
>> > >>> >>> If we can handle the rest of the trouble that you observed:
>> > >>> >>>
>> > >>> >>> 1) Lack of recognition and identification of when the key value
>> to
>> > >>> >>> increment doesn't exist
>> > >>> >>> 2) Lack of the ability to set the timestamp of the updated key
>> > value.
>> > >>> >>>
>> > >>> >>> then they might be able to make it work. Perhaps a conversion
>> from
>> > >>> HBase
>> > >>> >>> native to Phoenix LONG encoding when processing results, in the
>> > >>> wrapping
>> > >>> >>> scanner, informed by schema metadata.
>> > >>> >>>
>> > >>> >>> Or if we are keeping the bypass semantic in select places but
>> > >>> >>> implementing
>> > >>> >>> it with something other than today's bypass() API (please) this
>> > >>> would be
>> > >>> >>> another candidate for where to keep it. Duo suggests keeping the
>> > >>> semantic
>> > >>> >>> in all of the basic RPC preXXX hooks for query and mutation. We
>> > could
>> > >>> >>> redo
>> > >>> >>> those APIs to skip normal processing based on a return value or
>> > >>> exception
>> > >>> >>> but otherwise drop bypass from all the others. It will clean up
>> > >>> areas of
>> > >>> >>> confusion, e.g. can I bypass splits or flushes or not? Or what
>> > about
>> > >>> this
>> > >>> >>> arcane hook in compaction? Or [insert some deep hook here]? The
>> > >>> answer
>> > >>> >>> would be: only RPC hooks will early out, and only if you return
>> > this
>> > >>> >>> value,
>> > >>> >>> or throw that exception.
>> > >>> >>>
>> > >>> >>>
>> > >>> >>> 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
>>
>> Words like orphans lost among the crosstalk, meaning torn from truth's
>> decrepit hands
>>    - A23, Crosstalk
>>
>
>

Reply via email to