[SCM] CTDB repository - branch master updated - ctdb-1.12-93-g0f15a2c
Ronnie Sahlberg
sahlberg at samba.org
Mon Dec 5 19:58:20 MST 2011
The branch, master has been updated
via 0f15a2c65db8f8b4ac0d5ad2755b9aa3c2a8b279 (commit)
via 77dc0c7351071243d9096d3607d7499c82f46ec0 (commit)
from 00212e5c7dd229e7f8975a165d5ab8875d4917cc (commit)
http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 0f15a2c65db8f8b4ac0d5ad2755b9aa3c2a8b279
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Dec 6 13:15:41 2011 +1100
Return the peer_pid properly to the caller
commit 77dc0c7351071243d9096d3607d7499c82f46ec0
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Dec 6 13:11:13 2011 +1100
LibCTDB: Add support for the 'get interfaces' control and update the ctdb tool to use this interface
-----------------------------------------------------------------------
Summary of changes:
common/system_aix.c | 2 +-
common/system_linux.c | 2 +-
include/ctdb.h | 56 +++++++++++++++++++++++++++++++++++++
include/ctdb_private.h | 6 ----
include/ctdb_protocol.h | 19 ++++++++++++
libctdb/control.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++
libctdb/sync.c | 20 +++++++++++++
tools/ctdb.c | 24 ++++++---------
8 files changed, 178 insertions(+), 22 deletions(-)
Changeset truncated at 500 lines:
diff --git a/common/system_aix.c b/common/system_aix.c
index c17598a..388e943 100644
--- a/common/system_aix.c
+++ b/common/system_aix.c
@@ -368,7 +368,7 @@ int ctdb_get_peer_pid(const int fd, pid_t *peer_pid)
socklen_t crl = sizeof(struct peercred_struct);
int ret;
if ((ret = getsockopt(fd, SOL_SOCKET, SO_PEERID, &cr, &crl) == 0)) {
- peer_pid = cr.pid;
+ *peer_pid = cr.pid;
}
return ret;
}
diff --git a/common/system_linux.c b/common/system_linux.c
index cb26dcd..464daef 100644
--- a/common/system_linux.c
+++ b/common/system_linux.c
@@ -570,7 +570,7 @@ int ctdb_get_peer_pid(const int fd, pid_t *peer_pid)
socklen_t crl = sizeof(struct ucred);
int ret;
if ((ret = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cr, &crl) == 0)) {
- peer_pid = cr.pid;
+ *peer_pid = cr.pid;
}
return ret;
}
diff --git a/include/ctdb.h b/include/ctdb.h
index aeab615..795ff5c 100644
--- a/include/ctdb.h
+++ b/include/ctdb.h
@@ -613,6 +613,41 @@ bool ctdb_getnodemap_recv(struct ctdb_connection *ctdb,
struct ctdb_request *req, struct ctdb_node_map **nodemap);
/**
+ * ctdb_getifaces_send - read the list of interfaces from a node.
+ * @ctdb: the ctdb_connection from ctdb_connect.
+ * @destnode: the destination node (see below)
+ * @callback: the callback when ctdb replies to our message (typesafe)
+ * @cbdata: the argument to callback()
+ *
+ * There are several special values for destnode, detailed in
+ * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
+ * local ctdbd.
+ */
+struct ctdb_request *
+ctdb_getifaces_send(struct ctdb_connection *ctdb,
+ uint32_t destnode,
+ ctdb_callback_t callback,
+ void *cbdata);
+/**
+ * ctdb_getifaces_recv - read an ctdb_getifaces reply from ctdbd
+ * @ctdb: the ctdb_connection from ctdb_connect.
+ * @req: the completed request.
+ * @ifaces: the list of interfaces
+ *
+ * This returns false if something went wrong.
+ * If the command failed, it guarantees to set ifaces to NULL.
+ * A non-NULL value for ifaces means the command was successful.
+ *
+ * A non-NULL value of the ifaces must be release released/freed
+ * by ctdb_free_ifaces().
+ */
+bool ctdb_getifaces_recv(struct ctdb_connection *ctdb,
+ struct ctdb_request *req, struct ctdb_ifaces_list **ifaces);
+
+/* Free a datastructure returned by ctdb_getifaces[_recv] */
+void ctdb_free_ifaces(struct ctdb_ifaces_list *ifaces);
+
+/**
* ctdb_getpublicips_send - read the public ip list from a node.
* @ctdb: the ctdb_connection from ctdb_connect.
* @destnode: the destination node (see below)
@@ -898,6 +933,23 @@ bool ctdb_getrecmode(struct ctdb_connection *ctdb,
bool ctdb_getnodemap(struct ctdb_connection *ctdb,
uint32_t destnode, struct ctdb_node_map **nodemap);
+/**
+ * ctdb_getifaces - read the list of interfaces from a node (synchronous)
+ * @ctdb: the ctdb_connection from ctdb_connect.
+ * @destnode: the destination node (see below)
+ * @ifaces: a pointer to the ifaces to fill in
+ *
+ * There are several special values for destnode, detailed in
+ * ctdb_protocol.h, particularly CTDB_CURRENT_NODE which means the
+ * local ctdbd.
+ *
+ * Returns true and fills in *ifaces on success.
+ * A non-NULL value of the ifaces must be release released/freed
+ * by ctdb_free_ifaces().
+ */
+bool ctdb_getifaces(struct ctdb_connection *ctdb,
+ uint32_t destnode, struct ctdb_ifaces_list **ifaces);
+
/*
* This function is used to release/free the nodemap structure returned
* by ctdb_getnodemap() and ctdb_getnodemap_recv()
@@ -1011,4 +1063,8 @@ void ctdb_free_publicips(struct ctdb_all_public_ips *ips);
ctdb_getdbseqnum_send((ctdb), (destnode), (dbid), \
ctdb_sendcb((cb), (cbdata)), (cbdata))
+#define ctdb_getifaces_send(ctdb, destnode, cb, cbdata) \
+ ctdb_getifaces_send((ctdb), (destnode), \
+ ctdb_sendcb((cb), (cbdata)), (cbdata))
+
#endif
diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index 5ce32a1..9e5e188 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -1079,12 +1079,6 @@ int ctdb_ctrl_get_public_ipsv4(struct ctdb_context *ctdb,
struct timeval timeout, uint32_t destnode,
TALLOC_CTX *mem_ctx, struct ctdb_all_public_ips **ips);
-#ifdef IFNAMSIZ
-#define CTDB_IFACE_SIZE IFNAMSIZ
-#else
-#define CTDB_IFACE_SIZE 16
-#endif
-
struct ctdb_control_iface_info {
char name[CTDB_IFACE_SIZE+2];
uint16_t link_state;
diff --git a/include/ctdb_protocol.h b/include/ctdb_protocol.h
index c71bafa..d96f565 100644
--- a/include/ctdb_protocol.h
+++ b/include/ctdb_protocol.h
@@ -654,5 +654,24 @@ struct ctdb_statistics_wire {
struct ctdb_statistics stats[1];
};
+/*
+ * wire format for interface list
+ */
+#ifdef IFNAMSIZ
+#define CTDB_IFACE_SIZE IFNAMSIZ
+#else
+#define CTDB_IFACE_SIZE 16
+#endif
+
+struct ctdb_iface_info {
+ char name[CTDB_IFACE_SIZE+2];
+ uint16_t link_state;
+ uint32_t references;
+};
+
+struct ctdb_ifaces_list {
+ uint32_t num;
+ struct ctdb_iface_info ifaces[1];
+};
#endif
diff --git a/libctdb/control.c b/libctdb/control.c
index 4192381..9beb49f 100644
--- a/libctdb/control.c
+++ b/libctdb/control.c
@@ -29,6 +29,7 @@
#undef ctdb_getnodemap_send
#undef ctdb_getpublicips_send
#undef ctdb_getdbseqnum_send
+#undef ctdb_getifaces_send
bool ctdb_getrecmaster_recv(struct ctdb_connection *ctdb,
struct ctdb_request *req, uint32_t *recmaster)
@@ -284,3 +285,73 @@ ctdb_check_message_handlers_send(struct ctdb_connection *ctdb,
mhs, num * sizeof(uint64_t) ,
callback, private_data);
}
+
+
+bool ctdb_getifaces_recv(struct ctdb_connection *ctdb,
+ struct ctdb_request *req,
+ struct ctdb_ifaces_list **ifaces)
+{
+ struct ctdb_reply_control *reply;
+ struct ctdb_ifaces_list *ifc;
+ int i, len;
+
+ *ifaces = NULL;
+ reply = unpack_reply_control(req, CTDB_CONTROL_GET_IFACES);
+ if (!reply) {
+ return false;
+ }
+ if (reply->status == -1) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getifaces_recv: status -1");
+ return false;
+ }
+ if (reply->datalen == 0) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getifaces_recv: returned data is 0 bytes");
+ return false;
+ }
+
+ len = offsetof(struct ctdb_ifaces_list, ifaces);
+ if (len > reply->datalen) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getifaces_recv: returned data is %d bytes but %d is minimum", reply->datalen, (int)offsetof(struct ctdb_ifaces_list, ifaces));
+ return false;
+ }
+
+ ifc = (struct ctdb_ifaces_list *)(reply->data);
+ len += ifc->num * sizeof(struct ctdb_iface_info);
+
+ if (len != reply->datalen) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getifaces_recv: returned data is %d bytes but should be %d", reply->datalen, len);
+ return false;
+ }
+
+ ifc = malloc(reply->datalen);
+ if (ifc == NULL) {
+ DEBUG(ctdb, LOG_ERR, "ctdb_getifaces_recv: failed to malloc buffer");
+ return false;
+ }
+ memcpy(ifc, reply->data, reply->datalen);
+
+ /* make sure we null terminate the returned strings */
+ for (i = 0; i < ifc->num; i++) {
+ ifc->ifaces[i].name[CTDB_IFACE_SIZE] = '\0';
+ }
+
+ *ifaces = ifc;
+
+ return true;
+}
+
+void ctdb_free_ifaces(struct ctdb_ifaces_list *ifaces)
+{
+ free(ifaces);
+}
+
+struct ctdb_request *ctdb_getifaces_send(struct ctdb_connection *ctdb,
+ uint32_t destnode,
+ ctdb_callback_t callback,
+ void *private_data)
+{
+ return new_ctdb_control_request(ctdb, CTDB_CONTROL_GET_IFACES,
+ destnode,
+ NULL, 0, callback, private_data);
+}
+
diff --git a/libctdb/sync.c b/libctdb/sync.c
index 6696283..9567d96 100644
--- a/libctdb/sync.c
+++ b/libctdb/sync.c
@@ -280,3 +280,23 @@ bool ctdb_getdbseqnum(struct ctdb_connection *ctdb,
}
return ret;
}
+
+bool ctdb_getifaces(struct ctdb_connection *ctdb,
+ uint32_t destnode, struct ctdb_ifaces_list **ifaces)
+{
+ struct ctdb_request *req;
+ bool done = false;
+ bool ret = false;
+
+ *ifaces = NULL;
+
+ req = synchronous(ctdb,
+ ctdb_getifaces_send(ctdb, destnode, set, &done),
+ &done);
+ if (req != NULL) {
+ ret = ctdb_getifaces_recv(ctdb, req, ifaces);
+ ctdb_request_free(req);
+ }
+ return ret;
+}
+
diff --git a/tools/ctdb.c b/tools/ctdb.c
index 5fd6307..a356c28 100644
--- a/tools/ctdb.c
+++ b/tools/ctdb.c
@@ -640,11 +640,11 @@ static int control_status(struct ctdb_context *ctdb, int argc, const char **argv
continue;
}
if (nodemap->nodes[i].flags == 0) {
- struct ctdb_control_get_ifaces *ifaces;
+ struct ctdb_ifaces_list *ifaces;
- ret = ctdb_ctrl_get_ifaces(ctdb, TIMELIMIT(),
- nodemap->nodes[i].pnn,
- ctdb, &ifaces);
+ ret = ctdb_getifaces(ctdb_connection,
+ nodemap->nodes[i].pnn,
+ &ifaces);
if (ret == 0) {
for (j=0; j < ifaces->num; j++) {
if (ifaces->ifaces[j].link_state != 0) {
@@ -653,7 +653,7 @@ static int control_status(struct ctdb_context *ctdb, int argc, const char **argv
partially_online = 1;
break;
}
- talloc_free(ifaces);
+ ctdb_free_ifaces(ifaces);
}
}
printf(":%d:%s:%d:%d:%d:%d:%d:%d:%d:%c:\n", nodemap->nodes[i].pnn,
@@ -2311,18 +2311,14 @@ static int control_ipinfo(struct ctdb_context *ctdb, int argc, const char **argv
*/
static int control_ifaces(struct ctdb_context *ctdb, int argc, const char **argv)
{
- int i, ret;
- TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
- struct ctdb_control_get_ifaces *ifaces;
+ int i;
+ struct ctdb_ifaces_list *ifaces;
/* read the public ip list from this node */
- ret = ctdb_ctrl_get_ifaces(ctdb, TIMELIMIT(), options.pnn,
- tmp_ctx, &ifaces);
- if (ret != 0) {
+ if (!ctdb_getifaces(ctdb_connection, options.pnn, &ifaces)) {
DEBUG(DEBUG_ERR, ("Unable to get interfaces from node %u\n",
options.pnn));
- talloc_free(tmp_ctx);
- return ret;
+ return -1;
}
if (options.machinereadable){
@@ -2345,7 +2341,7 @@ static int control_ifaces(struct ctdb_context *ctdb, int argc, const char **argv
}
}
- talloc_free(tmp_ctx);
+ ctdb_free_ifaces(ifaces);
return 0;
}
--
CTDB repository
More information about the samba-cvs
mailing list