Blame xlators/mgmt/glusterd/src/glusterd-svc-helper.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/globals.h>
Packit Service e080da
#include <glusterfs/run.h>
Packit Service e080da
#include "glusterd.h"
Packit Service e080da
#include <glusterfs/glusterfs.h>
Packit Service e080da
#include "glusterd-utils.h"
Packit Service e080da
#include "glusterd-svc-mgmt.h"
Packit Service e080da
#include "glusterd-shd-svc.h"
Packit Service e080da
#include "glusterd-quotad-svc.h"
Packit Service e080da
#include "glusterd-nfs-svc.h"
Packit Service e080da
#include "glusterd-bitd-svc.h"
Packit Service e080da
#include "glusterd-tierd-svc.h"
Packit Service e080da
#include "glusterd-tierd-svc-helper.h"
Packit Service e080da
#include "glusterd-scrub-svc.h"
Packit Service e080da
#include "glusterd-svc-helper.h"
Packit Service e080da
#include <glusterfs/syscall.h>
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
glusterd_svcs_reconfigure()
Packit Service e080da
{
Packit Service e080da
    int ret = 0;
Packit Service e080da
    xlator_t *this = THIS;
Packit Service e080da
    glusterd_conf_t *conf = NULL;
Packit Service e080da
    char *svc_name = NULL;
Packit Service e080da
Packit Service e080da
    GF_ASSERT(this);
Packit Service e080da
Packit Service e080da
    conf = this->private;
Packit Service e080da
    GF_ASSERT(conf);
Packit Service e080da
Packit Service e080da
    svc_name = "nfs";
Packit Service e080da
    ret = glusterd_nfssvc_reconfigure();
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    svc_name = "self-heald";
Packit Service e080da
    ret = glusterd_shdsvc_reconfigure();
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    if (conf->op_version == GD_OP_VERSION_MIN)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    svc_name = "quotad";
Packit Service e080da
    ret = glusterd_quotadsvc_reconfigure();
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    svc_name = "bitd";
Packit Service e080da
    ret = glusterd_bitdsvc_reconfigure();
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    svc_name = "scrubber";
Packit Service e080da
    ret = glusterd_scrubsvc_reconfigure();
Packit Service e080da
out:
Packit Service e080da
    if (ret && svc_name)
Packit Service e080da
        gf_event(EVENT_SVC_RECONFIGURE_FAILED, "svc_name=%s", svc_name);
Packit Service e080da
    return ret;
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
glusterd_svcs_stop()
Packit Service e080da
{
Packit Service e080da
    int ret = 0;
Packit Service e080da
    xlator_t *this = NULL;
Packit Service e080da
    glusterd_conf_t *priv = NULL;
Packit Service e080da
Packit Service e080da
    this = THIS;
Packit Service e080da
    GF_ASSERT(this);
Packit Service e080da
Packit Service e080da
    priv = this->private;
Packit Service e080da
    GF_ASSERT(priv);
Packit Service e080da
Packit Service e080da
    ret = glusterd_svc_stop(&(priv->nfs_svc), SIGKILL);
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = glusterd_svc_stop(&(priv->shd_svc), SIGTERM);
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = glusterd_svc_stop(&(priv->quotad_svc), SIGTERM);
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = glusterd_svc_stop(&(priv->bitd_svc), SIGTERM);
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = glusterd_svc_stop(&(priv->scrub_svc), SIGTERM);
Packit Service e080da
out:
Packit Service e080da
    return ret;
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
glusterd_svcs_manager(glusterd_volinfo_t *volinfo)
Packit Service e080da
{
Packit Service e080da
    int ret = 0;
Packit Service e080da
    xlator_t *this = THIS;
Packit Service e080da
    glusterd_conf_t *conf = NULL;
Packit Service e080da
Packit Service e080da
    GF_ASSERT(this);
Packit Service e080da
Packit Service e080da
    conf = this->private;
Packit Service e080da
    GF_ASSERT(conf);
Packit Service e080da
Packit Service e080da
    if (volinfo && volinfo->is_snap_volume)
Packit Service e080da
        return 0;
Packit Service e080da
Packit Service e080da
    ret = conf->nfs_svc.manager(&(conf->nfs_svc), NULL, PROC_START_NO_WAIT);
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = conf->shd_svc.manager(&(conf->shd_svc), volinfo, PROC_START_NO_WAIT);
Packit Service e080da
    if (ret == -EINVAL)
Packit Service e080da
        ret = 0;
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    if (conf->op_version == GD_OP_VERSION_MIN)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = conf->quotad_svc.manager(&(conf->quotad_svc), volinfo,
Packit Service e080da
                                   PROC_START_NO_WAIT);
Packit Service e080da
    if (ret == -EINVAL)
Packit Service e080da
        ret = 0;
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = conf->bitd_svc.manager(&(conf->bitd_svc), NULL, PROC_START_NO_WAIT);
Packit Service e080da
    if (ret == -EINVAL)
Packit Service e080da
        ret = 0;
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = conf->scrub_svc.manager(&(conf->scrub_svc), NULL, PROC_START_NO_WAIT);
Packit Service e080da
    if (ret == -EINVAL)
Packit Service e080da
        ret = 0;
Packit Service e080da
out:
Packit Service e080da
    return ret;
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
glusterd_svc_check_volfile_identical(char *svc_name,
Packit Service e080da
                                     glusterd_graph_builder_t builder,
Packit Service e080da
                                     gf_boolean_t *identical)
Packit Service e080da
{
Packit Service e080da
    char orgvol[PATH_MAX] = {
Packit Service e080da
        0,
Packit Service e080da
    };
Packit Service e080da
    char *tmpvol = NULL;
Packit Service e080da
    glusterd_conf_t *conf = NULL;
Packit Service e080da
    xlator_t *this = NULL;
Packit Service e080da
    int ret = -1;
Packit Service e080da
    int need_unlink = 0;
Packit Service e080da
    int tmp_fd = -1;
Packit Service e080da
Packit Service e080da
    this = THIS;
Packit Service e080da
Packit Service e080da
    GF_ASSERT(this);
Packit Service e080da
    GF_ASSERT(identical);
Packit Service e080da
    conf = this->private;
Packit Service e080da
Packit Service e080da
    glusterd_svc_build_volfile_path(svc_name, conf->workdir, orgvol,
Packit Service e080da
                                    sizeof(orgvol));
Packit Service e080da
Packit Service e080da
    ret = gf_asprintf(&tmpvol, "/tmp/g%s-XXXXXX", svc_name);
Packit Service e080da
    if (ret < 0) {
Packit Service e080da
        goto out;
Packit Service e080da
    }
Packit Service e080da
Packit Service a90fdc
    /* coverity[SECURE_TEMP] mkstemp uses 0600 as the mode and is safe */
Packit Service e080da
    tmp_fd = mkstemp(tmpvol);
Packit Service e080da
    if (tmp_fd < 0) {
Packit Service e080da
        gf_msg(this->name, GF_LOG_WARNING, errno, GD_MSG_FILE_OP_FAILED,
Packit Service e080da
               "Unable to create temp file"
Packit Service e080da
               " %s:(%s)",
Packit Service e080da
               tmpvol, strerror(errno));
Packit Service e080da
        ret = -1;
Packit Service e080da
        goto out;
Packit Service e080da
    }
Packit Service e080da
Packit Service e080da
    need_unlink = 1;
Packit Service e080da
Packit Service e080da
    ret = glusterd_create_global_volfile(builder, tmpvol, NULL);
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    ret = glusterd_check_files_identical(orgvol, tmpvol, identical);
Packit Service e080da
out:
Packit Service e080da
    if (need_unlink)
Packit Service e080da
        sys_unlink(tmpvol);
Packit Service e080da
Packit Service e080da
    if (tmpvol != NULL)
Packit Service e080da
        GF_FREE(tmpvol);
Packit Service e080da
Packit Service e080da
    if (tmp_fd >= 0)
Packit Service e080da
        sys_close(tmp_fd);
Packit Service e080da
Packit Service e080da
    return ret;
Packit Service e080da
}
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
glusterd_svc_check_topology_identical(char *svc_name,
Packit Service e080da
                                      glusterd_graph_builder_t builder,
Packit Service e080da
                                      gf_boolean_t *identical)
Packit Service e080da
{
Packit Service e080da
    char orgvol[PATH_MAX] = {
Packit Service e080da
        0,
Packit Service e080da
    };
Packit Service e080da
    char *tmpvol = NULL;
Packit Service e080da
    glusterd_conf_t *conf = NULL;
Packit Service e080da
    xlator_t *this = THIS;
Packit Service e080da
    int ret = -1;
Packit Service e080da
    int tmpclean = 0;
Packit Service e080da
    int tmpfd = -1;
Packit Service e080da
Packit Service e080da
    if ((!identical) || (!this) || (!this->private))
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    conf = this->private;
Packit Service e080da
    GF_VALIDATE_OR_GOTO(this->name, conf, out);
Packit Service e080da
Packit Service e080da
    /* Fetch the original volfile */
Packit Service e080da
    glusterd_svc_build_volfile_path(svc_name, conf->workdir, orgvol,
Packit Service e080da
                                    sizeof(orgvol));
Packit Service e080da
Packit Service e080da
    /* Create the temporary volfile */
Packit Service e080da
    ret = gf_asprintf(&tmpvol, "/tmp/g%s-XXXXXX", svc_name);
Packit Service e080da
    if (ret < 0) {
Packit Service e080da
        goto out;
Packit Service e080da
    }
Packit Service e080da
Packit Service a90fdc
    /* coverity[SECURE_TEMP] mkstemp uses 0600 as the mode and is safe */
Packit Service e080da
    tmpfd = mkstemp(tmpvol);
Packit Service e080da
    if (tmpfd < 0) {
Packit Service e080da
        gf_msg(this->name, GF_LOG_WARNING, errno, GD_MSG_FILE_OP_FAILED,
Packit Service e080da
               "Unable to create temp file"
Packit Service e080da
               " %s:(%s)",
Packit Service e080da
               tmpvol, strerror(errno));
Packit Service e080da
        ret = -1;
Packit Service e080da
        goto out;
Packit Service e080da
    }
Packit Service e080da
Packit Service e080da
    tmpclean = 1; /* SET the flag to unlink() tmpfile */
Packit Service e080da
Packit Service e080da
    ret = glusterd_create_global_volfile(builder, tmpvol, NULL);
Packit Service e080da
    if (ret)
Packit Service e080da
        goto out;
Packit Service e080da
Packit Service e080da
    /* Compare the topology of volfiles */
Packit Service e080da
    ret = glusterd_check_topology_identical(orgvol, tmpvol, identical);
Packit Service e080da
out:
Packit Service e080da
    if (tmpfd >= 0)
Packit Service e080da
        sys_close(tmpfd);
Packit Service e080da
    if (tmpclean)
Packit Service e080da
        sys_unlink(tmpvol);
Packit Service e080da
    if (tmpvol != NULL)
Packit Service e080da
        GF_FREE(tmpvol);
Packit Service e080da
    return ret;
Packit Service e080da
}