summaryrefslogtreecommitdiffstats
path: root/sbin/hastd
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2010-08-30 00:31:30 +0000
committerpjd <pjd@FreeBSD.org>2010-08-30 00:31:30 +0000
commite14a354a91cc5fe75376f5ae2b3d886391e1d1fa (patch)
treee1e50241a8f2cfcd2c755a5fd5a16d010fdcfe81 /sbin/hastd
parent235764220432099ce51504a72f54b0824730c31f (diff)
downloadFreeBSD-src-e14a354a91cc5fe75376f5ae2b3d886391e1d1fa.zip
FreeBSD-src-e14a354a91cc5fe75376f5ae2b3d886391e1d1fa.tar.gz
Execute hook when connection between the nodes is established or lost.
MFC after: 2 weeks Obtained from: Wheel Systems Sp. z o.o. http://www.wheelsystems.com
Diffstat (limited to 'sbin/hastd')
-rw-r--r--sbin/hastd/hast.conf.520
-rw-r--r--sbin/hastd/primary.c7
-rw-r--r--sbin/hastd/secondary.c24
3 files changed, 41 insertions, 10 deletions
diff --git a/sbin/hastd/hast.conf.5 b/sbin/hastd/hast.conf.5
index f12768e..87a7e35 100644
--- a/sbin/hastd/hast.conf.5
+++ b/sbin/hastd/hast.conf.5
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd August 29, 2010
+.Dd August 30, 2010
.Dt HAST.CONF 5
.Os
.Sh NAME
@@ -212,6 +212,20 @@ Execute the given program on various HAST events.
Below is the list of currently implemented events and arguments the given
program is executed with:
.Bl -tag -width ".Ic xxxx"
+.It Ic "<path> role <resource> <oldrole> <newrole>"
+.Pp
+Executed on both primary and secondary nodes when resource role is changed.
+.Pp
+.It Ic "<path> connect <resource>"
+.Pp
+Executed on both primary and secondary nodes when connection for the given
+resource between the nodes is established.
+.Pp
+.It Ic "<path> disconnect <resource>"
+.Pp
+Executed on both primary and secondary nodes when connection for the given
+resource between the nodes is lost.
+.Pp
.It Ic "<path> syncstart <resource>"
.Pp
Executed on primary node when synchronization process of secondary node is
@@ -228,10 +242,6 @@ Executed on primary node when synchronization process of secondary node is
interrupted, most likely due to secondary node outage or connection failure
between the nodes.
.Pp
-.It Ic "<path> role <resource> <oldrole> <newrole>"
-.Pp
-Executed on both primary and secondary nodes when resource role is changed.
-.Pp
.It Ic "<path> split-brain <resource>"
.Pp
Executed on both primary and secondary nodes when split-brain condition is
diff --git a/sbin/hastd/primary.c b/sbin/hastd/primary.c
index 73155a1..86f274f 100644
--- a/sbin/hastd/primary.c
+++ b/sbin/hastd/primary.c
@@ -672,6 +672,7 @@ init_remote(struct hast_resource *res, struct proto_conn **inp,
res->hr_remotein = in;
res->hr_remoteout = out;
}
+ hook_exec(res->hr_exec, "connect", res->hr_name, NULL);
return (true);
close:
if (errmsg != NULL && strcmp(errmsg, "Split-brain condition!") == 0)
@@ -765,8 +766,6 @@ hastd_primary(struct hast_resource *res)
pid_t pid;
int error;
- gres = res;
-
/*
* Create communication channel between parent and child.
*/
@@ -788,6 +787,8 @@ hastd_primary(struct hast_resource *res)
return;
}
+ gres = res;
+
(void)pidfile_close(pfh);
hook_fini();
@@ -894,6 +895,8 @@ remote_close(struct hast_resource *res, int ncomp)
* Stop synchronization if in-progress.
*/
sync_stop();
+
+ hook_exec(res->hr_exec, "disconnect", res->hr_name, NULL);
}
/*
diff --git a/sbin/hastd/secondary.c b/sbin/hastd/secondary.c
index d92030c..d1575e8 100644
--- a/sbin/hastd/secondary.c
+++ b/sbin/hastd/secondary.c
@@ -74,6 +74,8 @@ struct hio {
TAILQ_ENTRY(hio) hio_next;
};
+static struct hast_resource *gres;
+
/*
* Free list holds unused structures. When free list is empty, we have to wait
* until some in-progress requests are freed.
@@ -360,6 +362,8 @@ hastd_secondary(struct hast_resource *res, struct nv *nvin)
return;
}
+ gres = res;
+
(void)pidfile_close(pfh);
hook_fini();
@@ -378,6 +382,7 @@ hastd_secondary(struct hast_resource *res, struct nv *nvin)
init_local(res);
init_remote(res, nvin);
init_environment();
+ hook_exec(res->hr_exec, "connect", res->hr_name, NULL);
error = pthread_create(&td, NULL, recv_thread, res);
assert(error == 0);
@@ -501,6 +506,19 @@ end:
return (hio->hio_error);
}
+static void
+secondary_exit(int exitcode, const char *fmt, ...)
+{
+ va_list ap;
+
+ assert(exitcode != EX_OK);
+ va_start(ap, fmt);
+ pjdlogv_errno(LOG_ERR, fmt, ap);
+ va_end(ap);
+ hook_exec(gres->hr_exec, "disconnect", gres->hr_name, NULL);
+ exit(exitcode);
+}
+
/*
* Thread receives requests from the primary node.
*/
@@ -515,7 +533,7 @@ recv_thread(void *arg)
QUEUE_TAKE(free, hio);
pjdlog_debug(2, "recv: (%p) Got request.", hio);
if (hast_proto_recv_hdr(res->hr_remotein, &hio->hio_nv) < 0) {
- pjdlog_exit(EX_TEMPFAIL,
+ secondary_exit(EX_TEMPFAIL,
"Unable to receive request header");
}
if (requnpack(res, hio) != 0) {
@@ -537,7 +555,7 @@ recv_thread(void *arg)
} else if (hio->hio_cmd == HIO_WRITE) {
if (hast_proto_recv_data(res, res->hr_remotein,
hio->hio_nv, hio->hio_data, MAXPHYS) < 0) {
- pjdlog_exit(EX_TEMPFAIL,
+ secondary_exit(EX_TEMPFAIL,
"Unable to receive reply data");
}
}
@@ -693,7 +711,7 @@ send_thread(void *arg)
nv_add_int16(nvout, hio->hio_error, "error");
if (hast_proto_send(res, res->hr_remoteout, nvout, data,
length) < 0) {
- pjdlog_exit(EX_TEMPFAIL, "Unable to send reply.");
+ secondary_exit(EX_TEMPFAIL, "Unable to send reply.");
}
nv_free(nvout);
pjdlog_debug(2, "send: (%p) Moving request to the free queue.",
OpenPOWER on IntegriCloud