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

Jonathan Hsieh commented on HBASE-7651:
---------------------------------------

Here's a test program I wrote to understand the sematnics better.

{code}
public class TestTaskCancels {
  private static final Log LOG = LogFactory.getLog(TestTaskCancels.class);

  @Test
  public void testCompletionServiceCancellationSemantics() throws 
InterruptedException { 
    
    ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 60000, 
TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<Runnable>(), new DaemonThreadFactory("pool"));
    ExecutorCompletionService<Void> taskPool = new 
ExecutorCompletionService<Void>(executor);

    Callable<Void> failFast = new Callable<Void>() {
      @Override
      public Void call() throws Exception {
        Thread.sleep(500);
        LOG.info("failing first");
        throw new RuntimeException("failing first");
      }
    };
    
    int count = 5;
    Callable<Void>[] succeedSlows = new Callable[count];
    for (int i = 0; i < count ; i++) {
      final int j = i;
      succeedSlows[i] = new Callable<Void>() {
        @Override
        public Void call() throws Exception {
          LOG.info(j + ": started right a way but");
          Thread.sleep(1000);
          LOG.info(j + ": succeed after 1s");
          return null;
        }
      };
    }

    Collection<Future<Void>> tasks = new ArrayList<Future<Void>>();
    tasks.add(taskPool.submit(failFast));
    for (int i = 0; i < count; i++) {
      tasks.add(taskPool.submit(succeedSlows[i]));
    }
    
    try {
      for (int i=0; i< count +1; i++) {
        Future<Void> f = taskPool.take();
        f.get();
      }
    } catch (InterruptedException e) {
      LOG.warn("Got InterruptedException in SnapshotSubprocedurePool", e);
    } catch (ExecutionException e) {
      LOG.warn("Got ExecutionException in SnapshotSubprocedurePool", 
e.getCause());
    } finally {
      for (Future<Void> f: tasks) {
        if (!f.isDone()){
          LOG.warn("cancelling region task");
          f.cancel(false);
        }
      }
    }
    
    // kind of a hack -- we can't get the number of remaining elements in the 
taskPool queue.
    Thread.sleep(100);
    
    int polled = 0;
    while(taskPool.poll() != null) {
      LOG.info("polled out a task");
      polled ++ ;
    }
    LOG.info("State of task pool: " + taskPool);
    assertEquals(5, polled);
  }
}
{code}
                
