Turn hydra-notify into a daemon
It now receives notifications about started/finished builds/steps via PostgreSQL. This gets rid of the (substantial) overhead of starting hydra-notify for every event. It also allows other programs (even on other machines) to listen to Hydra notifications.
This commit is contained in:
@ -347,39 +347,6 @@ private:
|
||||
counter bytesSent{0};
|
||||
counter bytesReceived{0};
|
||||
counter nrActiveDbUpdates{0};
|
||||
counter nrNotificationsDone{0};
|
||||
counter nrNotificationsFailed{0};
|
||||
counter nrNotificationsInProgress{0};
|
||||
counter nrNotificationTimeMs{0};
|
||||
|
||||
/* Notification sender work queue. FIXME: if hydra-queue-runner is
|
||||
killed before it has finished sending notifications about a
|
||||
build, then the notifications may be lost. It would be better
|
||||
to mark builds with pending notification in the database. */
|
||||
struct NotificationItem
|
||||
{
|
||||
enum class Type : char {
|
||||
BuildStarted,
|
||||
BuildFinished,
|
||||
StepFinished,
|
||||
};
|
||||
Type type;
|
||||
BuildID id;
|
||||
std::vector<BuildID> dependentIds;
|
||||
unsigned int stepNr;
|
||||
nix::Path logPath;
|
||||
};
|
||||
nix::Sync<std::queue<NotificationItem>> notificationSenderQueue;
|
||||
std::condition_variable notificationSenderWakeup;
|
||||
|
||||
void enqueueNotificationItem(const NotificationItem && item)
|
||||
{
|
||||
{
|
||||
auto notificationSenderQueue_(notificationSenderQueue.lock());
|
||||
notificationSenderQueue_->emplace(item);
|
||||
}
|
||||
notificationSenderWakeup.notify_one();
|
||||
}
|
||||
|
||||
/* Specific build to do for --build-one (testing only). */
|
||||
BuildID buildOne;
|
||||
@ -540,9 +507,10 @@ private:
|
||||
|
||||
bool checkCachedFailure(Step::ptr step, Connection & conn);
|
||||
|
||||
/* Thread that asynchronously invokes hydra-notify to send build
|
||||
notifications. */
|
||||
void notificationSender();
|
||||
void notifyBuildStarted(pqxx::work & txn, BuildID buildId);
|
||||
|
||||
void notifyBuildFinished(pqxx::work & txn, BuildID buildId,
|
||||
const std::vector<BuildID> & dependentIds);
|
||||
|
||||
/* Acquire the global queue runner lock, or null if somebody else
|
||||
has it. */
|
||||
|
Reference in New Issue
Block a user