[Ocfs2-devel] [PATCH 2/2] ocfs2/dlm: Migrate lockres with no locks if it has a reference

Wengang Wang wen.gang.wang at oracle.com
Mon Nov 22 00:17:37 PST 2010


On 10-11-19 15:06, Sunil Mushran wrote:
> o2dlm was not migrating resources with zero locks because it assumed that that
> resource would get purged by dlm_thread. However, some usage patterns involve
> creating and dropping locks at a high rate leading to the migrate thread seeing
> zero locks but the purge thread seeing an active reference. When this happens,
> the dlm_thread cannot purge the resource and the migrate thread sees no reason
> to migrate that resource. The spell is broken when the migrate thread catches
> the resource with a lock.

I think we can consider MIGRATING as BUSY(DLM_FORWARD) and the creating thread
should retry in case the owner has changed after the migration.

code it as something like this:

static enum dlm_status dlmlock_master(struct dlm_ctxt *dlm, ...
{
	...
	spin_lock(&res->spinlock);
	__dlm_wait_on_lockres(res);
	if (unlikely(res->owner != dlm->node_num)) {
		spin_unlock(&res->spinlock);
		return DLM_FORWARD;
	}
	...
}

And if it's from a handler path, just return the DLM_FORWARD; Otherwise
retry in dlmlock(), (goto retry_lock).

The above should be taken care in my patch "check lockres owner in handler path",
not for only handler path but also the "local create" path. But seems I
missed it.

regards,
wengang.
> 
> The fix is to make the migrate thread also consider the reference map.
> 
> This usage pattern can be triggered by userspace on userdlm locks and flocks.
> 
> Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>
> ---



More information about the Ocfs2-devel mailing list