hydra-queue-runner: Fix segfault sorting machines by load

[?]
Jun 21, 2015, 2:21 PM
ODCBSLFGJGNOMKPZV6TS2SVTQMVUXR3K2BQJHNAJHTR4HECDBBNAC

Dependencies

  • [2] UPZXMQDE Fix machine selection
  • [3] HUUZFPPK Fix race between the queue monitor and the builder threads
  • [4] NNOCZ4RO hydra-queue-runner: Improve dispatcher
  • [5] OCZ4LSGG Automatically retry aborted builds
  • [6] 5AIYUMTB Basic remote building
  • [*] 24BMQDZA Start of single-process hydra-queue-runner

Change contents

  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 865
    [3.173][3.173:284]()
    /* Bail out when there are no slots left. */
    std::vector<Machine::ptr> machinesSorted;
    [3.173]
    [3.284]
    /* Copy the currentJobs field of each machine. This is
    necessary to ensure that the sort comparator below is a
    ordering. std::sort() can segfault if it isn't. */
    struct MachineInfo
    {
    Machine::ptr machine;
    unsigned int currentJobs;
    };
    std::vector<MachineInfo> machinesSorted;
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 876
    [3.347][3.347:466]()
    machinesSorted.insert(machinesSorted.end(),
    machines_->begin(), machines_->end());
    [3.347]
    [3.466]
    for (auto & m : *machines_)
    machinesSorted.push_back({m, m->currentJobs});
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 892
    [3.990][3.990:1065]()
    [](const Machine::ptr & a, const Machine::ptr & b) -> bool
    [3.990]
    [3.2104]
    [](const MachineInfo & a, const MachineInfo & b) -> bool
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 894
    [3.2122][3.1066:1210]()
    float ta = roundf(a->currentJobs / a->speedFactor);
    float tb = roundf(b->currentJobs / b->speedFactor);
    [3.2122]
    [3.1210]
    float ta = roundf(a.currentJobs / a.machine->speedFactor);
    float tb = roundf(b.currentJobs / b.machine->speedFactor);
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 898
    [2.45][3.1282:1375](),[3.1282][3.1282:1375](),[3.1375][2.46:103]()
    a->speedFactor != b->speedFactor ? a->speedFactor > b->speedFactor :
    a->currentJobs > b->currentJobs;
    [2.45]
    [3.1424]
    a.machine->speedFactor != b.machine->speedFactor ? a.machine->speedFactor > b.machine->speedFactor :
    a.currentJobs > b.currentJobs;
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 908
    [3.1750][3.1750:1802]()
    for (auto & machine : machinesSorted) {
    [3.1750]
    [3.1802]
    for (auto & mi : machinesSorted) {
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 910
    [3.1882][3.1882:1954]()
    if (machine->currentJobs >= machine->maxJobs) continue;
    [3.1882]
    [3.1954]
    if (mi.machine->currentJobs >= mi.machine->maxJobs) continue;
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 928
    [3.2580][3.2580:2636]()
    if (!machine->supportsStep(step)) {
    [3.2580]
    [3.2350]
    if (!mi.machine->supportsStep(step)) {
  • replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 947
    [3.3244][3.3244:3330]()
    auto reservation = std::make_shared<MachineReservation>(machine);
    [3.3244]
    [3.3330]
    auto reservation = std::make_shared<MachineReservation>(mi.machine);