diff --git a/earwigbot/wiki/site.py b/earwigbot/wiki/site.py index 86a990c..ae933a8 100644 --- a/earwigbot/wiki/site.py +++ b/earwigbot/wiki/site.py @@ -75,7 +75,8 @@ class Site(object): - :py:meth:`api_query`: does an API query with kwargs as params - :py:meth:`sql_query`: does an SQL query and yields its results - - :py:meth:`get_replag`: estimates the database replication lag + - :py:meth:`get_maxlag`: returns the internal database lag + - :py:meth:`get_replag`: estimates the external database lag - :py:meth:`namespace_id_to_name`: returns names associated with an NS id - :py:meth:`namespace_name_to_id`: returns the ID associated with a NS name - :py:meth:`get_page`: returns a Page for the given title @@ -668,8 +669,27 @@ class Site(object): for result in cur: yield result + def get_maxlag(self, showall=False): + """Return the internal database replication lag in seconds. + + In a typical setup, this function returns the replication lag *within* + the WMF's cluster, *not* external replication lag affecting the + Toolserver (see :py:meth:`get_replag` for that). This is useful when + combined with the ``maxlag`` API query param (added by config), in + which queries will be halted and retried if the lag is too high, + usually above five seconds. + """ + if showall: + result = self.api_query(action="query", meta="siteinfo", + siprop="dbrepllag", sishowalldb=1) + return [server["lag"] for server in result["query"]["dbrepllag"]] + else: + result = self.api_query(action="query", meta="siteinfo", + siprop="dbrepllag") + return result["query"]["dbrepllag"][0]["lag"] + def get_replag(self): - """Return the estimated database replication lag in seconds. + """Return the estimated external database replication lag in seconds. Requires SQL access. This function only makes sense on a replicated database (e.g. the Wikimedia Toolserver) and on a wiki that receives a @@ -776,7 +796,17 @@ class Site(object): def delegate(self, services, args=None, kwargs=None): """Delegate a task to either the API or SQL depending on conditions. - *services* should be a dictionary of @@TODO + *services* should be a dictionary in which the key is the service name + (:py:attr:`self.SERVICE_API ` or + :py:attr:`self.SERVICE_SQL `), and the value is the + function to call for this service. All functions will be passed the + same arguments the tuple *args* and the dict **kwargs**, which are both + empty by default. The service order is determined by + :py:meth:`_get_service_order`. + + Not every service needs an entry in the dictionary. Will raise + :py:exc:`~earwigbot.exceptions.NoServiceError` if an appropriate + service cannot be found. """ if not args: args = ()