Commit 6f4f4ca5 authored by Alexander Aring's avatar Alexander Aring Committed by David Teigland
Browse files

dlm: add new flag DLM_RELEASE_RECOVER for dlm_lockspace_release



When dlm_lockspace_release() is passed DLM_RELEASE_RECOVER, it
tells the dlm to handle the release/leave as if the node had failed,
i.e. perform recovery steps for a failed node, like recover_slot().

When DLM_RELEASE_RECOVER is set:
- dlm_release_lockspace() includes RELEASE_RECOVER=1 in the OFFLINE
  uevent sent to userspace.
- userspace/dlm_controld sends a message to all lockspace members
  indicating that the subsequent node removal should be handled as
  if the node had failed.
- when dlm_controld on all nodes receives the new message, it sets
  the release_recover configfs entry to 1 for the node.
- when the dlm/kernel next performs recovery and removes the node,
  it will see that release_recover has been set, and will perform
  recovery steps for the node as if it had failed, e.g. the
  recover_slot() callback is called to notify the fs.

Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
parent de7b4869
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -738,7 +738,7 @@ static int release_lockspace(struct dlm_ls *ls, int release_option)

	if (release_option != DLM_RELEASE_NO_EVENT &&
	    dlm_user_daemon_available())
		do_uevent(ls, 0, 0);
		do_uevent(ls, 0, (release_option == DLM_RELEASE_RECOVER));

	dlm_recoverd_stop(ls);

+10 −4
Original line number Diff line number Diff line
@@ -478,7 +478,8 @@ static void dlm_lsop_recover_prep(struct dlm_ls *ls)
	ls->ls_ops->recover_prep(ls->ls_ops_arg);
}

static void dlm_lsop_recover_slot(struct dlm_ls *ls, struct dlm_member *memb)
static void dlm_lsop_recover_slot(struct dlm_ls *ls, struct dlm_member *memb,
				  unsigned int release_recover)
{
	struct dlm_slot slot;
	uint32_t seq;
@@ -495,7 +496,7 @@ static void dlm_lsop_recover_slot(struct dlm_ls *ls, struct dlm_member *memb)

	error = dlm_comm_seq(memb->nodeid, &seq, false);

	if (!error && seq == memb->comm_seq)
	if (!release_recover && !error && seq == memb->comm_seq)
		return;

	slot.nodeid = memb->nodeid;
@@ -552,6 +553,7 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
	struct dlm_member *memb, *safe;
	struct dlm_config_node *node;
	int i, error, neg = 0, low = -1;
	unsigned int release_recover;

	/* previously removed members that we've not finished removing need to
	 * count as a negative change so the "neg" recovery steps will happen
@@ -572,8 +574,12 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
		if (node && !node->new && !node->gone)
			continue;

		release_recover = 0;

		if (node->gone) {
			log_rinfo(ls, "remove member %d", memb->nodeid);
			release_recover = node->release_recover;
			log_rinfo(ls, "remove member %d%s", memb->nodeid,
				  release_recover ? " (release_recover)" : "");
		} else {
			/* removed and re-added */
			log_rinfo(ls, "remove member %d comm_seq %u %u",
@@ -584,7 +590,7 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
		list_move(&memb->list, &ls->ls_nodes_gone);
		remove_remote_member(memb->nodeid);
		ls->ls_num_nodes--;
		dlm_lsop_recover_slot(ls, memb);
		dlm_lsop_recover_slot(ls, memb, release_recover);
	}

	/* add new members to ls_nodes */
+5 −0
Original line number Diff line number Diff line
@@ -103,11 +103,16 @@ int dlm_new_lockspace(const char *name, const char *cluster,
 *   a leave event to the cluster manager, so other nodes will
 *   not be notified that the node should be removed from the
 *   list of lockspace members.
 *
 * DLM_RELEASE_RECOVER like DLM_RELEASE_NORMAL, but the remaining
 *   nodes will handle the removal of the node as if the node
 *   had failed, e.g. the recover_slot() callback would be used.
 */
#define DLM_RELEASE_NO_LOCKS		0
#define DLM_RELEASE_UNUSED		1
#define DLM_RELEASE_NORMAL		2
#define DLM_RELEASE_NO_EVENT		3
#define DLM_RELEASE_RECOVER		4

/*
 * dlm_release_lockspace