aboutsummaryrefslogtreecommitdiff
path: root/mod/mod-build-result.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'mod/mod-build-result.cxx')
-rw-r--r--mod/mod-build-result.cxx34
1 files changed, 31 insertions, 3 deletions
diff --git a/mod/mod-build-result.cxx b/mod/mod-build-result.cxx
index cc058b5..666e7ef 100644
--- a/mod/mod-build-result.cxx
+++ b/mod/mod-build-result.cxx
@@ -354,7 +354,9 @@ handle (request& rq, response&)
// If we ought to call the tenant_service_build_queued::build_queued()
// callback, then also set the package tenant's queued timestamp to
- // the current time to prevent the notifications race (see
+ // the current time to prevent the task handler from picking the build
+ // and potentially interfering with us by sending its `building`
+ // notification before we send our `queued` notification (see
// tenant::queued_timestamp for details).
//
if (tsq != nullptr)
@@ -565,7 +567,7 @@ handle (request& rq, response&)
{
assert (tss); // Wouldn't be here otherwise.
- const tenant_service& ss (tss->first);
+ tenant_service& ss (tss->first);
const build& b (*tss->second);
// Release the database connection since build_built() notification can
@@ -576,7 +578,33 @@ handle (request& rq, response&)
if (auto f = tsb->build_built (b.tenant, ss, b, log_writer_))
{
conn = build_db_->connection ();
- update_tenant_service_state (conn, ss.type, ss.id, f);
+
+ bool build_completed (false);
+
+ if (optional<string> data =
+ update_tenant_service_state (
+ conn, ss.type, ss.id,
+ [&f, &build_completed] (const string& tid,
+ const tenant_service& ts)
+ {
+ auto r (f (tid, ts));
+ build_completed = r.second;
+ return move (r.first);
+ }))
+ {
+ ss.data = move (data);
+ }
+
+ if (build_completed)
+ {
+ // Release the database connection since the build_completed()
+ // notification can potentially be time-consuming (e.g., it may
+ // perform an HTTP request).
+ //
+ conn.reset ();
+
+ tsb->build_completed (b.tenant, ss, log_writer_);
+ }
}
}