From: teigland@sourceware.org <teigland@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/group/dlm_controld Makefile deadlock.c ...
Date: 6 Aug 2007 21:50:28 -0000 [thread overview]
Message-ID: <20070806215028.2645.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: cluster
Changes by: teigland at sourceware.org 2007-08-06 21:50:27
Modified files:
group/dlm_controld: Makefile deadlock.c dlm_daemon.h main.c
Log message:
fill in a couple more bits related to canceling the chosen lock
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/Makefile.diff?cvsroot=cluster&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/deadlock.c.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/dlm_daemon.h.diff?cvsroot=cluster&r1=1.10&r2=1.11
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/main.c.diff?cvsroot=cluster&r1=1.12&r2=1.13
--- cluster/group/dlm_controld/Makefile 2007/07/24 18:15:43 1.8
+++ cluster/group/dlm_controld/Makefile 2007/08/06 21:50:26 1.9
@@ -26,7 +26,7 @@
CFLAGS += -I../../group/lib/ -I../include/ -I../../dlm/lib/
CFLAGS += -I${incdir}
-LDFLAGS += -L${ccslibdir} -L${cmanlibdir} -L${openaislibdir} -lccs -lcman -lcpg -lSaCkpt
+LDFLAGS += -L${ccslibdir} -L${cmanlibdir} -L${openaislibdir} -lccs -lcman -lcpg -lSaCkpt -ldlm
LDFLAGS += -L../lib -lgroup
all: depends ${TARGET}
--- cluster/group/dlm_controld/deadlock.c 2007/07/24 18:15:43 1.1
+++ cluster/group/dlm_controld/deadlock.c 2007/08/06 21:50:26 1.2
@@ -11,8 +11,9 @@
******************************************************************************/
#include "dlm_daemon.h"
+#include "libdlm.h"
-int deadlock_enabled;
+int deadlock_enabled = 0;
extern struct list_head lockspaces;
extern int our_nodeid;
@@ -60,41 +61,46 @@
struct list_head list; /* r->locks */
struct pack_lock lock; /* data from debugfs/checkpoint */
unsigned int time; /* waiting time read from debugfs */
- int from; /* node that checkpointed the lock */
+ int from; /* node that checkpointed the lock*/
struct dlm_rsb *rsb; /* lock against this resource */
struct trans *trans; /* lock owned by this transaction */
struct list_head trans_list; /* tr->locks */
};
-#define TR_NALLOC 4 /* waitfor pointers alloc'ed 4 at at time */
+/* waitfor pointers alloc'ed 4 at at time */
+#define TR_NALLOC 4
struct trans {
- struct list_head list;
- struct list_head locks;
- uint64_t xid;
- int others_waiting_on_us; /* count of trans's pointing to us in waitfor */
- int waitfor_alloc;
- int waitfor_count; /* count of in-use waitfor slots */
- struct trans **waitfor; /* waitfor_alloc trans pointers */
+ struct list_head list;
+ struct list_head locks;
+ uint64_t xid;
+ int others_waiting_on_us; /* count of trans's
+ pointing to us in
+ waitfor */
+ int waitfor_alloc;
+ int waitfor_count; /* count of in-use
+ waitfor slots */
+ struct trans **waitfor; /* waitfor_alloc trans
+ pointers */
};
-#define DLM_HEADER_MAJOR 1
-#define DLM_HEADER_MINOR 0
-#define DLM_HEADER_PATCH 0
+#define DLM_HEADER_MAJOR 1
+#define DLM_HEADER_MINOR 0
+#define DLM_HEADER_PATCH 0
-#define DLM_MSG_CYCLE_START 1
+#define DLM_MSG_CYCLE_START 1
#define DLM_MSG_CHECKPOINT_READY 2
-#define DLM_MSG_CANCEL_LOCK 3
+#define DLM_MSG_CANCEL_LOCK 3
struct dlm_header {
- uint16_t version[3];
- uint16_t type; /* MSG_ */
- uint32_t nodeid; /* sender */
- uint32_t to_nodeid; /* 0 if to all */
- uint32_t global_id;
- uint32_t lock_id;
- uint32_t pad;
- char name[MAXNAME];
+ uint16_t version[3];
+ uint16_t type; /* MSG_ */
+ uint32_t nodeid; /* sender */
+ uint32_t to_nodeid; /* 0 if to all */
+ uint32_t global_id;
+ uint32_t lkid;
+ uint32_t pad;
+ char name[MAXNAME];
};
static const int __dlm_compat_matrix[8][8] = {
@@ -836,19 +842,14 @@
send_message(ls, DLM_MSG_CYCLE_START);
}
-/* FIXME: where to send this? we want to do the cancel on the node
- where the transaction lives, which isn't always the master node that
- sent us the info. look at lkb->from and lkb->lock.nodeid, use
- remid if sending to a process copy node */
-
static void send_cancel_lock(struct lockspace *ls, struct trans *tr,
struct dlm_lkb *lkb)
{
struct dlm_header *hd;
int len;
char *buf;
-
- log_group(ls, "send_cancel_lock");
+ int to_nodeid;
+ uint32_t lkid;
len = sizeof(struct dlm_header);
buf = malloc(len);
@@ -859,13 +860,28 @@
}
memset(buf, 0, len);
+ if (lkb->lock.nodeid) {
+ /* this was MSTCPY lkb from master node */
+ to_nodeid = lkb->lock.nodeid;
+ lkid = lkb->lock.remid;
+ } else {
+ /* process-copy lkb from node where lock is held */
+ to_nodeid = lkb->from;
+ lkid = lkb->lock.id;
+ }
+
+ log_group(ls, "send_cancel_lock to %x lkid %d, id %x remid %x "
+ "nodeid %d from %d", to_nodeid, lkid,
+ lkb->lock.id, lkb->lock.remid, lkb->lock.nodeid, lkb->from);
+
hd = (struct dlm_header *)buf;
hd->version[0] = cpu_to_le16(DLM_HEADER_MAJOR);
hd->version[1] = cpu_to_le16(DLM_HEADER_MINOR);
hd->version[2] = cpu_to_le16(DLM_HEADER_PATCH);
hd->type = cpu_to_le16(DLM_MSG_CANCEL_LOCK);
hd->nodeid = cpu_to_le32(our_nodeid);
- hd->to_nodeid = 0;
+ hd->to_nodeid = cpu_to_le32(to_nodeid);
+ hd->lkid = cpu_to_le32(lkid);
hd->global_id = cpu_to_le32(ls->global_id);
memcpy(hd->name, ls->name, strlen(ls->name));
@@ -926,6 +942,32 @@
send_checkpoint_ready(ls);
}
+static void receive_cancel_lock(struct lockspace *ls, int nodeid, uint32_t lkid)
+{
+ dlm_lshandle_t h;
+ int rv;
+
+ if (nodeid != our_nodeid)
+ return;
+
+ h = dlm_open_lockspace(ls->name);
+ if (!h) {
+ log_error("deadlock cancel %x from %d can't open lockspace %s",
+ lkid, nodeid, ls->name);
+ return;
+ }
+
+ log_group(ls, "receive_cancel_lock %x from %d", lkid, nodeid);
+
+ rv = dlm_ls_deadlock_cancel(h, lkid, 0);
+ if (rv < 0) {
+ log_error("deadlock cancel %x from %x lib cancel error %d",
+ lkid, nodeid, rv);
+ }
+
+ dlm_close_lockspace(h);
+}
+
static void deliver_cb(cpg_handle_t handle, struct cpg_name *group_name,
uint32_t nodeid, uint32_t pid, void *data, int data_len)
{
@@ -959,6 +1001,9 @@
case DLM_MSG_CHECKPOINT_READY:
receive_checkpoint_ready(ls, hd->nodeid);
break;
+ case DLM_MSG_CANCEL_LOCK:
+ receive_cancel_lock(ls, hd->nodeid, hd->lkid);
+ break;
default:
log_error("unknown message type %d from %d",
hd->type, hd->nodeid);
@@ -1391,27 +1436,6 @@
return "?";
}
-static char *mode_str(int mode)
-{
- switch (mode) {
- case DLM_LOCK_IV:
- return "IV";
- case DLM_LOCK_NL:
- return "NL";
- case DLM_LOCK_CR:
- return "CR";
- case DLM_LOCK_CW:
- return "CW";
- case DLM_LOCK_PR:
- return "PR";
- case DLM_LOCK_PW:
- return "PW";
- case DLM_LOCK_EX:
- return "EX";
- }
- return "??";
-}
-
static void dump_trans(struct lockspace *ls, struct trans *tr)
{
struct dlm_lkb *lkb;
@@ -1428,8 +1452,8 @@
log_group(ls, " %s: id %08x gr %s rq %s pid %u \"%s\"",
status_str(lkb->lock.status),
lkb->lock.id,
- mode_str(lkb->lock.grmode),
- mode_str(lkb->lock.rqmode),
+ dlm_mode_str(lkb->lock.grmode),
+ dlm_mode_str(lkb->lock.rqmode),
lkb->lock.ownpid,
lkb->rsb->name);
}
--- cluster/group/dlm_controld/dlm_daemon.h 2007/07/24 18:15:43 1.10
+++ cluster/group/dlm_controld/dlm_daemon.h 2007/08/06 21:50:26 1.11
@@ -41,10 +41,6 @@
#include <sched.h>
#include <signal.h>
#include <sys/time.h>
-#include <linux/netlink.h>
-#include <linux/genetlink.h>
-#include <linux/dlm.h>
-#include <linux/dlm_netlink.h>
#include <openais/saAis.h>
#include <openais/saCkpt.h>
@@ -129,6 +125,7 @@
struct lockspace *get_client_lockspace(int ci);
struct lockspace *create_ls(char *name);
struct lockspace *find_ls(char *name);
+char *dlm_mode_str(int mode);
/* member_cman.c */
int is_cman_member(int nodeid);
--- cluster/group/dlm_controld/main.c 2007/07/24 18:15:43 1.12
+++ cluster/group/dlm_controld/main.c 2007/08/06 21:50:26 1.13
@@ -12,6 +12,11 @@
#include "dlm_daemon.h"
+#include <linux/netlink.h>
+#include <linux/genetlink.h>
+#include <linux/dlm.h>
+#include <linux/dlm_netlink.h>
+
#define OPTION_STRING "KDhVd:"
#define LOCKFILE_NAME "/var/run/dlm_controld.pid"
@@ -22,7 +27,7 @@
struct list_head lockspaces;
extern group_handle_t gh;
-extern deadlock_enabled = 0;
+extern int deadlock_enabled;
static int daemon_quit;
static int client_maxi;
@@ -184,6 +189,26 @@
return rp;
}
+char *dlm_mode_str(int mode)
+{
+ switch (mode) {
+ case DLM_LOCK_IV:
+ return "IV";
+ case DLM_LOCK_NL:
+ return "NL";
+ case DLM_LOCK_CR:
+ return "CR";
+ case DLM_LOCK_CW:
+ return "CW";
+ case DLM_LOCK_PR:
+ return "PR";
+ case DLM_LOCK_PW:
+ return "PW";
+ case DLM_LOCK_EX:
+ return "EX";
+ }
+ return "??";
+}
/* recv "online" (join) and "offline" (leave)
messages from dlm via uevents and pass them on to groupd */
reply other threads:[~2007-08-06 21:50 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070806215028.2645.qmail@sourceware.org \
--to=teigland@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.