From 9bdab6219839d70dcea52ad9ffa3b4b449794854 Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Wed, 18 Aug 2010 17:19:44 +0200
Subject: [PATCH] jqueue: Remove lock status field
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

With the job queue changes for Ganeti 2.2, watched and queried jobs are
loaded directly from disk, rendering the in-memory β€œlock_status” field
useless. Writing it to disk would be possible, but has a huge cost at
runtime (when tested, processing 1'000 opcodes involved 4'000 additional
writes to job files, even with replication turned off).

Using an additional in-memory dictionary to just manage this field turned
out to be a complicated task due to the necessary locking.

The plan is to introduce a more generic lock debugging mechanism in the
near future. Hence the decision is to remove this field now instead of
spending a lot of time to make it working again.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 lib/jqueue.py | 21 ++-------------------
 1 file changed, 2 insertions(+), 19 deletions(-)

diff --git a/lib/jqueue.py b/lib/jqueue.py
index 633315a72..96608e24f 100644
--- a/lib/jqueue.py
+++ b/lib/jqueue.py
@@ -167,13 +167,11 @@ class _QueuedJob(object):
   @ivar received_timestamp: the timestamp for when the job was received
   @ivar start_timestmap: the timestamp for start of execution
   @ivar end_timestamp: the timestamp for end of execution
-  @ivar lock_status: In-memory locking information for debugging
 
   """
   # pylint: disable-msg=W0212
   __slots__ = ["queue", "id", "ops", "log_serial",
                "received_timestamp", "start_timestamp", "end_timestamp",
-               "lock_status", "change",
                "__weakref__"]
 
   def __init__(self, queue, job_id, ops):
@@ -199,9 +197,6 @@ class _QueuedJob(object):
     self.start_timestamp = None
     self.end_timestamp = None
 
-    # In-memory attributes
-    self.lock_status = None
-
   def __repr__(self):
     status = ["%s.%s" % (self.__class__.__module__, self.__class__.__name__),
               "id=%s" % self.id,
@@ -228,9 +223,6 @@ class _QueuedJob(object):
     obj.start_timestamp = state.get("start_timestamp", None)
     obj.end_timestamp = state.get("end_timestamp", None)
 
-    # In-memory attributes
-    obj.lock_status = None
-
     obj.ops = []
     obj.log_serial = 0
     for op_state in state["ops"]:
@@ -368,8 +360,6 @@ class _QueuedJob(object):
         row.append(self.start_timestamp)
       elif fname == "end_ts":
         row.append(self.end_timestamp)
-      elif fname == "lock_status":
-        row.append(self.lock_status)
       elif fname == "summary":
         row.append([op.input.Summary() for op in self.ops])
       else:
@@ -439,16 +429,15 @@ class _OpExecCallbacks(mcpu.OpExecCbBase):
     Processor.ExecOpCode) set to OP_STATUS_WAITLOCK.
 
     """
+    assert self._op in self._job.ops
     assert self._op.status in (constants.OP_STATUS_WAITLOCK,
                                constants.OP_STATUS_CANCELING)
 
-    # All locks are acquired by now
-    self._job.lock_status = None
-
     # Cancel here if we were asked to
     self._CheckCancel()
 
     logging.debug("Opcode is now running")
+
     self._op.status = constants.OP_STATUS_RUNNING
     self._op.exec_timestamp = TimeStampNow()
 
@@ -490,9 +479,6 @@ class _OpExecCallbacks(mcpu.OpExecCbBase):
     assert self._op.status in (constants.OP_STATUS_WAITLOCK,
                                constants.OP_STATUS_CANCELING)
 
-    # Not getting the queue lock because this is a single assignment
-    self._job.lock_status = msg
-
     # Cancel here if we were asked to
     self._CheckCancel()
 
@@ -755,7 +741,6 @@ class _JobQueueWorker(workerpool.BaseWorker):
               op.result = result
               op.end_timestamp = TimeStampNow()
               if idx == count - 1:
-                job.lock_status = None
                 job.end_timestamp = TimeStampNow()
 
                 # Consistency check
@@ -797,7 +782,6 @@ class _JobQueueWorker(workerpool.BaseWorker):
                                   errors.GetEncodedError(i.result)
                                   for i in job.ops[idx:])
               finally:
-                job.lock_status = None
                 job.end_timestamp = TimeStampNow()
                 queue.UpdateJobUnlocked(job)
             finally:
@@ -809,7 +793,6 @@ class _JobQueueWorker(workerpool.BaseWorker):
         try:
           job.MarkUnfinishedOps(constants.OP_STATUS_CANCELED,
                                 "Job canceled by request")
-          job.lock_status = None
           job.end_timestamp = TimeStampNow()
           queue.UpdateJobUnlocked(job)
         finally:
-- 
GitLab