소스 검색

Improved service ordering that takes API lag into account.

tags/v0.1^2
Ben Kurtovic 12 년 전
부모
커밋
7b001ed50d
1개의 변경된 파일23개의 추가작업 그리고 9개의 파일을 삭제
  1. +23
    -9
      earwigbot/wiki/site.py

+ 23
- 9
earwigbot/wiki/site.py 파일 보기

@@ -128,6 +128,7 @@ class Site(object):
self._max_retries = 6 self._max_retries = 6
self._last_query_time = 0 self._last_query_time = 0
self._api_lock = Lock() self._api_lock = Lock()
self._api_info_cache = {"maxlag": 0, "lastcheck": 0}


# Attributes used for SQL queries: # Attributes used for SQL queries:
self._sql_data = sql self._sql_data = sql
@@ -531,21 +532,23 @@ class Site(object):
def _get_service_order(self): def _get_service_order(self):
"""Return a preferred order for using services (e.g. the API and SQL). """Return a preferred order for using services (e.g. the API and SQL).


A list is returned, starting with the preferred service first and
A list is returned, starting with the most preferred service first and
ending with the least preferred one. Currently, there are only two ending with the least preferred one. Currently, there are only two
services. SERVICE_API will always be included since the API is expected services. SERVICE_API will always be included since the API is expected
to be always usable. In normal circumstances, self.SERVICE_SQL will be to be always usable. In normal circumstances, self.SERVICE_SQL will be
first (with the API second), since using SQL directly is easier on the first (with the API second), since using SQL directly is easier on the
servers than making web queries with the API. self.SERVICE_SQL will be servers than making web queries with the API. self.SERVICE_SQL will be
second if replag is greater than ten minutes (a cached value updated
every five minutes at most). self.SERVICE_SQL will not be included in
the list if we cannot form a proper SQL connection.
second if replag is greater than three minutes (a cached value updated
every two minutes at most), *unless* API lag is also very high.
self.SERVICE_SQL will not be included in the list if we cannot form a
proper SQL connection.
""" """
if time() - self._sql_info_cache["lastcheck"] > 300:
self._sql_info_cache["lastcheck"] = time()
now = time()
if now - self._sql_info_cache["lastcheck"] > 120:
self._sql_info_cache["lastcheck"] = now
try: try:
self._sql_info_cache["replag"] = self.get_replag()
except exceptions.SQLError, oursql.Error:
self._sql_info_cache["replag"] = sqllag = self.get_replag()
except (exceptions.SQLError, oursql.Error):
self._sql_info_cache["usable"] = False self._sql_info_cache["usable"] = False
return [self.SERVICE_API] return [self.SERVICE_API]
self._sql_info_cache["usable"] = True self._sql_info_cache["usable"] = True
@@ -553,8 +556,19 @@ class Site(object):
if not self._sql_info_cache["usable"]: if not self._sql_info_cache["usable"]:
return [self.SERVICE_API] return [self.SERVICE_API]


if self._sql_info_cache["replag"] > 600:
if sqllag > 180:
if not self._maxlag:
return [self.SERVICE_API, self.SERVICE_SQL]
if now - self._api_info_cache["lastcheck"] > 120:
self._api_info_cache["lastcheck"] = now
try:
self._api_info_cache["maxlag"] = apilag = self.get_maxlag()
except exceptions.APIError:
self._api_info_cache["maxlag"] = apilag = 0
if sqllag / (180.0 / self._maxlag) < apilag:
return [self.SERVICE_SQL, self.SERVICE_API]
return [self.SERVICE_API, self.SERVICE_SQL] return [self.SERVICE_API, self.SERVICE_SQL]

return [self.SERVICE_SQL, self.SERVICE_API] return [self.SERVICE_SQL, self.SERVICE_API]


@property @property


불러오는 중...
취소
저장