[
https://issues.apache.org/jira/browse/PHOENIX-2478?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15064314#comment-15064314
]
James Taylor commented on PHOENIX-2478:
---------------------------------------
Here's a solutions that [~poornachandra] and [~anew] came up with that doesn't
require any changes to Tephra and does the necessary coordination between a
CREATE INDEX DDL call and a DML on the same table to ensure all rows are
indexed:
CREATE INDEX
* Start tx1
** Create the index which will add the index row to SYSTEM.CATALOG table at the
tx1 write ptr.
* Commit tx1
* Start tx2
** For all in-flight transactions (which is retrievable from the tx context),
add to change set row keys of the form <txID><table name> and <txID><physical
table name> (if physical table name is different than table name for the case
of indexes on views).
* Commit tx2 and retry until successful which means that we were able to commit
without conflicts from an in progress DML (see below for row keys added at DML
time).
* Initiate the initial index population for all rows older than the tx2 write
pointer
DML
* Start tx (as done today)
** Add to change set a row key of the form <txID><table name> and
<txID><physical table name> (if physical table name is different than table
name).
* Commit tx
** On TransactionFailureException, sync our meta data with the server metadata
and if our table has changed (i.e. has a new index), then
*** Abort the transaction
*** Rerun the commit (which will now include index rows for new indexes) which
could potentially cause the same logic to repeat if another index happened to
be added.
> Rows committed in transaction overlapping index creation are not populated
> --------------------------------------------------------------------------
>
> Key: PHOENIX-2478
> URL: https://issues.apache.org/jira/browse/PHOENIX-2478
> Project: Phoenix
> Issue Type: Sub-task
> Reporter: James Taylor
> Assignee: James Taylor
> Fix For: 4.7.0
>
>
> For a reproducible case, see IndexIT.testCreateIndexAfterUpsertStarted() and
> the associated FIXME comments for PHOENIX-2446.
> The case that is failing is when a commit starts before an index exists, but
> commits after the index build is completed. For transactional data, this is
> problematic because the index gets a timestamp after the commit of the data
> table mutation and thus these mutations won't be seen during the commit.
> Also, when the index is being built, the data hasn't yet been committed and
> thus won't be part of the initial index build.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)