[ https://issues.apache.org/jira/browse/PHOENIX-4619?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
James Taylor updated PHOENIX-4619: ---------------------------------- Fix Version/s: 5.0.0 4.14.0 > Process transactional updates to local index on server-side > ----------------------------------------------------------- > > Key: PHOENIX-4619 > URL: https://issues.apache.org/jira/browse/PHOENIX-4619 > Project: Phoenix > Issue Type: Bug > Reporter: James Taylor > Assignee: James Taylor > Priority: Major > Fix For: 4.14.0, 5.0.0 > > > For local indexes, we'll want to continue to process updates on the > server-side. After PHOENIX-4278, updates even for local indexes are occurring > on the client-side. The reason is that we know the updates to the index table > will be a local write and we can generate the write on the server side. > Having a separate RPC and sending the updates across the wire would be > tremendously inefficient. On top of that, we need the region boundary > information which we have already in the coprocessor, but would need to > retrieve it on the client side (with a likely race condition too if a split > occurs after we retrieve it). > To fix this, we need to modify PhoenixTxnIndexMutationGenerator such that it > can be use on the server-side as well. The main change will be to change this > method signature to pass through an IndexMaintainer instead of a PTable > (which isn't available on the server-side): > {code} > public List<Mutation> getIndexUpdates(final PTable table, PTable index, > List<Mutation> dataMutations) throws IOException, SQLException { > {code} > I think this can be changed to the following instead and be used both client > and server side: > {code} > public List<Mutation> getIndexUpdates(final IndexMaintainer maintainer, > byte[] dataTableName, List<Mutation> dataMutations) throws IOException, > SQLException { > {code} > We can tweak the code that makes PhoenixTransactionalIndexer a noop for > clients >= 4.14 to have it execute if the index is a local index. The one > downside is that if there's a mix of local and global indexes on the same > table, the index update calculation will be done twice. I think having a mix > of index types would be rare, though, and we should advise against it. > There's also this code in UngroupedAggregateRegionObserver which needs to be > updated to write shadow cells for Omid: > {code} > } else if (buildLocalIndex) { > for (IndexMaintainer maintainer : > indexMaintainers) { > if (!results.isEmpty()) { > result.getKey(ptr); > ValueGetter valueGetter = > > maintainer.createGetterFromKeyValues( > > ImmutableBytesPtr.copyBytesIfNecessary(ptr), > results); > Put put = > maintainer.buildUpdateMutation(kvBuilder, > valueGetter, ptr, > results.get(0).getTimestamp(), > > env.getRegion().getRegionInfo().getStartKey(), > > env.getRegion().getRegionInfo().getEndKey()); > indexMutations.add(put); > } > } > result.setKeyValues(results); > {code} > This is the code that builds a local index initially (unlike the global index > code path which executes an UPSERT SELECT on the client side to do this > initial population). -- This message was sent by Atlassian JIRA (v7.6.3#76005)