getQueuedBuilds(): Handle dependent builds first

[?]
Jun 17, 2015, 12:46 PM
JAUB2FT5SNQWXR24TWTOHVT6UUJ6OQPAFPBZIQAQBHVWHWWFHLYAC

Dependencies

  • [2] HHOMBU7G hydra-queue-runner: Implement timeouts
  • [3] NJJ7H64S Very basic multi-threaded queue runner
  • [4] C6HOMHZW Don't try to handle SIGINT
  • [5] 24BMQDZA Start of single-process hydra-queue-runner
  • [6] UQQ4IL55 Add a error type for "unsupported system type"
  • [7] 2IQRXLWE Support cancelling builds
  • [8] GKZN4UV7 Make the queue monitor more robust, and better debug output
  • [9] FQQRJUO4 Mark builds as busy
  • [10] YZAI5GQU Implement a database connection pool
  • [11] N5O7VEEO Immediately abort builds that require an unsupported system type
  • [12] ENXUSMSV Make concurrency more robust
  • [13] IWB3F4Z6 Fail builds with previously failed steps early
  • [14] 5AIYUMTB Basic remote building
  • [15] 22LDPAIP Check non-runnable steps for unsupported system type

Change contents

  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 482
    [3.1741][3.1741:1798]()
    std::list<Build::ptr> newBuilds; // FIXME: use queue
    [3.1741]
    [3.1798]
    std::multimap<Path, Build::ptr> newBuilds;
  • edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 501
    [2.715][2.715:795]()
    std::cerr << build->id << " " << build->buildTimeout << std::endl;
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 502
    [3.10057][3.2451:2491]()
    newBuilds.push_back(build);
    [3.10057]
    [3.2491]
    newBuilds.emplace(std::make_pair(build->drvPath, build));
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 506
    [3.10236][3.2508:2856]()
    /* Now instantiate build steps for each new build. The builder
    threads can start building the runnable build steps right away,
    even while we're still processing other new builds. */
    for (auto & build : newBuilds) {
    // FIXME: remove build from newBuilds to ensure quick destruction
    // FIXME: exception handling
    [3.10236]
    [3.10351]
    std::set<Step::ptr> newRunnable;
    unsigned int nrAdded;
    std::function<void(Build::ptr)> createBuild;
  • edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 510
    [3.10352]
    [3.870]
    createBuild = [&](Build::ptr build) {
  • edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 512
    [3.970]
    [3.10473]
    nrAdded++;
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 525
    [3.10994][3.10994:11016]()
    continue;
    [3.10994]
    [3.11016]
    return;
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 528
    [3.11027][3.77:128]()
    std::set<Step::ptr> newSteps, newRunnable;
    [3.11027]
    [3.128]
    std::set<Step::ptr> newSteps;
  • edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 530
    [3.211]
    [3.3067]
    /* Some of the new steps may be the top level of builds that
    we haven't processed yet. So do them now. This ensures that
    if build A depends on build B with top-level step X, then X
    will be "accounted" to B in doBuildStep(). */
    for (auto & r : newSteps) {
    while (true) {
    auto i = newBuilds.find(r->drvPath);
    if (i == newBuilds.end()) break;
    Build::ptr b = i->second;
    newBuilds.erase(i);
    createBuild(b);
    }
    }
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 558
    [3.273][3.273:295]()
    continue;
    [3.273]
    [3.295]
    return;
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 606
    [3.11403][3.1201:1232]()
    if (badStep) continue;
    [3.11403]
    [3.11435]
    if (badStep) return;
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 619
    [3.3558][3.1161:1275](),[3.1275][3.361:442](),[3.361][3.361:442]()
    printMsg(lvlChatty, format("added build %1% (top-level step %2%, %3% new steps, %4% new runnable steps)")
    % build->id % step->drvPath % newSteps.size() % newRunnable.size());
    [3.3558]
    [3.10110]
    printMsg(lvlChatty, format("added build %1% (top-level step %2%, %3% new steps)")
    % build->id % step->drvPath % newSteps.size());
  • edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 627
    [3.3806]
    [3.3806]
    };
    /* Now instantiate build steps for each new build. The builder
    threads can start building the runnable build steps right away,
    even while we're still processing other new builds. */
    while (!newBuilds.empty()) {
    auto build = newBuilds.begin()->second;
    newBuilds.erase(newBuilds.begin());
    newRunnable.clear();
    nrAdded = 0;
    createBuild(build);
  • edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 642
    [3.3915]
    [3.3915]
    printMsg(lvlChatty, format("got %1% new runnable steps from %2% new builds") % newRunnable.size() % nrAdded);
  • edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 1264
    [3.14778][2.1601:1616]()
    sleep(5);