Blame xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c

Packit Service e080da
/*
Packit Service e080da
   Copyright (c) 2014 Red Hat, Inc. <http://www.redhat.com>
Packit Service e080da
   This file is part of GlusterFS.
Packit Service e080da
Packit Service e080da
   This file is licensed to you under your choice of the GNU Lesser
Packit Service e080da
   General Public License, version 3 or any later version (LGPLv3 or
Packit Service e080da
   later), or the GNU General Public License, version 2 (GPLv2), in all
Packit Service e080da
   cases as published by the Free Software Foundation.
Packit Service e080da
*/
Packit Service e080da
Packit Service e080da
#include <glusterfs/xlator.h>
Packit Service e080da
#include "rpc-clnt.h"
Packit Service e080da
#include "glusterd.h"
Packit Service e080da
#include "glusterd-conn-mgmt.h"
Packit Service e080da
#include "glusterd-conn-helper.h"
Packit Service e080da
#include "glusterd-utils.h"
Packit Service e080da
#include "glusterd-messages.h"
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
glusterd_conn_init(glusterd_conn_t *conn, char *sockpath, int frame_timeout,
Packit Service e080da
                   glusterd_conn_notify_t notify)
Packit Service e080da
{
Packit Service e080da
    int ret = -1;
Packit Service e080da
    dict_t *options = NULL;
Packit Service e080da
    struct rpc_clnt *rpc = NULL;
Packit Service e080da
    xlator_t *this = THIS;
Packit Service e080da
    glusterd_svc_t *svc = NULL;
Packit Service e080da
Packit Service e080da
    if (!this)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    svc = glusterd_conn_get_svc_object(conn);
Packit Service e080da
    if (!svc) {
Packit Service e080da
        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_SVC_GET_FAIL,
Packit Service e080da
               "Failed to get the service");
Packit Service e080da
        goto out;
Packit Service e080da
    }
Packit Service e080da
Packit Service 35f350
    ret = rpc_transport_unix_options_build(&options, sockpath, frame_timeout);
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = dict_set_int32n(options, "transport.socket.ignore-enoent",
Packit Service e080da
                          SLEN("transport.socket.ignore-enoent"), 1);
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    /* @options is free'd by rpc_transport when destroyed */
Packit Service e080da
    rpc = rpc_clnt_new(options, this, (char *)svc->name, 16);
Packit Service e080da
    if (!rpc) {
Packit Service e080da
        ret = -1;
Packit Service e080da
        goto out;
Packit Service e080da
    }
Packit Service e080da
Packit Service e080da
    ret = rpc_clnt_register_notify(rpc, glusterd_conn_common_notify, conn);
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = snprintf(conn->sockpath, sizeof(conn->sockpath), "%s", sockpath);
Packit Service e080da
    if (ret < 0)
Packit Service e080da
        goto out;
Packit Service e080da
    else
Packit Service e080da
        ret = 0;
Packit Service e080da
Packit Service e080da
    conn->frame_timeout = frame_timeout;
Packit Service e080da
    conn->rpc = rpc;
Packit Service e080da
    conn->notify = notify;
Packit Service e080da
out:
Packit Service e080da
    if (ret) {
Packit Service e080da
        if (rpc) {
Packit Service e080da
            rpc_clnt_unref(rpc);
Packit Service e080da
            rpc = NULL;
Packit Service e080da
        }
Packit Service e080da
    }
Packit Service e080da
    return ret;
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
glusterd_conn_term(glusterd_conn_t *conn)
Packit Service e080da
{
Packit Service e080da
    rpc_clnt_unref(conn->rpc);
Packit Service e080da
    return 0;
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
glusterd_conn_connect(glusterd_conn_t *conn)
Packit Service e080da
{
Packit Service e080da
    return rpc_clnt_start(conn->rpc);
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
glusterd_conn_disconnect(glusterd_conn_t *conn)
Packit Service e080da
{
Packit Service e080da
    rpc_clnt_disconnect(conn->rpc);
Packit Service e080da
Packit Service e080da
    return 0;
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
__glusterd_conn_common_notify(struct rpc_clnt *rpc, void *mydata,
Packit Service e080da
                              rpc_clnt_event_t event, void *data)
Packit Service e080da
{
Packit Service e080da
    glusterd_conn_t *conn = mydata;
Packit Service e080da
Packit Service e080da
    /* Silently ignoring this error, exactly like the current
Packit Service e080da
     * implementation */
Packit Service e080da
    if (!conn)
Packit Service e080da
        return 0;
Packit Service e080da
Packit Service e080da
    return conn->notify(conn, event);
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
glusterd_conn_common_notify(struct rpc_clnt *rpc, void *mydata,
Packit Service e080da
                            rpc_clnt_event_t event, void *data)
Packit Service e080da
{
Packit Service e080da
    return glusterd_big_locked_notify(rpc, mydata, event, data,
Packit Service e080da
                                      __glusterd_conn_common_notify);
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
int32_t
Packit Service e080da
glusterd_conn_build_socket_filepath(char *rundir, uuid_t uuid, char *socketpath,
Packit Service e080da
                                    int len)
Packit Service e080da
{
Packit Service e080da
    char sockfilepath[PATH_MAX] = {
Packit Service e080da
        0,
Packit Service e080da
    };
Packit Service e080da
Packit Service e080da
    snprintf(sockfilepath, sizeof(sockfilepath), "%s/run-%s", rundir,
Packit Service e080da
             uuid_utoa(uuid));
Packit Service e080da
Packit Service e080da
    glusterd_set_socket_filepath(sockfilepath, socketpath, len);
Packit Service e080da
    return 0;
Packit Service e080da
}