Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 64889cf990215d6784c5de98ab40e899013296cc
Parent: 2cb1706ea8af0abf54a31d52ab33ee5e098fc252
Author: Andrew Beekhof <andrew(a)beekhof.net>
AuthorDate: Thu Sep 24 19:42:50 2009 +0200
Committer: Fabio M. Di Nitto <fdinitto(a)redhat.com>
CommitterDate: Thu Sep 24 19:42:50 2009 +0200
Add most of the needed pieces for gfs2-pacemaker integration
Signed-off-by: Andrew Beekhof <andrew(a)beekhof.net>
Signed-off-by: Fabio M. Di Nitto <fdinitto(a)redhat.com>
---
group/gfs_controld/Makefile | 41 +++++++++++++++----
group/gfs_controld/member_pcmk.c | 84 ++++++++++++++++++++++++++++++++++++++
2 files changed, 117 insertions(+), 8 deletions(-)
diff --git a/group/gfs_controld/Makefile b/group/gfs_controld/Makefile
index b0e6894..9d07a36 100644
--- a/group/gfs_controld/Makefile
+++ b/group/gfs_controld/Makefile
@@ -1,19 +1,23 @@
+include ../../make/defines.mk
+
TARGET= gfs_controld
+ifdef enable_pacemaker
+TARGET += gfs_controld.pcmk
+SBINDIRT += gfs_controld.pcmk
+endif
SBINDIRT=$(TARGET)
all: depends ${TARGET}
-include ../../make/defines.mk
include $(OBJDIR)/make/cobj.mk
include $(OBJDIR)/make/clean.mk
include $(OBJDIR)/make/install.mk
include $(OBJDIR)/make/uninstall.mk
-OBJS= main.o \
- member_cman.o \
- config.o \
+SHAREDOBJS= main.o \
crc.o \
+ config.o \
cpg-new.o \
cpg-old.o \
group.o \
@@ -21,6 +25,13 @@ OBJS= main.o \
plock.o \
logging.o
+
+PCMK_OBJS= member_pcmk-pcmk.o \
+ $(SHAREDOBJS:.o=-pcmk.o)
+
+OBJS= $(SHAREDOBJS) \
+ member_cman.o
+
CFLAGS += -I${ccsincdir} -I${cmanincdir} -I${logtincdir} -I${dlmcontrolincdir}
CFLAGS += -I${corosyncincdir} -I${openaisincdir} -I${fencedincdir}
CFLAGS += -I${KERNEL_SRC}/include/
@@ -28,19 +39,33 @@ CFLAGS += -I$(S)/../libgfscontrol
CFLAGS += -I$(S)/../lib/ -I$(S)/../include/
CFLAGS += -I${incdir}
-LDFLAGS += -L${ccslibdir} -lccs -L${cmanlibdir} -lcman
+PCMK_CFLAGS += -DENABLE_PACEMAKER=1
+PCMK_CFLAGS += -I${incdir}/heartbeat -I${incdir}/pacemaker
+PCMK_CFLAGS += `pkg-config glib-2.0 --cflags`
+PCMK_CFLAGS += `xml2-config --cflags`
+
LDFLAGS += -L${dlmcontrollibdir} -ldlmcontrol
LDFLAGS += -L${logtlibdir} -llogthread
LDFLAGS += -L${corosynclibdir} -lcpg -lpthread
LDFLAGS += -L${openaislibdir} -lSaCkpt
-LDFLAGS += -L${fencedlibdir} -lfenced
LDFLAGS += -L../lib -lgroup
LDFLAGS += -L${libdir}
+PCMK_LDFLAGS += -L${ccslibdir} -lccs
+PCMK_LDFLAGS += -lcib -lcrmcommon -lcrmcluster -ltotem_pg
+PCMK_LDFLAGS += `pkg-config glib-2.0 --libs`
+PCMK_LDFLAGS += `xml2-config --libs`
+
+CMAN_LDFLAGS += -L${ccslibdir} -L${cmanlibdir} -lccs -lcman
+CMAN_LDFLAGS += -L${fencedlibdir} -lfenced
+
LDDEPS += ../lib/libgroup.a
-${TARGET}: ${OBJS} ${LDDEPS}
- $(CC) -o $@ $^ $(LDFLAGS)
+gfs_controld: ${OBJS} ${LDDEPS}
+ $(CC) -o $@ $^ $(LDFLAGS) $(CMAN_LDFLAGS)
+
+gfs_controld.pcmk: ${PCMK_OBJS} ${LDDEPS}
+ $(CC) -o $@ $^ $(LDFLAGS) $(PCMK_LDFLAGS)
depends:
$(MAKE) -C ../lib all
diff --git a/group/gfs_controld/member_pcmk.c b/group/gfs_controld/member_pcmk.c
new file mode 100644
index 0000000..88e5528
--- /dev/null
+++ b/group/gfs_controld/member_pcmk.c
@@ -0,0 +1,84 @@
+#include "gfs_daemon.h"
+#include "config.h"
+
+#include <glib.h>
+#include <bzlib.h>
+#include <heartbeat/ha_msg.h>
+
+#include <pacemaker/crm_config.h>
+
+#include <pacemaker/crm/crm.h>
+#include <pacemaker/crm/ais.h>
+#include <pacemaker/crm/attrd.h>
+/* heartbeat support is irrelevant here */
+#undef SUPPORT_HEARTBEAT
+#define SUPPORT_HEARTBEAT 0
+#include <pacemaker/crm/common/cluster.h>
+#include <pacemaker/crm/common/stack.h>
+#include <pacemaker/crm/common/ipc.h>
+#include <pacemaker/crm/msg_xml.h>
+#include <pacemaker/crm/cib.h>
+
+extern int ais_fd_async;
+
+static int pcmk_cluster_fd = 0;
+static void attrd_deadfn(int ci)
+{
+ log_error("%s: Lost connection to the cluster", __FUNCTION__);
+ pcmk_cluster_fd = 0;
+ return;
+}
+
+void kick_node_from_cluster(int nodeid)
+{
+ int fd = pcmk_cluster_fd;
+ int rc = crm_terminate_member_no_mainloop(nodeid, NULL, &fd);
+
+ if(fd > 0 && fd != pcmk_cluster_fd) {
+ pcmk_cluster_fd = fd;
+ client_add(pcmk_cluster_fd, NULL, attrd_deadfn);
+ }
+
+ switch(rc) {
+ case 1:
+ log_debug("Requested that node %d be kicked from the cluster", nodeid);
+ break;
+ case -1:
+ log_error("Don't know how to kick node %d from the cluster", nodeid);
+ break;
+ case 0:
+ log_error("Could not kick node %d from the cluster", nodeid);
+ break;
+ default:
+ log_error("Unknown result when kicking node %d from the cluster",
nodeid);
+ break;
+ }
+ return;
+}
+
+void process_cluster(int ci)
+{
+ ais_dispatch(ais_fd_async, NULL);
+ cluster_quorate = crm_have_quorum;
+}
+
+int setup_cluster(void)
+{
+ /* To avoid creating an additional place for the dlm to be configured,
+ * only allow configuration from the command-line until CoroSync is stable
+ * enough to be used with Pacemaker
+ */
+ return 0;
+}
+
+void close_cluster(void)
+{
+ terminate_ais_connection();
+}
+
+#include <../../fence/libfenced/libfenced.h>
+int fenced_node_info(int nodeid, struct fenced_node *node)
+{
+ /* Not implemented */
+ return -1;
+}