I like your solution in principle, but I think it would be better to loop until the queue reports that it's empty.
On Wed, Nov 28, 2018, 8:18 PM OpenInx <[email protected] wrote: > Thanks Allan's reply > > So if we can ensure that all children are independent, then it won't be a > problem. > But the reversed shcedule order is some counterintuitive. I think a minor > change can > help fix this: > > diff --git > > a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java > > b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java > index cbdb9b8..b688ec3 100644 > --- > > a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java > +++ > > b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java > @@ -1794,7 +1794,7 @@ public class ProcedureExecutor<TEnvironment> { > } > > private void submitChildrenProcedures(Procedure<TEnvironment>[] > subprocs) { > - for (int i = 0; i < subprocs.length; ++i) { > + for (int i = subprocs.length - 1; i >= 0; i--) { > Procedure<TEnvironment> subproc = subprocs[i]; > subproc.updateMetricsOnSubmit(getEnvironment()); > assert !procedures.containsKey(subproc.getProcId()); > > Thanks. > > On Wed, Nov 28, 2018 at 11:13 PM Allan Yang <[email protected]> wrote: > > > Yes, you are right, every procedure will be add to front, so the final > > execution order may be reversed, But actually, there will be more than > one > > worker threads, so likely, they will be executed at the same time. I > think > > the design is unintentionally, since all the child procedure should be > > independent and won't depend on each other, so they can be executed at > any > > order. And more, after HBASE-21375 > > <https://issues.apache.org/jira/browse/HBASE-21375> checked in all 2.x > > branch, the worker thread will execute every possible procedure in the > > queue, so the front ones won't block, so this won't be a problem. > > Best Regards > > Allan Yang > > > > > > OpenInx <[email protected]> 于2018年11月28日周三 下午10:42写道: > > > > > Hi : > > > > > > I read parts of the procedure v2 framework, and found that if a > > procedure > > > has 3 added child procedure, > > > then it's children will be schedued in the reversed order. > > > > > > Let me give an example. if a procedure A added 3 child procedure: B, > C , > > > D. > > > > > > a.addChildProcedure(B, C, D) > > > > > > The procedure framework will add the B,C,D child produre in a dequeue > to > > > schedule > > > > > > ( Code Path --- ProcedureExecutor#execProcedure > > > -- submitChildrenProcedures -- dequeue#addFront ) > > > > > > So the dequeue will be : (front) D, C, B (back) > > > > > > Then we will poll each procedure from the dequeue, and dispatch to the > > > executor to run .. > > > > > > In the final, the procedure executing order will be : D, C, B, > which > > is > > > the revered order compared to the addChildProcedure order. > > > > > > My question is : is it designed intentionally ? Or unintentionally > > doing > > > the wrong implementation ? > > > > > > Seems most the child procedure are region assign or unassign, looks > like > > no > > > problem now.. > > > > > > Please correct me if I am wrong or missing something. > > > > > > Thanks. > > > > > >
