|
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 |
}
|