Commit 3abf7e8e authored by AdamSimpson's avatar AdamSimpson
Browse files

Reorder reservation removal to a more logical spot

parent 4852e51d
Loading
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -12,7 +12,12 @@ void BuilderQueue::tick(asio::yield_context yield) {
    auto all_builders = OpenStackBuilder::get_builders(io_service, yield);
    std::set<Builder> unavailable_builders;

    // Process reservations
    // Delete reservations that are completed
    reservations.remove_if([](const auto &reservation) {
        return reservation.finalized();
    });

    // Process existing reservations
    for (auto &reservation : reservations) {
        // Set unavailable builders, that is builders which are attached to a reservation
        if (reservation.builder) {
@@ -30,18 +35,13 @@ void BuilderQueue::tick(asio::yield_context yield) {
        }
    }

    // Delete reservations that are completed
    reservations.remove_if([](const auto &reservation) {
        return reservation.finalized();
    });

    // Available_builders = all_builders - unavailable_builders
    std::set<Builder> available_builders;
    std::set_difference(all_builders.begin(), all_builders.end(),
                        unavailable_builders.begin(), unavailable_builders.end(),
                        std::inserter(available_builders, available_builders.begin()));

    // Assign builders to any pending reservations
    // Assign any available builders to any pending reservations
    for (auto &reservation : reservations) {
        if (reservation.pending() && !available_builders.empty()) {
            reservation.ready(*available_builders.begin());
@@ -50,7 +50,8 @@ void BuilderQueue::tick(asio::yield_context yield) {
    }

    // Request new builders if slots are open
    // Care must be taken as all_builders may include the the pending request before it's returned(open_slots, open_available_slots may be negative)
    // Care must be taken as all_builders may include a builder from a pending request that hasn't completely returned yet
    // that is to say open_slots, open_available_slots may be negative
    int open_slots = max_builders - all_builders.size() - pending_requests;
    int open_available_slots = max_available_builders - available_builders.size() - pending_requests;
    int request_count = std::min(open_slots, open_available_slots);