Page MenuHomePhabricator

Split Harbormaster workers apart so build steps can run in parallel
ClosedPublic

Authored by epriestley on Jan 4 2014, 8:25 PM.
Tags
None
Referenced Files
F18812916: D7890.id.diff
Mon, Oct 20, 1:04 PM
F18810115: D7890.id17871.diff
Sun, Oct 19, 7:34 PM
F18771832: D7890.diff
Wed, Oct 8, 10:14 PM
F18767655: D7890.id17850.diff
Tue, Oct 7, 11:36 PM
F18737728: D7890.id.diff
Wed, Oct 1, 12:18 PM
F18727677: D7890.diff
Tue, Sep 30, 8:41 AM
F18625688: D7890.diff
Sep 15 2025, 11:19 PM
F18557093: D7890.id.diff
Sep 8 2025, 7:51 PM
Subscribers

Details

Summary

Ref T1049. Currently, the Harbormaster worker looks like this:

foreach (step) {
  run_step(step);
}

This means steps can't ever be run in parallel. Instead, split it into two workers. The "Build" worker starts things off, and basically does:

update_build();

(We could theoretically do this in the original process because it should never take very long, but since there's a lock and it's a little bit complex it seemed cleaner to separate it.)

The "Target" worker runs an individual target (like a command, or an HTTP request, or whatever), then updates the build:

run_one_step(step);
update_build();

The new update_build() mechanism in HarbormasterBuildEngine does this, roughly:

figure_out_overall_status_of_all_steps();
if (build is done) { done(); }
if (build is fail) { fail(); }
foreach (step that is ready to run) {
  queue_target_worker_for_step(step);
}

So, overall:

  • The part of the code that updates Builds is completely separated from the part of the code that updates Targets.
  • Targets can run in parallel.
Test Plan
  • Ran a bunch of builds via bin/harbormaster build.
  • Ran a bunch of builds via web UI.

Diff Detail

Lint
Lint Skipped
Unit
Tests Skipped

Event Timeline

btrahan added inline comments.
src/applications/harbormaster/engine/HarbormasterBuildEngine.php
23

typehint

epriestley updated this revision to Unknown Object (????).Jan 6 2014, 8:24 PM
  • Add missing typehint.