1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-10-15 19:33:17 +03:00

Make clvmd-cman use a hash rather than an array for node updown info.

This will allow it to cope with very large nodeids such as those
generated by clusters using cman_tool join -X
This commit is contained in:
Christine Caulfield
2008-05-09 07:20:04 +00:00
parent 1a20d53171
commit b1bf5f1738
2 changed files with 23 additions and 33 deletions

View File

@@ -1,5 +1,6 @@
Version 2.02.38 - Version 2.02.38 -
================================= =================================
Make clvmd-cman use a hash rather than an array for node updown info.
Check lv_count in vg_validate. Check lv_count in vg_validate.
Add --prefixes to reporting tools for field name prefix output format. Add --prefixes to reporting tools for field name prefix output format.

View File

@@ -36,6 +36,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <getopt.h> #include <getopt.h>
#include <errno.h> #include <errno.h>
#include <libdevmapper.h>
#include <libdlm.h> #include <libdlm.h>
#include "clvmd-comms.h" #include "clvmd-comms.h"
@@ -46,13 +47,17 @@
#define LOCKSPACE_NAME "clvmd" #define LOCKSPACE_NAME "clvmd"
struct clvmd_node
{
struct cman_node *node;
int clvmd_up;
};
static int num_nodes; static int num_nodes;
static struct cman_node *nodes = NULL; static struct cman_node *nodes = NULL;
static struct cman_node this_node; static struct cman_node this_node;
static int count_nodes; /* size of allocated nodes array */ static int count_nodes; /* size of allocated nodes array */
static int max_updown_nodes = 50; /* Current size of the allocated array */ static struct dm_hash_table *node_updown_hash;
/* Node up/down status, indexed by nodeid */
static int *node_updown = NULL;
static dlm_lshandle_t *lockspace; static dlm_lshandle_t *lockspace;
static cman_handle_t c_handle; static cman_handle_t c_handle;
@@ -72,6 +77,8 @@ struct lock_wait {
static int _init_cluster(void) static int _init_cluster(void)
{ {
node_updown_hash = dm_hash_create(100);
/* Open the cluster communication socket */ /* Open the cluster communication socket */
c_handle = cman_init(NULL); c_handle = cman_init(NULL);
if (!c_handle) { if (!c_handle) {
@@ -165,8 +172,10 @@ static int _cluster_do_node_callback(struct local_client *client,
for (i = 0; i < _get_num_nodes(); i++) { for (i = 0; i < _get_num_nodes(); i++) {
if (nodes[i].cn_member && nodes[i].cn_nodeid) { if (nodes[i].cn_member && nodes[i].cn_nodeid) {
callback(client, (char *)&nodes[i].cn_nodeid, node_updown[nodes[i].cn_nodeid]); int up = (int)(long)dm_hash_lookup_binary(node_updown_hash, (char *)&nodes[i].cn_nodeid, sizeof(int));
if (!node_updown[nodes[i].cn_nodeid])
callback(client, (char *)&nodes[i].cn_nodeid, up);
if (!up)
somedown = -1; somedown = -1;
} }
} }
@@ -184,7 +193,7 @@ static void event_callback(cman_handle_t handle, void *private, int reason, int
log_notice("clvmd on node %s has died\n", namebuf); log_notice("clvmd on node %s has died\n", namebuf);
DEBUGLOG("Got port closed message, removing node %s\n", namebuf); DEBUGLOG("Got port closed message, removing node %s\n", namebuf);
node_updown[arg] = 0; dm_hash_insert_binary(node_updown_hash, (char *)&arg, sizeof(int), (void *)0);
break; break;
case CMAN_REASON_STATECHANGE: case CMAN_REASON_STATECHANGE:
@@ -239,22 +248,7 @@ static void _add_up_node(const char *csid)
/* It's up ! */ /* It's up ! */
int nodeid = nodeid_from_csid(csid); int nodeid = nodeid_from_csid(csid);
if (nodeid >= max_updown_nodes) { dm_hash_insert_binary(node_updown_hash, (char *)&nodeid, sizeof(int), (void *)1);
int new_size = nodeid + 10;
int *new_updown = realloc(node_updown, sizeof(int) * new_size);
if (new_updown) {
node_updown = new_updown;
max_updown_nodes = new_size;
DEBUGLOG("realloced more space for nodes. now %d\n",
max_updown_nodes);
} else {
log_error
("Realloc failed. Node status for clvmd will be wrong. quitting\n");
exit(999);
}
}
node_updown[nodeid] = 1;
DEBUGLOG("Added new node %d to updown list\n", nodeid); DEBUGLOG("Added new node %d to updown list\n", nodeid);
} }
@@ -288,7 +282,12 @@ static void count_clvmds_running(void)
int i; int i;
for (i = 0; i < num_nodes; i++) { for (i = 0; i < num_nodes; i++) {
node_updown[nodes[i].cn_nodeid] = is_listening(nodes[i].cn_nodeid); int nodeid = nodes[i].cn_nodeid;
if (is_listening(nodeid) == 1)
dm_hash_insert_binary(node_updown_hash, (void *)&nodeid, sizeof(int), (void*)1);
else
dm_hash_insert_binary(node_updown_hash, (void *)&nodeid, sizeof(int), (void*)0);
} }
} }
@@ -332,16 +331,6 @@ static void get_members()
if (nodes[i].cn_nodeid > high_nodeid) if (nodes[i].cn_nodeid > high_nodeid)
high_nodeid = nodes[i].cn_nodeid; high_nodeid = nodes[i].cn_nodeid;
} }
if (node_updown == NULL) {
size_t buf_len;
if (high_nodeid >= max_updown_nodes)
max_updown_nodes = high_nodeid + 1;
buf_len = sizeof(int) * max_updown_nodes;
node_updown = malloc(buf_len);
if (node_updown)
memset(node_updown, 0, buf_len);
}
} }