int timeout,
struct ctdbd_connection **pconn);
-uint32_t ctdbd_vnn(const struct ctdbd_connection *conn);
int ctdbd_generation(struct ctdbd_connection *conn, uint32_t *generation);
+uint32_t ctdbd_vnn(const struct ctdbd_connection *conn);
+pid_t ctdbd_pid(const struct ctdbd_connection *conn);
+struct timeval ctdbd_start_time(const struct ctdbd_connection *conn);
int ctdbd_conn_get_fd(struct ctdbd_connection *conn);
void ctdbd_socket_readable(struct tevent_context *ev,
};
struct ctdbd_connection {
+ struct {
+ pid_t pid;
+ struct timeval start_time;
+ } local_ctdbd;
uint32_t reqid;
uint32_t our_vnn;
uint64_t rand_srvid;
return 0;
}
+/*
+ * get the pid of the ctdbd process
+ */
+static int get_ctdbd_pid(struct ctdbd_connection *conn, pid_t *pid)
+{
+ int32_t cstatus=-1;
+ int ret;
+ ret = ctdbd_control_local(conn, CTDB_CONTROL_GET_PID, 0, 0,
+ tdb_null, NULL, NULL, &cstatus);
+ if (ret != 0) {
+ DEBUG(1, ("ctdbd_control failed: %s\n", strerror(ret)));
+ return ret;
+ }
+ *pid = (pid_t)cstatus;
+ return ret;
+}
+
+/*
+ * get the start time of the ctdbd process
+ */
+static int get_ctdbd_start_time(struct ctdbd_connection *conn,
+ struct timeval *st)
+{
+ const struct ctdb_uptime *uptime = NULL;
+ int32_t cstatus=-1;
+ TDB_DATA outdata = {0};
+ int ret;
+
+ ret = ctdbd_control_local(conn, CTDB_CONTROL_UPTIME, 0, 0,
+ tdb_null, conn, &outdata, &cstatus);
+ if (ret != 0) {
+ DEBUG(1, ("ctdbd_control failed: %s\n", strerror(ret)));
+ return ret;
+ }
+ if ((cstatus != 0) || (outdata.dptr == NULL)) {
+ DEBUG(2, ("Received invalid ctdb data\n"));
+ return EINVAL;
+ }
+ if (outdata.dsize != sizeof(*uptime)) {
+ talloc_free(outdata.dptr);
+ DEBUG(2, ("Received invalid ctdb data\n"));
+ return EINVAL;
+ }
+
+ uptime = (const struct ctdb_uptime *)outdata.dptr;
+ *st = uptime->ctdbd_start_time;
+ talloc_free(outdata.dptr);
+ return 0;
+}
+
/*
* get our vnn from the cluster
*/
return conn->our_vnn;
}
+pid_t ctdbd_pid(const struct ctdbd_connection *conn)
+{
+ return conn->local_ctdbd.pid;
+}
+
+struct timeval ctdbd_start_time(const struct ctdbd_connection *conn)
+{
+ return conn->local_ctdbd.start_time;
+}
+
/*
* Get us a ctdb connection
*/
return ret;
}
+ ret = get_ctdbd_pid(conn, &conn->local_ctdbd.pid);
+ if (ret != 0) {
+ DEBUG(10, ("get_ctdbd_pid failed: %s\n", strerror(ret)));
+ return ret;
+ }
+
+ ret = get_ctdbd_start_time(conn, &conn->local_ctdbd.start_time);
+ if (ret != 0) {
+ DEBUG(10, ("get_ctdbd_start_time failed: %s\n", strerror(ret)));
+ return ret;
+ }
+
if (!ctdbd_working(conn, conn->our_vnn)) {
DEBUG(2, ("Node is not working, can not connect\n"));
return EIO;