[PATCHES] messaging iov / recvfrom
Michael Adam
obnox at samba.org
Mon May 26 07:52:17 MDT 2014
Hi,
as a result of my work towards adding support for fd-passing
to our messaging, find attached two first preparatory patches
that might already be useful.
The first changes the send_fn to use struct iovec
instead of data blob. (Volker has already looked
over this one.)
The second one lets unix_dgram_recv_handler()
use recvmsg() instead of recv().
Review/push/comments appreciated.
Michael
-------------- next part --------------
From 279eb1d37c39c41ab00ab33c09b3603222692527 Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Tue, 13 May 2014 11:55:37 +0200
Subject: [PATCH 1/2] s3:messaging: change messaging_backend to use iovec
instead of data blob in send_fn
This also changes the layering
messaging_send_iov -> messaging_send_buf -> messaging_send
to
messaging_send_buf -> messaging_send -> messaging_send_iov
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
---
source3/include/messages.h | 2 +-
source3/lib/messages.c | 64 +++++++++++++++++++++++---------------------
source3/lib/messages_ctdbd.c | 19 +++++++++++--
source3/lib/messages_dgm.c | 20 +++++++-------
4 files changed, 62 insertions(+), 43 deletions(-)
diff --git a/source3/include/messages.h b/source3/include/messages.h
index 852e8a1..18362f9 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -89,7 +89,7 @@ struct messaging_context {
struct messaging_backend {
NTSTATUS (*send_fn)(struct messaging_context *msg_ctx,
struct server_id pid, int msg_type,
- const DATA_BLOB *data,
+ const struct iovec *iov, int iovlen,
struct messaging_backend *backend);
void *private_data;
};
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 6778080..44062ca 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -355,29 +355,12 @@ NTSTATUS messaging_send(struct messaging_context *msg_ctx,
struct server_id server, uint32_t msg_type,
const DATA_BLOB *data)
{
- if (server_id_is_disconnected(&server)) {
- return NT_STATUS_INVALID_PARAMETER_MIX;
- }
-
- if (!procid_is_local(&server)) {
- return msg_ctx->remote->send_fn(msg_ctx, server,
- msg_type, data,
- msg_ctx->remote);
- }
+ struct iovec iov;
- if (messaging_is_self_send(msg_ctx, &server)) {
- struct messaging_rec rec;
- rec.msg_version = MESSAGE_VERSION;
- rec.msg_type = msg_type & MSG_TYPE_MASK;
- rec.dest = server;
- rec.src = msg_ctx->id;
- rec.buf = *data;
- messaging_dispatch_rec(msg_ctx, &rec);
- return NT_STATUS_OK;
- }
+ iov.iov_base = data->data;
+ iov.iov_len = data->length;
- return msg_ctx->local->send_fn(msg_ctx, server, msg_type, data,
- msg_ctx->local);
+ return messaging_send_iov(msg_ctx, server, msg_type, &iov, 1);
}
NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx,
@@ -392,19 +375,40 @@ NTSTATUS messaging_send_iov(struct messaging_context *msg_ctx,
struct server_id server, uint32_t msg_type,
const struct iovec *iov, int iovlen)
{
- uint8_t *buf;
- NTSTATUS status;
+ if (server_id_is_disconnected(&server)) {
+ return NT_STATUS_INVALID_PARAMETER_MIX;
+ }
- buf = iov_buf(talloc_tos(), iov, iovlen);
- if (buf == NULL) {
- return NT_STATUS_NO_MEMORY;
+ if (!procid_is_local(&server)) {
+ return msg_ctx->remote->send_fn(msg_ctx, server,
+ msg_type, iov, iovlen,
+ msg_ctx->remote);
}
- status = messaging_send_buf(msg_ctx, server, msg_type,
- buf, talloc_get_size(buf));
+ if (messaging_is_self_send(msg_ctx, &server)) {
+ struct messaging_rec rec;
+ uint8_t *buf;
+ DATA_BLOB data;
+
+ buf = iov_buf(talloc_tos(), iov, iovlen);
+ if (buf == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ data = data_blob_const(buf, talloc_get_size(buf));
+
+ rec.msg_version = MESSAGE_VERSION;
+ rec.msg_type = msg_type & MSG_TYPE_MASK;
+ rec.dest = server;
+ rec.src = msg_ctx->id;
+ rec.buf = data;
+ messaging_dispatch_rec(msg_ctx, &rec);
+ TALLOC_FREE(buf);
+ return NT_STATUS_OK;
+ }
- TALLOC_FREE(buf);
- return status;
+ return msg_ctx->local->send_fn(msg_ctx, server, msg_type, iov, iovlen,
+ msg_ctx->local);
}
static struct messaging_rec *messaging_rec_dup(TALLOC_CTX *mem_ctx,
diff --git a/source3/lib/messages_ctdbd.c b/source3/lib/messages_ctdbd.c
index 230560f..e1b3ae1 100644
--- a/source3/lib/messages_ctdbd.c
+++ b/source3/lib/messages_ctdbd.c
@@ -91,20 +91,35 @@ struct ctdbd_connection *messaging_ctdbd_connection(void)
static NTSTATUS messaging_ctdb_send(struct messaging_context *msg_ctx,
struct server_id pid, int msg_type,
const DATA_BLOB *data,
+ const struct iovec *iov, int iovlen,
struct messaging_backend *backend)
{
struct messaging_ctdbd_context *ctx = talloc_get_type_abort(
backend->private_data, struct messaging_ctdbd_context);
struct messaging_rec msg;
+ uint8_t *buf;
+ DATA_BLOB data;
+ NTSTATUS status;
+
+ buf = iov_buf(talloc_tos(), iov, iovlen);
+ if (buf == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ data = data_blob_const(buf, talloc_get_size(buf));
msg.msg_version = MESSAGE_VERSION;
msg.msg_type = msg_type;
msg.dest = pid;
msg.src = msg_ctx->id;
- msg.buf = *data;
+ msg.buf = data;
+
+ status = ctdbd_messaging_send(ctx->conn, pid.vnn, pid.pid, &msg);
+
+ TALLOC_FREE(buf);
- return ctdbd_messaging_send(ctx->conn, pid.vnn, pid.pid, &msg);
+ return status;
}
static int messaging_ctdbd_destructor(struct messaging_ctdbd_context *ctx)
diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index 55a6fcf..f01fcb8 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -46,7 +46,7 @@ struct messaging_dgm_hdr {
static NTSTATUS messaging_dgm_send(struct messaging_context *msg_ctx,
struct server_id pid, int msg_type,
- const DATA_BLOB *data,
+ const struct iovec *iov, int iovlen,
struct messaging_backend *backend);
static void messaging_dgm_recv(struct unix_msg_ctx *ctx,
uint8_t *msg, size_t msg_len,
@@ -288,7 +288,7 @@ static int messaging_dgm_context_destructor(struct messaging_dgm_context *c)
static NTSTATUS messaging_dgm_send(struct messaging_context *msg_ctx,
struct server_id pid, int msg_type,
- const DATA_BLOB *data,
+ const struct iovec *iov, int iovlen,
struct messaging_backend *backend)
{
struct messaging_dgm_context *ctx = talloc_get_type_abort(
@@ -297,9 +297,10 @@ static NTSTATUS messaging_dgm_send(struct messaging_context *msg_ctx,
char buf[PATH_MAX];
char *dst_sock, *to_free;
struct messaging_dgm_hdr hdr;
- struct iovec iov[2];
+ struct iovec iov2[iovlen + 1];
ssize_t pathlen;
int ret;
+ int i;
fstr_sprintf(pid_str, "msg/%u", (unsigned)pid.pid);
@@ -314,17 +315,16 @@ static NTSTATUS messaging_dgm_send(struct messaging_context *msg_ctx,
hdr.dst = pid;
hdr.src = msg_ctx->id;
- DEBUG(10, ("%s: Sending message 0x%x len %u to %s\n", __func__,
- (unsigned)hdr.msg_type, (unsigned)data->length,
+ DEBUG(10, ("%s: Sending message 0x%x to %s\n", __func__,
+ (unsigned)hdr.msg_type,
server_id_str(talloc_tos(), &pid)));
- iov[0].iov_base = &hdr;
- iov[0].iov_len = sizeof(hdr);
- iov[1].iov_base = data->data;
- iov[1].iov_len = data->length;
+ iov2[0].iov_base = &hdr;
+ iov2[0].iov_len = sizeof(hdr);
+ memcpy(iov2+1, iov, iovlen*sizeof(struct iovec));
become_root();
- ret = unix_msg_send(ctx->dgm_ctx, dst_sock, iov, ARRAY_SIZE(iov));
+ ret = unix_msg_send(ctx->dgm_ctx, dst_sock, iov2, iovlen + 1);
unbecome_root();
TALLOC_FREE(to_free);
--
1.9.1
From 810d5c5a27624602cb3e54de65290d122e476f4f Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Tue, 13 May 2014 12:42:32 +0200
Subject: [PATCH 2/2] s3:messaging: change unix_dgram_recv_handler() to use
recvmsg, not recv
This is in preparation of adding fd-passing to messaging.
Signed-off-by: Michael Adam <obnox at samba.org>
---
source3/lib/unix_msg/unix_msg.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/source3/lib/unix_msg/unix_msg.c b/source3/lib/unix_msg/unix_msg.c
index 956e3a3..bcabd28 100644
--- a/source3/lib/unix_msg/unix_msg.c
+++ b/source3/lib/unix_msg/unix_msg.c
@@ -233,8 +233,22 @@ static void unix_dgram_recv_handler(struct poll_watch *w, int fd, short events,
{
struct unix_dgram_ctx *ctx = (struct unix_dgram_ctx *)private_data;
ssize_t received;
+ struct msghdr msg;
+ struct iovec iov;
+
+ iov = (struct iovec) {
+ .iov_base = (void *)ctx->recv_buf,
+ .iov_len = ctx->max_msg,
+ };
+
+ msg = (struct msghdr) {
+ .msg_iov = &iov,
+ .msg_iovlen = 1,
+ .msg_control = NULL,
+ .msg_controllen = 0,
+ };
- received = recv(fd, ctx->recv_buf, ctx->max_msg, 0);
+ received = recvmsg(fd, &msg, 0);
if (received == -1) {
if ((errno == EAGAIN) ||
#ifdef EWOULDBLOCK
--
1.9.1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20140526/da892f16/attachment.pgp>
More information about the samba-technical
mailing list