docs: def acquire(self, lock):
          '''Acquire the named lock, non-blocking.
  
          The lock may be granted immediately, or in a future hook.
  
          Returns True if the lock has been granted. The lock will be
          automatically released at the end of the hook in which it is
          granted.
  
          Do not mindlessly call this method, as it triggers a cascade of
          hooks. For example, if you call acquire() every time in your
          peers relation-changed hook you will end up with an infinite loop
          of hooks. It should almost always be guarded by some condition.
          '''
          unit = hookenv.local_unit()
          ts = self.requests[unit].get(lock)
          if not ts:
              # If there is no outstanding request on the peers relation,
              # create one.
              self.requests.setdefault(lock, {})
              self.requests[unit][lock] = _timestamp()
              self.msg('Requested {}'.format(lock))
  
          # If the leader has granted the lock, yay.
          if self.granted(lock):
              self.msg('Acquired {}'.format(lock))
              return True
  
          # If the unit making the request also happens to be the
          # leader, it must handle the request now. Even though the
          # request has been stored on the peers relation, the peers
          # relation-changed hook will not be triggered.
          if hookenv.is_leader():
              return self.grant(lock, unit)
  
          return False