Revision ca2a79e1 lib/mcpu.py

b/lib/mcpu.py
129 129
    given LU and its opcodes.
130 130

  
131 131
    """
132
    adding_locks = level in lu.add_locks
133
    acquiring_locks = level in lu.needed_locks
132 134
    if level not in locking.LEVELS:
133 135
      result = self._ExecLU(lu)
134
    elif level in lu.needed_locks:
135
      # This gives a chance to LUs to make last-minute changes after acquiring
136
      # locks at any preceding level.
136
    elif adding_locks and acquiring_locks:
137
      # We could both acquire and add locks at the same level, but for now we
138
      # don't need this, so we'll avoid the complicated code needed.
139
      raise NotImplementedError(
140
        "Can't declare locks to acquire when adding others")
141
    elif adding_locks or acquiring_locks:
137 142
      lu.DeclareLocks(level)
138
      needed_locks = lu.needed_locks[level]
139 143
      share = lu.share_locks[level]
140
      # This is always safe to do, as we can't acquire more/less locks than
141
      # what was requested.
142
      lu.acquired_locks[level] = self.context.glm.acquire(level,
143
                                                          needed_locks,
144
                                                          shared=share)
144
      if acquiring_locks:
145
        needed_locks = lu.needed_locks[level]
146
        lu.acquired_locks[level] = self.context.glm.acquire(level,
147
                                                            needed_locks,
148
                                                            shared=share)
149
      else: # adding_locks
150
        add_locks = lu.add_locks[level]
151
        lu.remove_locks[level] = add_locks
152
        try:
153
          self.context.glm.add(level, add_locks, acquired=1, shared=share)
154
        except errors.LockError:
155
          raise errors.OpPrereqError(
156
            "Coudn't add locks (%s), probably because of a race condition"
157
            " with another job, who added them first" % add_locks)
145 158
      try:
146
        result = self._LockAndExecLU(lu, level + 1)
159
        try:
160
          if adding_locks:
161
            lu.acquired_locks[level] = add_locks
162
          result = self._LockAndExecLU(lu, level + 1)
163
        finally:
164
          if level in lu.remove_locks:
165
            self.context.glm.remove(level, lu.remove_locks[level])
147 166
      finally:
148 167
        if self.context.glm.is_owned(level):
149 168
          self.context.glm.release(level)

Also available in: Unified diff