aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mod/mod-build-result.cxx30
-rw-r--r--mod/mod-build-task.cxx27
-rw-r--r--mod/mod-ci-github.cxx13
-rw-r--r--mod/mod-ci-github.hxx3
-rw-r--r--mod/mod-ci.cxx7
-rw-r--r--mod/mod-ci.hxx4
-rw-r--r--mod/tenant-service.cxx18
-rw-r--r--mod/tenant-service.hxx12
8 files changed, 97 insertions, 17 deletions
diff --git a/mod/mod-build-result.cxx b/mod/mod-build-result.cxx
index cc058b5..b303386 100644
--- a/mod/mod-build-result.cxx
+++ b/mod/mod-build-result.cxx
@@ -565,7 +565,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 +576,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_);
+ }
}
}
diff --git a/mod/mod-build-task.cxx b/mod/mod-build-task.cxx
index c8b1bb2..88e5618 100644
--- a/mod/mod-build-task.cxx
+++ b/mod/mod-build-task.cxx
@@ -2407,7 +2407,7 @@ handle (request& rq, response& rs)
}
// If a third-party service needs to be notified about the package
- // build, then call the tenant_service_build_built::build_building()
+ // build, then call the tenant_service_build_building::build_building()
// callback function and, if requested, update the tenant-associated
// service state.
//
@@ -2556,9 +2556,32 @@ handle (request& rq, response& rs)
{
conn = build_db_->connection ();
+ bool build_completed (false);
+
if (optional<string> data =
- update_tenant_service_state (conn, ss.type, ss.id, f))
+ 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_);
+ }
}
}
}
diff --git a/mod/mod-ci-github.cxx b/mod/mod-ci-github.cxx
index cda7111..c451154 100644
--- a/mod/mod-ci-github.cxx
+++ b/mod/mod-ci-github.cxx
@@ -2596,7 +2596,8 @@ namespace brep
return nullptr;
}
- function<optional<string> (const string&, const tenant_service&)> ci_github::
+ function<pair<optional<string>, bool> (const string&,
+ const tenant_service&)> ci_github::
build_built (const string& tenant_id,
const tenant_service& ts,
const build& b,
@@ -2998,13 +2999,15 @@ namespace brep
completed = completed,
error = move (error),
warn = move (warn)] (const string& ti,
- const tenant_service& ts) -> optional<string>
+ const tenant_service& ts)
{
// NOTE: this lambda may be called repeatedly (e.g., due to transaction
// being aborted) and so should not move out of its captures.
+ // Do nothing if the tenant has been replaced.
+ //
if (tenant_id != ti)
- return nullopt; // Do nothing if the tenant has been replaced.
+ return make_pair (optional<string> (), false);
service_data sd;
try
@@ -3014,7 +3017,7 @@ namespace brep
catch (const invalid_argument& e)
{
error << "failed to parse service data: " << e;
- return nullopt;
+ return make_pair (optional<string> (), false);
}
if (iat)
@@ -3072,7 +3075,7 @@ namespace brep
}
}
- return sd.json ();
+ return make_pair (optional<string> (sd.json ()), false);
};
}
catch (const std::exception& e)
diff --git a/mod/mod-ci-github.hxx b/mod/mod-ci-github.hxx
index c21d3db..4d306bb 100644
--- a/mod/mod-ci-github.hxx
+++ b/mod/mod-ci-github.hxx
@@ -72,7 +72,8 @@ namespace brep
const build&,
const diag_epilogue& log_writer) const noexcept override;
- virtual function<optional<string> (const string&, const tenant_service&)>
+ virtual function<pair<optional<string>, bool> (const string&,
+ const tenant_service&)>
build_built (const string& tenant_id,
const tenant_service&,
const build&,
diff --git a/mod/mod-ci.cxx b/mod/mod-ci.cxx
index 16ec5a7..85c00c6 100644
--- a/mod/mod-ci.cxx
+++ b/mod/mod-ci.cxx
@@ -496,8 +496,8 @@ build_building (const string& /*tenant_id*/,
};
}
-function<optional<string> (const string& tenant_id,
- const brep::tenant_service&)> brep::ci::
+function<pair<optional<string>, bool> (const string& tenant_id,
+ const brep::tenant_service&)> brep::ci::
build_built (const string& /*tenant_id*/,
const tenant_service&,
const build& b,
@@ -515,7 +515,8 @@ build_built (const string& /*tenant_id*/,
b.toolchain_name + '/' +
b.toolchain_version.string ());
- return ts.data ? *ts.data + ", " + s : s;
+ return make_pair (
+ optional<string> (ts.data ? *ts.data + ", " + s : s), false);
};
}
diff --git a/mod/mod-ci.hxx b/mod/mod-ci.hxx
index 132b5b0..54532e6 100644
--- a/mod/mod-ci.hxx
+++ b/mod/mod-ci.hxx
@@ -87,8 +87,8 @@ namespace brep
const build&,
const diag_epilogue& log_writer) const noexcept override;
- virtual function<optional<string> (const string& tenant_id,
- const tenant_service&)>
+ virtual function<pair<optional<string>, bool> (const string& tenant_id,
+ const tenant_service&)>
build_built (const string& tenant_id,
const tenant_service&,
const build&,
diff --git a/mod/tenant-service.cxx b/mod/tenant-service.cxx
new file mode 100644
index 0000000..2c1f3bc
--- /dev/null
+++ b/mod/tenant-service.cxx
@@ -0,0 +1,18 @@
+// file : mod/tenant-service.cxx -*- C++ -*-
+// license : MIT; see accompanying LICENSE file
+
+#include <mod/tenant-service.hxx>
+
+namespace brep
+{
+ void tenant_service_build_built::
+ build_completed (const string& /* tenant_id */,
+ const tenant_service&,
+ const diag_epilogue& /* log_writer */) const noexcept
+ {
+ // If this notification is requested, then this function needs to be
+ // overridden by the tenant service implementation.
+ //
+ assert (false);
+ }
+}
diff --git a/mod/tenant-service.hxx b/mod/tenant-service.hxx
index 5564a56..d909eaa 100644
--- a/mod/tenant-service.hxx
+++ b/mod/tenant-service.hxx
@@ -127,12 +127,20 @@ namespace brep
class tenant_service_build_built: public virtual tenant_service_base
{
public:
- virtual function<optional<string> (const string& tenant_id,
- const tenant_service&)>
+ // The second half of the pair signals whether to call the
+ // build_completed() notification.
+ //
+ virtual function<pair<optional<string>, bool> (const string& tenant_id,
+ const tenant_service&)>
build_built (const string& tenant_id,
const tenant_service&,
const build&,
const diag_epilogue& log_writer) const noexcept = 0;
+
+ virtual void
+ build_completed (const string& tenant_id,
+ const tenant_service&,
+ const diag_epilogue& log_writer) const noexcept;
};
// This notification is only made on unloaded CI requests created with the