[Cluster-devel] cluster/group/dlm_controld action.c dlm_daemon ...
teigland at sourceware.org
teigland at sourceware.org
Mon Apr 23 15:31:03 UTC 2007
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();
}
More information about the Cluster-devel
mailing list