diff options
Diffstat (limited to 'transport')
-rw-r--r-- | transport/socket/src/socket.c | 77 | ||||
-rw-r--r-- | transport/socket/src/socket.h | 3 |
2 files changed, 43 insertions, 37 deletions
diff --git a/transport/socket/src/socket.c b/transport/socket/src/socket.c index 14f151cb073..4c9338bfe20 100644 --- a/transport/socket/src/socket.c +++ b/transport/socket/src/socket.c @@ -274,7 +274,7 @@ __socket_reset (transport_t *this) struct ioq * __socket_ioq_new (transport_t *this, char *buf, int len, - struct iovec *vector, int count, dict_t *refs) + struct iovec *vector, int count, struct iobref *iobref) { socket_private_t *priv = NULL; struct ioq *entry = NULL; @@ -309,8 +309,8 @@ __socket_ioq_new (transport_t *this, char *buf, int len, entry->pending_vector = entry->vector; entry->pending_count = entry->count; - if (refs) - entry->refs = dict_ref (refs); + if (iobref) + entry->iobref = iobref_ref (iobref); entry->buf = buf; @@ -324,8 +324,8 @@ void __socket_ioq_entry_free (struct ioq *entry) { list_del_init (&entry->list); - if (entry->refs) - dict_unref (entry->refs); + if (entry->iobref) + iobref_unref (entry->iobref); /* TODO: use mem-pool */ free (entry->buf); @@ -481,7 +481,7 @@ __socket_proto_validate_header (transport_t *this, return -1; } - if (size2 > (1048576 * 4)) { + if (size2 > (131072)) { gf_log (this->xl->name, GF_LOG_ERROR, "socket header has incorrect size2=%"GF_PRI_SIZET, size2); @@ -582,36 +582,42 @@ __socket_proto_state_machine (transport_t *this) "or version mismatch", this->peerinfo.identifier); goto unlock; - } - - priv->incoming.hdrlen = size1; - priv->incoming.buflen = size2; + } - /* TODO: use mem-pool */ - priv->incoming.hdr_p = MALLOC (size1); - if (size2) - priv->incoming.buf_p = MALLOC (size2); + priv->incoming.hdrlen = size1; + priv->incoming.buflen = size2; + + /* TODO: use mem-pool */ + priv->incoming.hdr_p = MALLOC (size1); + if (size2) { + /* TODO: sanity check size2 < page size + */ + priv->incoming.iobuf = + iobuf_get (this->xl->ctx->iobuf_pool); + priv->incoming.buf_p = + priv->incoming.iobuf->ptr; + } - priv->incoming.vector[0].iov_base = - priv->incoming.hdr_p; + priv->incoming.vector[0].iov_base = + priv->incoming.hdr_p; - priv->incoming.vector[0].iov_len = size1; + priv->incoming.vector[0].iov_len = size1; - priv->incoming.vector[1].iov_base = - priv->incoming.buf_p; + priv->incoming.vector[1].iov_base = + priv->incoming.buf_p; - priv->incoming.vector[1].iov_len = size2; - priv->incoming.count = size2 ? 2 : 1; + priv->incoming.vector[1].iov_len = size2; + priv->incoming.count = size2 ? 2 : 1; - priv->incoming.pending_vector = - priv->incoming.vector; + priv->incoming.pending_vector = + priv->incoming.vector; - priv->incoming.pending_count = - priv->incoming.count; + priv->incoming.pending_count = + priv->incoming.count; - priv->incoming.state = - SOCKET_PROTO_STATE_DATA_COMING; - break; + priv->incoming.state = + SOCKET_PROTO_STATE_DATA_COMING; + break; case SOCKET_PROTO_STATE_DATA_COMING: @@ -1149,7 +1155,7 @@ unlock: int socket_receive (transport_t *this, char **hdr_p, size_t *hdrlen_p, - char **buf_p, size_t *buflen_p) + struct iobuf **iobuf_p) { socket_private_t *priv = NULL; int ret = -1; @@ -1164,18 +1170,17 @@ socket_receive (transport_t *this, char **hdr_p, size_t *hdrlen_p, goto unlock; } - if (!hdr_p || !hdrlen_p || !buf_p || !buflen_p) { + if (!hdr_p || !hdrlen_p || !iobuf_p) { gf_log (this->xl->name, GF_LOG_ERROR, - "bad parameters %p %p %p %p", - hdr_p, hdrlen_p, buf_p, buflen_p); + "bad parameters %p %p %p", + hdr_p, hdrlen_p, iobuf_p); goto unlock; } if (priv->incoming.state == SOCKET_PROTO_STATE_COMPLETE) { *hdr_p = priv->incoming.hdr_p; *hdrlen_p = priv->incoming.hdrlen; - *buf_p = priv->incoming.buf_p; - *buflen_p = priv->incoming.buflen; + *iobuf_p = priv->incoming.iobuf; memset (&priv->incoming, 0, sizeof (priv->incoming)); priv->incoming.state = SOCKET_PROTO_STATE_NADA; @@ -1194,7 +1199,7 @@ unlock: int socket_submit (transport_t *this, char *buf, int len, struct iovec *vector, int count, - dict_t *refs) + struct iobref *iobref) { socket_private_t *priv = NULL; int ret = -1; @@ -1219,7 +1224,7 @@ socket_submit (transport_t *this, char *buf, int len, } priv->submit_log = 0; - entry = __socket_ioq_new (this, buf, len, vector, count, refs); + entry = __socket_ioq_new (this, buf, len, vector, count, iobref); if (list_empty (&priv->ioq)) { ret = __socket_ioq_churn_entry (this, entry); diff --git a/transport/socket/src/socket.h b/transport/socket/src/socket.h index e1dfb33fddb..4f34e16863a 100644 --- a/transport/socket/src/socket.h +++ b/transport/socket/src/socket.h @@ -69,7 +69,7 @@ struct ioq { struct iovec *pending_vector; int pending_count; char *buf; - dict_t *refs; + struct iobref *iobref; }; @@ -92,6 +92,7 @@ typedef struct { struct socket_header header; char *hdr_p; size_t hdrlen; + struct iobuf *iobuf; char *buf_p; size_t buflen; struct iovec vector[2]; |