> RegionServerSnapshotManager does not accept subsquent snapshots if previous 
> fails with NotServingRegionException.
> -----------------------------------------------------------------------------------------------------------------
>
>                 Key: HBASE-7651
>                 URL: https://issues.apache.org/jira/browse/HBASE-7651
>             Project: HBase
>          Issue Type: Sub-task
>          Components: snapshots
>    Affects Versions: hbase-7290
>            Reporter: Jonathan Hsieh
>            Assignee: Jonathan Hsieh
>            Priority: Blocker
>
> I've reproduced this problem consistently on a 20 node cluster.
> The first run fails on a node (jon-snaphots-2 in this case) to take snapshot 
> due to a NotServingRegionException (this is acceptable)
> {code}
> 2013-01-23 13:32:48,631 DEBUG 
> org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher:  accepting 
> received exception
> org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable via 
> jon-snapshots-2.ent.cloudera.com,22101,1358976524369:org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable:
>  org.apache.hadoop.hbase.NotServingRegionException: 
> TestTable,0002493652,1358976652443.b858147ad87a7812ac9a73dd8fef36ad. is 
> closing
>         at 
> org.apache.hadoop.hbase.errorhandling.ForeignException.deserialize(ForeignException.java:184)
>         at 
> org.apache.hadoop.hbase.procedure.ZKProcedureCoordinatorRpcs.abort(ZKProcedureCoordinatorRpcs.java:240)
>         at 
> org.apache.hadoop.hbase.procedure.ZKProcedureCoordinatorRpcs$1.nodeCreated(ZKProcedureCoordinatorRpcs.java:182)
>         at 
> org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher.process(ZooKeeperWatcher.java:294)
>         at 
> org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:519)
>         at 
> org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:495)
> Caused by: 
> org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable: 
> org.apache.hadoop.hbase.NotServingRegionException: 
> TestTable,0002493652,1358976652443.b858147ad87a7812ac9a73dd8fef36ad. is 
> closing
>         at 
> org.apache.hadoop.hbase.regionserver.snapshot.RegionServerSnapshotManager$SnapshotSubprocedurePool.waitForOutstandingTasks(RegionServerSnapshotManager.java:343)
>         at 
> org.apache.hadoop.hbase.regionserver.snapshot.FlushSnapshotSubprocedure.flushSnapshot(FlushSnapshotSubprocedure.java:107)
>         at 
> org.apache.hadoop.hbase.regionserver.snapshot.FlushSnapshotSubprocedure.insideBarrier(FlushSnapshotSubprocedure.java:123)
>         at 
> org.apache.hadoop.hbase.procedure.Subprocedure.call(Subprocedure.java:181)
>         at 
> org.apache.hadoop.hbase.procedure.Subprocedure.call(Subprocedure.java:52)
>         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>         at java.lang.Thread.run(Thread.java:662)
> 2013-01-23 13:32:48,631 DEBUG 
> org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher:  Recieved 
> error, notifying listeners...
> 2013-01-23 13:32:48,730 ERROR org.apache.hadoop.hbase.procedure.Procedure: 
> Procedure 'pe-6' execution failed!
> org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable via 
> jon-snapshots-2.ent.cloudera.com,22101,1358976524369:org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable:
>  org.apache.hadoop.hbase.NotServingRegionException: 
> TestTable,0002493652,1358976652443.b858147ad87a7812ac9a73dd8fef36ad. is 
> closing
>         at 
> org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher.rethrowException(ForeignExceptionDispatcher.java:84)
>         at 
> org.apache.hadoop.hbase.procedure.Procedure.waitForLatch(Procedure.java:357)
>         at 
> org.apache.hadoop.hbase.procedure.Procedure.call(Procedure.java:203)
>         at org.apache.hadoop.hbase.procedure.Procedure.call(Procedure.java:68)
>         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>         at java.lang.Thread.run(Thread.java:662)
> Caused by: 
> org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable: 
> org.apache.hadoop.hbase.NotServingRegionException: 
> TestTable,0002493652,1358976652443.b858147ad87a7812ac9a73dd8fef36ad. is 
> closing
>         at 
> org.apache.hadoop.hbase.regionserver.snapshot.RegionServerSnapshotManager$SnapshotSubprocedurePool.waitForOutstandingTasks(RegionServerSnapshotManager.java:343)
>         at 
> org.apache.hadoop.hbase.regionserver.snapshot.FlushSnapshotSubprocedure.flushSnapshot(FlushSnapshotSubprocedure.java:107)
>         at 
> org.apache.hadoop.hbase.regionserver.snapshot.FlushSnapshotSubprocedure.insideBarrier(FlushSnapshotSubprocedure.java:123)
>         at 
> org.apache.hadoop.hbase.procedure.Subprocedure.call(Subprocedure.java:181)
>         at 
> org.apache.hadoop.hbase.procedure.Subprocedure.call(Subprocedure.java:52)
>         ... 5 more
> {code}
> Subsequent snapshot attempts that require jon-snapshot-2 to participate fail 
> like this:
> {code}
> org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable via 
> jon-snapshots-2.ent.cloudera.com,22101,1358976524369:org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable:
>  java.util.concurrent.CancellationException
>         at 
> org.apache.hadoop.hbase.errorhandling.ForeignException.deserialize(ForeignException.java:184)
>         at 
> org.apache.hadoop.hbase.procedure.ZKProcedureCoordinatorRpcs.abort(ZKProcedureCoordinatorRpcs.java:240)
>         at 
> org.apache.hadoop.hbase.procedure.ZKProcedureCoordinatorRpcs$1.nodeCreated(ZKProcedureCoordinatorRpcs.java:182)
>         at 
> org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher.process(ZooKeeperWatcher.java:294)
>         at 
> org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:519)
>         at 
> org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:495)
> Caused by: 
> org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable: 
> java.util.concurrent.CancellationException
>         at 
> org.apache.hadoop.hbase.procedure.Subprocedure.cancel(Subprocedure.java:270)
>         at 
> org.apache.hadoop.hbase.procedure.Subprocedure.call(Subprocedure.java:202)
>         at 
> org.apache.hadoop.hbase.procedure.Subprocedure.call(Subprocedure.java:52)
>         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>         at java.lang.Thread.run(Thread.java:662)
> 2013-01-23 13:32:59,557 DEBUG 
> org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher:  Recieved 
> error, notifying listeners...
> 2013-01-23 13:32:59,810 ERROR org.apache.hadoop.hbase.procedure.Procedure: 
> Procedure 'pe-7' execution failed!
> org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable via 
> jon-snapshots-2.ent.cloudera.com,22101,1358976524369:org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable:
>  java.util.concurrent.CancellationException
>         at 
> org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher.rethrowException(ForeignExceptionDispatcher.java:84)
>         at 
> org.apache.hadoop.hbase.procedure.Procedure.waitForLatch(Procedure.java:357)
>         at 
> org.apache.hadoop.hbase.procedure.Procedure.call(Procedure.java:203)
>         at org.apache.hadoop.hbase.procedure.Procedure.call(Procedure.java:68)
>         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>         at java.lang.Thread.run(Thread.java:662)
> Caused by: 
> org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable: 
> java.util.concurrent.CancellationException
>         at 
> org.apache.hadoop.hbase.procedure.Subprocedure.cancel(Subprocedure.java:270)
>         at 
> org.apache.hadoop.hbase.procedure.Subprocedure.call(Subprocedure.java:202)
>         at 
> org.apache.hadoop.hbase.procedure.Subprocedure.call(Subprocedure.java:52)
>         ... 5 more
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to