ChiaPing Tsai created PHOENIX-3576:
--------------------------------------

             Summary: ParallelWriterIndexCommitter should fail fast when 
writing the local index to the closing table
                 Key: PHOENIX-3576
                 URL: https://issues.apache.org/jira/browse/PHOENIX-3576
             Project: Phoenix
          Issue Type: Bug
    Affects Versions: 4.9.0
            Reporter: ChiaPing Tsai


ParallelWriterIndexCommitter uses the AP to update the local index after the 
region#batchMutate fails. If the region is splitting, all later updates will 
fail (RegionTooBusyException) due to the write lock. The AP will retry the 
failed updates until it reaches the retry threshold, so the read lock of region 
is released after a long time. The read lock blocks the HRegion#close, so the 
region splitting is also blocked.
{noformat}
                    try {
                        if (allowLocalUpdates
                                && env != null
                                && tableReference.getTableName().equals(
                                    
env.getRegion().getTableDesc().getNameAsString())) {
                            try {
                                throwFailureIfDone();
                                IndexUtil.writeLocalUpdates(env.getRegion(), 
mutations, true);
                                return null;
                            } catch (IOException ignord) {
                                // when it's failed we fall back to the 
standard & slow way
                                if (LOG.isDebugEnabled()) {
                                    LOG.debug("indexRegion.batchMutate failed 
and fall back to HTable.batch(). Got error="
                                            + ignord);
                                }
                            }
                        }
                        table = factory.getTable(tableReference.get());
                        throwFailureIfDone();
                        table.batch(mutations);
                    } catch (SingleIndexWriteFailureException e) {
                        throw e;
                    } catch (IOException e) {
                        throw new 
SingleIndexWriteFailureException(tableReference.toString(), mutations, e);
                    } catch (InterruptedException e) {
                        // reset the interrupt status on the thread
                        Thread.currentThread().interrupt();
                        throw new 
SingleIndexWriteFailureException(tableReference.toString(), mutations, e);
                    }
                    finally{
                        if (table != null) {
                            table.close();
                        }
                    }
                    return null;
{noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to