Skip to content

Commit

Permalink
xio: implement correct data structure for sessions and connections
Browse files Browse the repository at this point in the history
  • Loading branch information
mitake committed Oct 6, 2015
1 parent d90dd42 commit 73322d6
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 22 deletions.
5 changes: 5 additions & 0 deletions include/net.h
Expand Up @@ -4,6 +4,7 @@
#include <sys/socket.h>
#include <arpa/inet.h>

#include "list.h"
#include "sheepdog_proto.h"

/*
Expand Down Expand Up @@ -35,7 +36,11 @@ struct connection {
bool dead;

#ifdef HAVE_ACCELIO
/* session: the session this connection belongs to */
struct xio_session *session;

struct xio_connection *conn;
struct list_node list;
#endif
};

Expand Down
2 changes: 1 addition & 1 deletion lib/xio.c
Expand Up @@ -40,7 +40,7 @@ static int client_on_response(struct xio_session *session,
struct client_data *client_data =
(struct client_data *)cb_user_context;

sd_debug("response on session %p\n", client_data);
sd_debug("response on session %p", client_data);
xio_context_stop_loop(client_data->ctx);
client_data->rsp = rsp;

Expand Down
56 changes: 35 additions & 21 deletions sheep/xio.c
Expand Up @@ -22,32 +22,28 @@

#include <libxio.h>

/* server private data */
/* server private data, per session */
struct server_data {
struct xio_context *ctx;

int nr_conn;
struct list_head conn_list;
};

static int server_on_request(struct xio_session *session,
struct xio_msg *xio_req,
int last_in_rxq,
void *cb_user_conext)
{
struct client_info *ci;
struct client_info *ci = (struct client_info *)cb_user_conext;
struct sd_req *hdr;
struct request *req;

struct xio_iovec_ex *sglist = vmsg_sglist(&xio_req->in);
int nents = vmsg_sglist_nents(&xio_req->in);

struct xio_session_attr attr;

memset(&attr, 0, sizeof(attr));
xio_query_session(session, &attr, XIO_SESSION_ATTR_USER_CTX);
ci = (struct client_info *)attr.user_context;

sd_debug("on request: %p, %p, nents: %d", session, xio_req, nents);
hdr = xio_req->in.header.iov_base;
sd_debug("op: 0x%x\n", hdr->opcode);

req = alloc_request(ci, hdr->data_length);
memcpy(&req->rq, hdr, sizeof(req->rq));
Expand All @@ -69,7 +65,8 @@ static int server_on_request(struct xio_session *session,
return 0;
}

static struct client_info *xio_create_client(struct xio_session *session)
static struct client_info *xio_create_client(struct xio_session *session,
struct xio_connection *conn)
{
struct client_info *ci;

Expand All @@ -80,6 +77,8 @@ static struct client_info *xio_create_client(struct xio_session *session)
ci->type = CLIENT_INFO_TYPE_XIO;

ci->conn.session = session;
ci->conn.conn = conn;
INIT_LIST_NODE(&ci->conn.list);
refcount_set(&ci->refcnt, 0);

INIT_LIST_HEAD(&ci->done_reqs);
Expand All @@ -91,13 +90,20 @@ static int server_on_new_session(struct xio_session *session,
struct xio_new_session_req *req,
void *cb_user_context)
{
/* struct sd_xio_session *priv; */
struct xio_session_attr attr;
struct server_data *srv = xzalloc(sizeof(*srv));

sd_debug("on new session: %p", session);

/* priv->efd = eventfd(0, EFD_SEMAPHORE); */
xio_accept(session, NULL, 0, NULL, 0);

INIT_LIST_HEAD(&srv->conn_list);

memset(&attr, 0, sizeof(attr));
attr.user_context = srv;
xio_modify_session(session, &attr,
XIO_SESSION_ATTR_USER_CTX);

xio_context_stop_loop(xio_get_main_ctx());

return 0;
Expand All @@ -108,31 +114,39 @@ static int server_on_session_event(struct xio_session *session,
void *cb_user_context)
{
struct client_info *ci;
struct xio_session_attr attr;
struct xio_connection_attr attr;
struct server_data *server_data = (struct server_data *)cb_user_context;

sd_debug("session event: %s. session:%p, connection:%p, reason: %s\n",
sd_debug("session event: %s. session:%p, connection:%p, reason: %s",
xio_session_event_str(event_data->event),
session, event_data->conn,
xio_strerror(event_data->reason));

switch (event_data->event) {
case XIO_SESSION_NEW_CONNECTION_EVENT:
server_data->nr_conn++;
memset(&attr, 0, sizeof(attr));

ci = xio_create_client(session);
ci = xio_create_client(session, event_data->conn);
list_add_tail(&ci->conn.list, &server_data->conn_list);
attr.user_context = ci;
xio_modify_session(session, &attr, XIO_SESSION_ATTR_USER_CTX);
xio_modify_connection(event_data->conn, &attr,
XIO_CONNECTION_ATTR_USER_CTX);
break;
case XIO_SESSION_CONNECTION_TEARDOWN_EVENT:
xio_connection_destroy(event_data->conn);
xio_context_stop_loop(xio_get_main_ctx());
break;
case XIO_SESSION_TEARDOWN_EVENT:
memset(&attr, 0, sizeof(attr));

xio_query_session(session, &attr, XIO_SESSION_ATTR_USER_CTX);
xio_query_session(session, &attr, XIO_CONNECTION_ATTR_USER_CTX);
ci = (struct client_info *)attr.user_context;
/* list_del(&ci->conn.list); */

server_data->nr_conn--;
sd_assert(0 <= server_data->nr_conn);

xio_connection_destroy(event_data->conn);
xio_context_stop_loop(xio_get_main_ctx());
break;
case XIO_SESSION_TEARDOWN_EVENT:
xio_session_destroy(session);
xio_context_stop_loop(xio_get_main_ctx());
break;
Expand Down

0 comments on commit 73322d6

Please sign in to comment.