def get_limits(self, limit_sum=None):
        """
        Gets the current limit data if it is different from the data
        indicated by limit_sum.  The db argument is used for hydrating
        the limit objects.  Raises a NoChangeException if the
        limit_sum represents no change, otherwise returns a tuple
        consisting of the current limit_sum and a list of Limit
        objects.
        """

        with self.limit_lock:
            # Grab the checksum and limit list
            try:
                return self.limit_rpc.get_limits(limit_sum)
            except control.NoChangeException:
                # Expected possibility
                raise
            except Exception:
                # Something happened; maybe the server isn't running.
                # Pretend that there's no change...
                raise control.NoChangeException()
Gets the current limit data if it is different from the data
        indicated by limit_sum.  The db argument is used for hydrating
        the limit objects.  Raises a NoChangeException if the
        limit_sum represents no change, otherwise returns a tuple
        consisting of the current limit_sum and a list of Limit
        objects.