Ok, I lied, I couldn't get to sleep anyway, so I spent some
more time looking at this.

And I think I understand this a little better now. I wasn't paying attention before... after the EnqueueFeaturesTask finishes and we
do the take() on the CompletionService object, we loop back up
to the top of that do block again, and then find outselves sitting here:


// ... snip

                        for (WorkflowJob candidate : wc.jobsToRun)
                        {
                                if (candidate.ready(wc.depsDone))
                                {
                                        
                                
                                        runThisCycle.add(candidate);
                                
                                
                                }
                        }


The jobs in wc.jobsToRun are now the ones added by the EnqueueFeaturesTask if I'm understanding this correctly.
Anyway, this loop iterates 5 or 6 times.. and here's where
it gets weird... using the debugger, it looks for all the world
like each time we *do* execute this line:

        runThisCycle.add(candidate);

But... after that loop finishes, runThisCycle actually has size = 0.

So this loop:

// Fire off ready jobs and remove from jobsToRun list
                        for (WorkflowJob runJob : runThisCycle) {

                                processor.submit(runJob.task);

                                jobsSubmitted++;

                                wc.jobsToRun.remove(runJob);
                        }


never executes and never does a submit(), since it has nothing
to submit. And that's why we block forever on the take() call, because there just aren't any other jobs to run.

It seems like the question now is,  why don't those other jobs get added
to runThisCycle?


TTYL,


--
Phillip Rhodes
Chief Architect - OpenQabal
https://openqabal.dev.java.net
LinkedIn: http://www.linkedin.com/in/philliprhodes

Reply via email to