docs: def grant(self, lock, unit):
          '''Maybe grant the lock to a unit.
  
          The decision to grant the lock or not is made for $lock
          by a corresponding method grant_$lock, which you may define
          in a subclass. If no such method is defined, the default_grant
          method is used. See Serial.default_grant() for details.
          '''
          if not hookenv.is_leader():
              return False  # Not the leader, so we cannot grant.
  
          # Set of units already granted the lock.
          granted = set()
          for u in self.grants:
              if lock in self.grants[u]:
                  granted.add(u)
          if unit in granted:
              return True  # Already granted.
  
          # Ordered list of units waiting for the lock.
          reqs = set()
          for u in self.requests:
              if u in granted:
                  continue  # In the granted set. Not wanted in the req list.
              for _lock, ts in self.requests[u].items():
                  if _lock == lock:
                      reqs.add((ts, u))
          queue = [t[1] for t in sorted(reqs)]
          if unit not in queue:
              return False  # Unit has not requested the lock.
  
          # Locate custom logic, or fallback to the default.
          grant_func = getattr(self, 'grant_{}'.format(lock), self.default_grant)
  
          if grant_func(lock, unit, granted, queue):
              # Grant the lock.
              self.msg('Leader grants {} to {}'.format(lock, unit))
              self.grants.setdefault(unit, {})[lock] = self.requests[unit][lock]
              return True
  
          return False