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

James Taylor commented on PHOENIX-3997:
---------------------------------------

Ah, yes - thanks for the reminder, [~sergey.soldatov]. See also this comment on 
the lock member variable:
{code}
    /**
     * This lock used for synchronizing the state of
     * {@link UngroupedAggregateRegionObserver#scansReferenceCount},
     * {@link UngroupedAggregateRegionObserver#isRegionClosing} variables used 
to avoid possible
     * dead lock situation in case below steps: 
     * 1. We get read lock when we start writing local indexes, deletes etc.. 
     * 2. when memstore reach threshold, flushes happen. Since they use read 
(shared) lock they 
     * happen without any problem until someone tries to obtain write lock. 
     * 3. at one moment we decide to split/bulkload/close and try to acquire 
write lock. 
     * 4. Since that moment all attempts to get read lock will be blocked. I.e. 
no more 
     * flushes will happen. But we continue to fill memstore with local index 
batches and 
     * finally we get RTBE.
     * 
     * The solution to this is to not allow or delay operations acquire the 
write lock.
     * 1) In case of split we just throw IOException so split won't happen but 
it will not cause any harm.
     * 2) In case of bulkload failing it by throwing the exception. 
     * 3) In case of region close by balancer/move wait before closing the 
reason and fail the query which 
     * does write after reading. 
     * 
     * See PHOENIX-3111 for more info.
     */
{code}


> UngroupedAggregateRegionObserver.commitBatchWithHTable() should not check the 
> memstore size and wait for flush. 
> ----------------------------------------------------------------------------------------------------------------
>
>                 Key: PHOENIX-3997
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-3997
>             Project: Phoenix
>          Issue Type: Bug
>            Reporter: Thomas D'Silva
>            Assignee: Geoffrey Jacoby
>             Fix For: 4.12.0
>
>         Attachments: PHOENIX-3997.patch
>
>
> [~ankit.singhal] 
> In UngroupedAggregateRegionObserver.commitBatchWithHTable() do we need to 
> check the memstore size and wait for the flush. We are using a htable to 
> write the mutations.
> {code}
>  // When memstore size reaches blockingMemstoreSize we are waiting 3 seconds 
> for the
>         // flush happen which decrease the memstore size and then writes 
> allowed on the region.
>         for (int i = 0; region.getMemstoreSize().get() > blockingMemstoreSize 
> && i < 30; i++) {
>             try {
>                 checkForRegionClosing();
>                 Thread.sleep(100);
>             } catch (InterruptedException e) {
>                 Thread.currentThread().interrupt();
>                 throw new IOException(e);
>             }
>         }
>         logger.debug("Committing batch of " + mutations.size() + " mutations 
> for " + table);
>         try {
>             table.batch(mutations);
>         } catch (InterruptedException e) {
>             throw new RuntimeException(e);
>         }
> {code}
> FYI [~jamestaylor] [~apurtell]



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

Reply via email to