Release the lock.

        Noop if not locked.
        :param key: the name of the lock to release
        :return: the name of the released lock, or `None` if no lock was released
        :raises InvalidKeyError: if the `key` is not valid

def release(self, key: str) -> Optional[str]:
        """
        Release the lock.

        Noop if not locked.
        :param key: the name of the lock to release
        :return: the name of the released lock, or `None` if no lock was released
        :raises InvalidKeyError: if the `key` is not valid
        """
        ConsulLockManager.validate_key(key)

        key_value = self.consul_client.kv.get(key)[1]
        if key_value is None:
            logger.info(f"No lock found")
            return None

        lock_information = json.loads(key_value["Value"].decode("utf-8"), cls=ConsulLockInformationJSONDecoder)
        logger.info(f"Destroying the session {lock_information.session_id} that is holding the lock")
        unlocked = self.consul_client.session.destroy(session_id=lock_information.session_id)
        # This instance might be managing the removed session
        try:
            self._acquiring_session_ids.remove(lock_information.session_id)
        except KeyError:
            pass

        logger.info("Unlocked" if unlocked else "Went to unlock but was already released upon sending request")
        return key