[ 
https://issues.apache.org/jira/browse/PHOENIX-4278?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16295555#comment-16295555
 ] 

James Taylor commented on PHOENIX-4278:
---------------------------------------

Ping, [~ohads]. This would be a good to do as part of the Phoenix/Omid 
integration. This would cover local & global *mutable* secondary index 
maintenance and *immutable* local secondary indexes. Immutable global secondary 
indexes are already maintained on the client side. It's best if you execute 
everything on the client side so that you can add the shadow cells after the 
write to the commit table is successful (you'll have all the index row cells, 
so it should work nicely).

Take a look at PhoenixTransactionalIndexer. The preBatchMutate call figures out 
the index updates that are necessary, storing them in the 
BatchMutateContext.indexUpdates member variable on the thread local (no thread 
local would be required if this is done client side). The heart of the logic is 
in getIndexUpdates() which is just making regular HBase API calls (which would 
be fine to do from the client side for transactions since the transaction 
system is ensuring we see a consistent state thus row locking is not required). 
That method forks depending on if a JDBC rollback is being done (i.e. 
MutationState.rollback) or a regular update is being performed.

I think with a little refactoring, we can share this code - it's all self 
contained in PhoenixTransactionalIndexer currently.

> Implement pure client side transactional index maintenance
> ----------------------------------------------------------
>
>                 Key: PHOENIX-4278
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-4278
>             Project: Phoenix
>          Issue Type: Improvement
>            Reporter: James Taylor
>
> The index maintenance for transactions follows the same model as non 
> transactional tables - coprocessor based on data table updates that looks up 
> previous row value to perform maintenance. This is necessary for non 
> transactional tables to ensure the rows are locked so that a consistent view 
> may be obtained. However, for transactional tables, the time stamp oracle 
> ensures uniqueness of time stamps (via transaction IDs) and the filtering 
> handles a scan seeing the "true" last committed value for a row. Thus, 
> there's no hard dependency to perform this on the server side.
> Moving the index maintenance to the client side would prevent any RS->RS RPC 
> calls (which have proved to be troublesome for HBase). It would require 
> returning more data to the client (i.e. the prior row value), but this seems 
> like a reasonable tradeoff.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to