You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@phoenix.apache.org by "Monani Mihir (JIRA)" <ji...@apache.org> on 2019/01/01 18:44:00 UTC
[jira] [Comment Edited] (PHOENIX-5079)
PhoenixIndexMetaData.isIndexRebuild gives wrong results in Partial Index
Rebuilding
[ https://issues.apache.org/jira/browse/PHOENIX-5079?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16731662#comment-16731662 ]
Monani Mihir edited comment on PHOENIX-5079 at 1/1/19 6:43 PM:
---------------------------------------------------------------
[~vincentpoon] I mean to write "false" instead of "falls". I have corrected JIRA descriptions.
About the previous comment :-
Here is the definition of PhoenixIndexMetaData#IsIndexRebuild:-
{code:java}
public static boolean isIndexRebuild(Map<String,byte[]> attributes) {
return attributes.get(BaseScannerRegionObserver.REPLAY_WRITES) != null;
}
{code}
For Index Rebuilding , we prepare list of mutations (list of put/delete) in UARO#rebuildIndices. So when i put logs in rebuilder code path, i found that in Indexer#postBatchMutateIndispensably we pass BatchMutateContext as list of [indexUpdates|https://github.com/apache/phoenix/blob/master/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/Indexer.java#L573]. If you check isIndexUpdate for miniBatchOp and context.indexUpdates, we get true for miniBatchOp and false for context.indexUpdates.
{code:java}
public void postBatchMutateIndispensably(ObserverContext<RegionCoprocessorEnvironment> c,
MiniBatchOperationInProgress<Mutation> miniBatchOp, final boolean success) throws IOException {
...
BatchMutateContext context = getBatchMutateContext(c);
... this.builder.batchCompleted(miniBatchOp);
LOG.info("postBatchMutateIndispensably_miniBatchOp isIndexRebuild :- " + PhoenixIndexMetaData.isIndexRebuild(miniBatchOp.getOperation(0).getAttributesMap()));
LOG.info("postBatchMutateIndispensably_context isIndexRebuild :- " + PhoenixIndexMetaData.isIndexRebuild(context.indexUpdates.iterator().next().getFirst().getAttributesMap())); if (success)
{ // if miniBatchOp was successfully written, write index updates doPost(c, context); }
...
{code}
was (Author: mihir6692):
[~vincentpoon] I mean to write "false" instead of "falls". I have corrected JIRA descriptions.
About the previous comment :-
Here is the definition of PhoenixIndexMetaData#IsIndexRebuild:-
{code:java}
public static boolean isIndexRebuild(Map<String,byte[]> attributes) {
return attributes.get(BaseScannerRegionObserver.REPLAY_WRITES) != null;
}
{code}
For Index Rebuilding , we prepare list of mutations (list of put/delete) in UARO#rebuildIndices. So when i put logs in rebuilder code path, i found that in Indexer#postBatchMutateIndispensably we pass BatchMutateContext as list of [indexUpdates|https://github.com/apache/phoenix/blob/master/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/Indexer.java#L573]. If you check isIndexUpdate for miniBatchOp and context.indexUpdates, we get true for miniBatchOp and false for context.indexUpdates.
public void postBatchMutateIndispensably(ObserverContext<RegionCoprocessorEnvironment> c,
MiniBatchOperationInProgress<Mutation> miniBatchOp, final boolean success) throws IOException {
...
BatchMutateContext context = getBatchMutateContext(c);
... this.builder.batchCompleted(miniBatchOp);
LOG.info("postBatchMutateIndispensably_miniBatchOp isIndexRebuild :- " + PhoenixIndexMetaData.isIndexRebuild(miniBatchOp.getOperation(0).getAttributesMap()));
LOG.info("postBatchMutateIndispensably_context isIndexRebuild :- " + PhoenixIndexMetaData.isIndexRebuild(context.indexUpdates.iterator().next().getFirst().getAttributesMap())); if (success) { // if miniBatchOp was successfully written, write index updates
doPost(c, context);
}...
> PhoenixIndexMetaData.isIndexRebuild gives wrong results in Partial Index Rebuilding
> -----------------------------------------------------------------------------------
>
> Key: PHOENIX-5079
> URL: https://issues.apache.org/jira/browse/PHOENIX-5079
> Project: Phoenix
> Issue Type: Bug
> Affects Versions: 4.14.1
> Reporter: Monani Mihir
> Priority: Minor
>
> During Partial Rebuild, If rebuilder get index failure (because of region move/split etc), it will call PhoenixIndexFailurePolicy.handleFailure . Here it checks if mutations are part of Index Rebuild or not .
> {code:java}
> if (!throwing) {
> SQLException sqlException =
> new SQLExceptionInfo.Builder(SQLExceptionCode.INDEX_WRITE_FAILURE)
> .setRootCause(cause).setMessage(cause.getLocalizedMessage()).build()
> .buildException();
> IOException ioException = ServerUtil.wrapInDoNotRetryIOException(null, sqlException, timestamp);
> Mutation m = attempted.entries().iterator().next().getValue();
> boolean isIndexRebuild = PhoenixIndexMetaData.isIndexRebuild(m.getAttributesMap());
> // Always throw if rebuilding index since the rebuilder needs to know if it was successful
> if (throwIndexWriteFailure || isIndexRebuild) {
> throw ioException;
> } else {
> LOG.warn("Swallowing index write failure", ioException);
> }
> }
> {code}
> Here isIndexRebuild becomes false even though we have set attribute for REPLY_WRITE to
> REPLAY_ONLY_INDEX_WRITES in UngroupedAggregateRegionObserver.rebuildIndices
> {code:java}
> ...
> put.setAttribute(REPLAY_WRITES, REPLAY_ONLY_INDEX_WRITES);
> ...{code}
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)