The tricky part is that postScannerNext() passes InternalScanner parameter instead of RegionScanner.
FYI On Sun, Jul 9, 2017 at 10:57 PM, Anoop John <[email protected]> wrote: > Ya as Ted said, u are not getting Scan object in the postScannerNext > and so can not make use of the attribute in Scan within this hook. > Just setting the sharedData variable will cause issue with concurrent > scans. (As u imagine) > > So I can think of solving this in 2 possible ways. (May be more ways > possible) > > 1. U keep a Map within ur CP impl. You implement postScannerOpen > where u will get the ref to Scanner been created as well as the Scan. > If the Scan is having attribute, keep that scanner within ur Map. > During postScannerNext check if the coming in scanner is there in ur > Map. If so that means this is the one where u can do the action. > Also dont forget to implement postScannerClose and remove that scanner > from the Map. Here u might have some perf penalty as u have to add > and get from Map which has to be a concurrent map too. > > Another way > > 2. Create a custom scanner implementing RegionScanner. The new one > has to take an original Region Scanner and just delegate the calls. On > postScannerOpen, u will get the original scanner been created and u > can just wrap it with ur new scanner object. ( If the Scan object is > having required attribute).. In postScannerNext() u can check for ur > own RegionScanner type and if so u can do action. > > > -Anoop- > > > On Sat, Jul 8, 2017 at 9:13 PM, Ted Yu <[email protected]> wrote: > > if (canUseGetOperation(e)) { > > //logic goes here > > > > Does your Get target the same region being scanned ? > > If not, issuing the Get is not advised since the other region may be > hosted > > on different region server. > > > > Cheers > > > > On Thu, Jul 6, 2017 at 7:14 AM, Veerraju Tadimeti <[email protected]> > wrote: > > > >> hi, > >> > >> I have few questions regarding scope of *RegionCoprocessorEnvironment* > >> sharedData. > >> > >> > >> > >> - *Is sharedData map is shared accross all instances simultaneously > ?* > >> - I am putting a variable in sharedData in preScannerOpen() > based on > >> scan attribute, > >> - check that variable exists in postScannerNext() then apply > logic, > >> - remove the variable postScannerClose(). > >> - If data is in multiple regions, when one coprocessor removes > >> variable in postScannerClose(), will the variable is NULL for > another > >> region coprocessor in postScannerNext() ? > >> > >> > >> - * Is sharedData map is shared across all the client request > >> operations ?* > >> > >> If a variable is set in sharedData for one client operation(say SCAN), > will > >> the variable is available for another client operation(new SCAN) ? > >> > >> > >> - *Will the variables be garbage collected even if we dont implement > >> (removed variables in sharedData) postScannerClose() method* > >> > >> > >> Please find below the logic that I am using currently > >> *CODE: * > >> > >> public RegionScanner > >> *preScannerOpen*(ObserverContext<RegionCoprocessorEnvironment> > >> e, Scan scan, RegionScanner s) throws IOException { > >> byte[] useGetInPostScannerNext = scan.getAttribute(USE_GET_ > >> OPERATION_IN_POST_SCANNER_NEXT); > >> String useGetInPostScannerNextStr = Bytes.toString( > >> useGetInPostScannerNext); > >> if (Boolean.parseBoolean(useGetInPostScannerNextStr)) { > >> e.getEnvironment().getSharedData().put(USE_GET_ > >> OPERATION_IN_POST_SCANNER_NEXT, useGetInPostScannerNextStr); > >> } > >> return super.preScannerOpen(e, scan, s); > >> } > >> > >> @Override > >> public boolean *postScannerNext*(final > >> ObserverContext<RegionCoprocessorEnvironment> > >> e, > >> final InternalScanner s, final List<Result> results, final > int > >> limit, > >> final boolean hasMore) throws IOException { > >> try { > >> > >> if (canUseGetOperation(e)) { > >> > >> //logic goes here > >> } > >> } catch (Exception ex) { > >> logger.error("Exception in postScannerNext ", ex); > >> throw new IOException(ex); > >> } > >> return hasMore; > >> } > >> > >> @Override > >> public void > >> *postScannerClose*(ObserverContext<RegionCoprocessorEnvironment> > >> e, InternalScanner s) throws IOException { > >> if (canUseGetOperation(e)) { > >> e.getEnvironment().getSharedData().remove(USE_ > >> GET_OPERATION_IN_POST_SCANNER_NEXT); > >> } > >> super.postScannerClose(e, s); > >> } > >> > >> private boolean *canUseGetOperation*(final > >> ObserverContext<RegionCoprocessorEnvironment> > >> e) { > >> String useGetOperationInPostScannerNext = (String) > >> e.getEnvironment().getSharedData().get(USE_GET_ > OPERATION_IN_POST_SCANNER_ > >> NEXT); > >> return Boolean.parseBoolean(useGetOperationInPostScannerNext); > >> } > >> > >> Thanks, > >> Raju, > >> (972)273-0155 <(972)%20273-0155>. > >> >
