summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmar Tumballi <amar@gluster.com>2010-10-04 13:51:29 +0000
committerVijay Bellur <vijay@dev.gluster.com>2010-10-04 12:52:42 -0700
commit2136876274690bc7377b97ca0ed812a6befafee2 (patch)
treea947b90718b854324c7c66f3bd1571037d119b84
parent0d31e7e4239d4765198ea6f46b98ba680038f7ad (diff)
glusterd: more sanity checks during restart
* check for validity of pid file before doing pmap search, as in few cases, pmap_signin() may take more time. * remove stale code from 'init()' * update pmap->last_alloc during restore itself to handle glusterd restarts more agnostics to port collisions Signed-off-by: Amar Tumballi <amar@gluster.com> Signed-off-by: Vijay Bellur <vijay@dev.gluster.com> BUG: 971 (dynamic volume management) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=971
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-pmap.h7
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-store.c6
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c16
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.c10
4 files changed, 26 insertions, 13 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-pmap.h b/xlators/mgmt/glusterd/src/glusterd-pmap.h
index fcad50db8..a87efed5a 100644
--- a/xlators/mgmt/glusterd/src/glusterd-pmap.h
+++ b/xlators/mgmt/glusterd/src/glusterd-pmap.h
@@ -55,7 +55,8 @@ int pmap_registry_bind (xlator_t *this, int port, const char *brickname,
gf_pmap_port_type_t type, void *xprt);
int pmap_registry_remove (xlator_t *this, int port, const char *brickname,
gf_pmap_port_type_t type, void *xprt);
-int
-pmap_registry_search (xlator_t *this, const char *brickname,
- gf_pmap_port_type_t type);
+int pmap_registry_search (xlator_t *this, const char *brickname,
+ gf_pmap_port_type_t type);
+struct pmap_registry *pmap_registry_get (xlator_t *this);
+
#endif
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
index ca19057eb..351f2bf1a 100644
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
@@ -880,6 +880,7 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo)
char tmpkey[4096] = {0,};
glusterd_store_iter_t *tmpiter = NULL;
char *tmpvalue = NULL;
+ struct pmap_registry *pmap = NULL;
GF_ASSERT (volinfo);
GF_ASSERT (volinfo->volname);
@@ -931,6 +932,11 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo)
} else if (!strncmp (key, GLUSTERD_STORE_KEY_BRICK_PORT,
strlen (GLUSTERD_STORE_KEY_BRICK_PORT))) {
gf_string2int (value, &brickinfo->port);
+ /* This is required to have proper ports
+ assigned to bricks after restart */
+ pmap = pmap_registry_get (THIS);
+ if (pmap->last_alloc <= brickinfo->port)
+ pmap->last_alloc = brickinfo->port + 1;
} else {
gf_log ("", GF_LOG_ERROR, "Unknown key: %s",
key);
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index 3649ef863..0e24aca77 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -915,6 +915,19 @@ glusterd_volume_start_glusterfs (glusterd_volinfo_t *volinfo,
GLUSTERD_GET_BRICK_PIDFILE (pidfile, path, brickinfo->hostname,
brickinfo->path);
+
+ file = fopen (pidfile, "r+");
+ if (file) {
+ ret = lockf (fileno (file), F_TLOCK, 0);
+ if (ret && ((EAGAIN == errno) || (EACCES == errno))) {
+ ret = 0;
+ gf_log ("", GF_LOG_NORMAL, "brick %s:%s "
+ "already started", brickinfo->hostname,
+ brickinfo->path);
+ goto out;
+ }
+ }
+
ret = pmap_registry_search (this, brickinfo->path,
GF_PMAP_PORT_BRICKSERVER);
if (ret) {
@@ -932,6 +945,9 @@ glusterd_volume_start_glusterfs (glusterd_volinfo_t *volinfo,
is_locked = _gf_true;
}
}
+ /* This means, pmap has the entry, remove it */
+ ret = pmap_registry_remove (this, 0, brickinfo->path,
+ GF_PMAP_PORT_BRICKSERVER, NULL);
}
unlink (pidfile);
diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c
index 7ec5cafbb..12a2486c3 100644
--- a/xlators/mgmt/glusterd/src/glusterd.c
+++ b/xlators/mgmt/glusterd/src/glusterd.c
@@ -228,8 +228,6 @@ init (xlator_t *this)
glusterd_conf_t *conf = NULL;
data_t *dir_data = NULL;
struct stat buf = {0,};
- char *port_str = NULL;
- int port_num = 0;
char voldir [PATH_MAX] = {0,};
char dirname [PATH_MAX];
char cmd_log_filename [PATH_MAX] = {0,};
@@ -347,13 +345,6 @@ init (xlator_t *this)
goto out;
}
- glusterd1_mop_prog.options = this->options;
- port_str = getenv ("GLUSTERD_LOCAL_PORT");
- if (port_str) {
- port_num = atoi (port_str);
- glusterd1_mop_prog.progport = port_num;
- }
-
/*
* only one (atmost a pair - rdma and socket) listener for
* glusterd1_mop_prog, gluster_pmap_prog and gluster_handshake_prog.
@@ -377,7 +368,6 @@ init (xlator_t *this)
goto out;
}
- gluster_handshake_prog.options = this->options;
ret = glusterd_program_register (this, rpc, &gluster_handshake_prog);
if (ret) {
rpcsvc_program_unregister (rpc, &glusterd1_mop_prog);