From mboxrd@z Thu Jan 1 00:00:00 1970 From: teigland@sourceware.org Date: 23 Apr 2007 15:31:03 -0000 Subject: [Cluster-devel] cluster/group/dlm_controld action.c dlm_daemon ... Message-ID: <20070423153103.24920.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL5 Changes by: teigland at sourceware.org 2007-04-23 16:31:03 Modified files: group/dlm_controld: action.c dlm_daemon.h main.c Log message: Look for a protocol setting in cluster.conf dlm section, and set kernel accordingly if found. Also, set /proc/self/oom_adj (all daemons will get this). Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/action.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.8.2.1&r2=1.8.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/dlm_daemon.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.5.2.2&r2=1.5.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/main.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.6.2.3&r2=1.6.2.4 --- cluster/group/dlm_controld/action.c 2007/01/09 19:18:18 1.8.2.1 +++ cluster/group/dlm_controld/action.c 2007/04/23 15:31:02 1.8.2.2 @@ -692,3 +692,87 @@ return 0; } +#define PROTOCOL_PATH "/cluster/dlm/@protocol" +#define PROTO_TCP 1 +#define PROTO_SCTP 2 + +static int get_ccs_protocol(int cd) +{ + char path[PATH_MAX], *str; + int error, rv; + + memset(path, 0, PATH_MAX); + sprintf(path, PROTOCOL_PATH); + + error = ccs_get(cd, path, &str); + if (error || !str) + return -1; + + if (!strncasecmp(str, "tcp", 3)) + rv = PROTO_TCP; + else if (!strncasecmp(str, "sctp", 4)) + rv = PROTO_SCTP; + else { + log_error("read invalid dlm protocol from ccs"); + rv = 0; + } + + free(str); + return rv; +} + +static int set_configfs_protocol(int proto) +{ + char path[PATH_MAX]; + char buf[32]; + int fd, rv; + + rv = add_configfs_base(); + if (rv < 0) + return rv; + + memset(path, 0, PATH_MAX); + snprintf(path, PATH_MAX, "%s/protocol", CLUSTER_DIR); + + fd = open(path, O_WRONLY); + if (fd < 0) { + log_debug("%s: open failed: %d", path, errno); + return fd; + } + + memset(buf, 0, sizeof(buf)); + snprintf(buf, 32, "%d", proto); + + rv = do_write(fd, buf, strlen(buf)); + if (rv < 0) { + log_error("%s: write failed: %d", path, errno); + return rv; + } + close(fd); + return 0; +} + +void set_protocol(void) +{ + int cd, rv, proto; + + cd = open_ccs(); + + rv = get_ccs_protocol(cd); + + if (!rv || rv < 0) + goto out; + + /* for dlm kernel, TCP=0 and SCTP=1 */ + if (rv == PROTO_TCP) + proto = 0; + else if (rv == PROTO_SCTP) + proto = 1; + else + goto out; + + set_configfs_protocol(proto); + out: + ccs_disconnect(cd); +} + --- cluster/group/dlm_controld/dlm_daemon.h 2007/02/09 16:05:38 1.5.2.2 +++ cluster/group/dlm_controld/dlm_daemon.h 2007/04/23 15:31:02 1.5.2.3 @@ -84,6 +84,7 @@ int set_members(char *name, int new_count, int *new_members); int set_id(char *name, uint32_t id); int set_configfs_debug(int val); +void set_protocol(void); /* member_xxx.c */ int setup_member(void); --- cluster/group/dlm_controld/main.c 2007/02/09 16:05:38 1.6.2.3 +++ cluster/group/dlm_controld/main.c 2007/04/23 15:31:02 1.6.2.4 @@ -399,6 +399,18 @@ } } +void set_oom_adj(int val) +{ + FILE *fp; + + fp = fopen("/proc/self/oom_adj", "w"); + if (!fp) + return; + + fprintf(fp, "%i", val); + fclose(fp); +} + void set_scheduler(void) { struct sched_param sched_param; @@ -431,6 +443,8 @@ signal(SIGTERM, sigterm_handler); set_scheduler(); + set_oom_adj(-16); + set_protocol(); return loop(); }