You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@phoenix.apache.org by "Vincent Poon (JIRA)" <ji...@apache.org> on 2017/04/24 18:57:05 UTC

[jira] [Commented] (PHOENIX-3806) IndexUpdateManager spending a lot of time sorting mutations on Index rebuild

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

Vincent Poon commented on PHOENIX-3806:
---------------------------------------

Some more detail on this issue:

What we found was that the sorting being doing in IndexUpdateManager#fixUpCurrentUpdates can potentially be called a large number of times, and it seems to only happen when triggered from the BuildIndexScheduleTask code path.    In our case the collection being sorted had 50001 Deletes because even though the indexing rebuilding code batches the mutations it is replaying, there is a raw scan that happens which can surface all the versions for the mutations.  From a quick glance, it seems the raw scan is determined by whether BaseScannerRegionObserver.IGNORE_NEWER_MUTATIONS is set.

So there are number of avenues to explore here - can the batching be done better?  Do we need all versions?  Certainly it seems the sorting in fixUpCurrentUpdates can be done better, by sorting once rather than on every loop iteration.  I'll look into that further.

Steps to reproduce (perhaps can be converted to a unit test):
1)  Produce a large number of versions for a single row
2)  Disable the index on the table with "alter index <index> on <table> disable"
3)  Make sure the index_disable_timestamp is set (filed PHOENIX-3810)
4) The rebuilder should trigger the sort for a large number of deletes


> IndexUpdateManager spending a lot of time sorting mutations on Index rebuild
> ----------------------------------------------------------------------------
>
>                 Key: PHOENIX-3806
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-3806
>             Project: Phoenix
>          Issue Type: Bug
>            Reporter: Lars Hofhansl
>
> Here's the stack trace. The Array contains 50001 Delete Mutations in this case.
> It seems the code is sorting this over and over again.
> {code}
> Thread 170 (B.DefaultRpcServer.handler=67,queue=7,port=60020):
>   State: RUNNABLE
>   Blocked count: 220598
>   Waited count: 377933
>   Stack:
>     java.util.TimSort.binarySort(TimSort.java:296)
>     java.util.TimSort.sort(TimSort.java:239)
>     java.util.Arrays.sort(Arrays.java:1438)
>     org.apache.phoenix.hbase.index.covered.update.SortedCollection.iterator(SortedCollection.java:78)
>     org.apache.phoenix.hbase.index.covered.update.IndexUpdateManager.fixUpCurrentUpdates(IndexUpdateManager.java:128)
>     org.apache.phoenix.hbase.index.covered.update.IndexUpdateManager.addIndexUpdate(IndexUpdateManager.java:115)
>     org.apache.phoenix.hbase.index.covered.NonTxIndexBuilder.addCurrentStateMutationsForBatch(NonTxIndexBuilder.java:333)
>     org.apache.phoenix.hbase.index.covered.NonTxIndexBuilder.addUpdateForGivenTimestamp(NonTxIndexBuilder.java:258)
>     org.apache.phoenix.hbase.index.covered.NonTxIndexBuilder.addMutationsForBatch(NonTxIndexBuilder.java:231)
>     org.apache.phoenix.hbase.index.covered.NonTxIndexBuilder.batchMutationAndAddUpdates(NonTxIndexBuilder.java:109)
>     org.apache.phoenix.hbase.index.covered.NonTxIndexBuilder.getIndexUpdate(NonTxIndexBuilder.java:71)
>     org.apache.phoenix.hbase.index.builder.IndexBuildManager$1.call(IndexBuildManager.java:137)
>     org.apache.phoenix.hbase.index.builder.IndexBuildManager$1.call(IndexBuildManager.java:133)
>     java.util.concurrent.FutureTask.run(FutureTask.java:266)
>     com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:293)
>     com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:61)
>     org.apache.phoenix.hbase.index.parallel.BaseTaskRunner.submit(BaseTaskRunner.java:58)
>     org.apache.phoenix.hbase.index.parallel.BaseTaskRunner.submitUninterruptible(BaseTaskRunner.java:99)
>     org.apache.phoenix.hbase.index.builder.IndexBuildManager.getIndexUpdate(IndexBuildManager.java:144)
>     org.apache.phoenix.hbase.index.Indexer.preBatchMutateWithExceptions(Indexer.java:324)
> Thread 169 (B.DefaultRpcServer.handler=66,queue=6,port=60020):
> {code}
> [~jamestaylor]



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)