From ee13764f38b694c8bfcb2bd3a57a2d054346838d Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Fri, 12 Aug 2011 14:47:47 +0200 Subject: [PATCH] Allow locking to be used via OpQuery MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The original design for query2 specifically excluded locking, but now it's turned out that it would be a good thing to have in watcher. This patch adds a new parameter to OpQuery and enables its use in LUQuery. A missing function is added to LUGroupQuery, a comment clarified in _NodeQuery and all locks declared as shared acquires in the same LU. Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: RenΓ© Nussbaumer <rn@google.com> --- lib/cmdlib.py | 9 ++++++--- lib/opcodes.py | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 362aa15c8..cefd7d4a7 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -4338,7 +4338,7 @@ class _NodeQuery(_QueryBase): def ExpandNames(self, lu): lu.needed_locks = {} - lu.share_locks[locking.LEVEL_NODE] = 1 + lu.share_locks = _ShareAll() if self.names: self.wanted = _GetWantedNodes(lu, self.names) @@ -4349,7 +4349,7 @@ class _NodeQuery(_QueryBase): query.NQ_LIVE in self.requested_data) if self.do_locking: - # if we don't request only static fields, we need to lock the nodes + # If any non-static field is requested we need to lock the nodes lu.needed_locks[locking.LEVEL_NODE] = self.wanted def DeclareLocks(self, lu, level): @@ -4721,7 +4721,7 @@ class LUQuery(NoHooksLU): def CheckArguments(self): qcls = _GetQueryImplementation(self.op.what) - self.impl = qcls(self.op.filter, self.op.fields, False) + self.impl = qcls(self.op.filter, self.op.fields, self.op.use_locking) def ExpandNames(self): self.impl.ExpandNames(self) @@ -12057,6 +12057,9 @@ class LUGroupQuery(NoHooksLU): def ExpandNames(self): self.gq.ExpandNames(self) + def DeclareLocks(self, level): + self.gq.DeclareLocks(self, level) + def Exec(self, feedback_fn): return self.gq.OldStyleQuery(self) diff --git a/lib/opcodes.py b/lib/opcodes.py index a960d44aa..fe99b6ee0 100644 --- a/lib/opcodes.py +++ b/lib/opcodes.py @@ -795,6 +795,7 @@ class OpQuery(OpCode): OP_DSC_FIELD = "what" OP_PARAMS = [ _PQueryWhat, + _PUseLocking, ("fields", ht.NoDefault, ht.TListOf(ht.TNonEmptyString), "Requested fields"), ("filter", None, ht.TOr(ht.TNone, ht.TListOf), -- GitLab