Skip to content

Commit b6b9802

Browse files
committed
fix: 把 Alist 的 session 丢到外面去,减少内存资源负担,修复日志路径问题
1 parent 47f1cf8 commit b6b9802

File tree

5 files changed

+57
-47
lines changed

5 files changed

+57
-47
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.0.17
1+
3.0.18

core/cluster.py

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,9 @@ async def _check_size(self, file: File, storage: storages.iStorage):
155155
async def _check_hash(self, file: File, storage: storages.iStorage):
156156
return await self._check_exists(file, storage) and utils.equals_hash(file.hash, await storage.read_file(file.hash))
157157

158-
async def get_file(self, hash: str):
158+
async def get_file(self, hash: str, use_master: bool = False):
159159
file = None
160-
if await self.available():
160+
if await self.available() and not use_master:
161161
storage = self.get_width_storage()
162162
if isinstance(storage, storages.LocalStorage) and await storage.exists(hash):
163163
return LocalStorageFile(
@@ -1051,6 +1051,9 @@ async def init():
10511051
)
10521052

10531053
async def unload():
1054+
for storage in clusters.storage_manager.storages:
1055+
if isinstance(storage, storages.AlistStorage):
1056+
await storage.close()
10541057
await clusters.stop()
10551058

10561059
def check_sign(hash: str, s: str, e: str):
@@ -1076,33 +1079,34 @@ async def _(request: aweb.Request):
10761079
if not check_sign(f"/measure/{size}", s, e):
10771080
return aweb.Response(status=403)
10781081
cluster_id = get_cluster_id_from_sign(f"/measure/{size}", s, e)
1079-
if not config.const.measure_storage:
1080-
response = aweb.StreamResponse(
1081-
status=200,
1082-
reason="OK",
1083-
headers={
1084-
"Content-Length": str(size * 1024 * 1024),
1085-
"Content-Type": "application/octet-stream",
1086-
},
1087-
)
1088-
await response.prepare(request)
1089-
for _ in range(size):
1090-
await response.write(MEASURE_BUFFER * 1024 * 1024)
1091-
await response.write_eof()
1092-
return response
1093-
else:
1082+
if config.const.measure_storage:
10941083
init_measure_block(size)
10951084
await init_measure_files()
10961085
storage = clusters.storage_manager.storages[0]
10971086
if isinstance(storage, storages.AlistStorage):
10981087
url = await storage.get_url(MEASURES_HASH[size])
10991088
logger.debug("Requested measure url:", url)
1100-
return aweb.HTTPFound(url)
1089+
if url:
1090+
return aweb.HTTPFound(url)
11011091
elif isinstance(storage, storages.LocalStorage):
11021092
return aweb.FileResponse(
11031093
Path(storage.get_path(MEASURES_HASH[size]))
11041094
)
1105-
return aweb.Response(status=400)
1095+
if config.const.measure_storage:
1096+
logger.twarning("cluster.warning.measure_storage")
1097+
response = aweb.StreamResponse(
1098+
status=200,
1099+
reason="OK",
1100+
headers={
1101+
"Content-Length": str(size * 1024 * 1024),
1102+
"Content-Type": "application/octet-stream",
1103+
},
1104+
)
1105+
await response.prepare(request)
1106+
for _ in range(size):
1107+
await response.write(MEASURE_BUFFER * 1024 * 1024)
1108+
await response.write_eof()
1109+
return response
11061110

11071111

11081112
"""return aweb.HTTPFound(
@@ -1138,8 +1142,11 @@ async def _(request: aweb.Request):
11381142
user_agent
11391143
)
11401144
return aweb.Response(status=403)
1141-
1142-
file = await clusters.storage_manager.get_file(hash)
1145+
try:
1146+
file = await clusters.storage_manager.get_file(hash)
1147+
except:
1148+
logger.ttraceback("cluster.error.get_file", hash=hash)
1149+
file = await clusters.storage_manager.get_file(hash, True)
11431150
if file is None:
11441151
db.add_response(
11451152
address,

core/logger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
_logger = Logger.opt(depth=2)
1111
_logger.remove()
1212
_logger.add(
13-
f".{LOGGER_DIR}/{{time:YYYY-MM-DD}}.log",
13+
f"{LOGGER_DIR}/{{time:YYYY-MM-DD}}.log",
1414
format=LOGGER_FORMAT,
1515
retention="90 days",
1616
encoding="utf-8",

core/storages/__init__.py

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,9 @@ def __init__(self, path: str, width: int, url: str, username: Optional[str], pas
228228
logger.tinfo("storage.info.alist.link_cache", raw=link_cache_expires, time=units.format_count_datetime(self.link_cache_timeout))
229229
else:
230230
logger.tinfo("storage.info.alist.link_cache", raw=link_cache_expires, time="disabled")
231+
self.session = aiohttp.ClientSession(
232+
self.url
233+
)
231234

232235
async def _get_token(self):
233236
await self.wait_token.wait()
@@ -281,34 +284,32 @@ async def _action_data(self, action: str, url: str, data: Any, headers: dict[str
281284
hash = hashlib.sha256(f"{action},{url},{data},{headers}".encode()).hexdigest()
282285
if hash in self.cache:
283286
return self.cache.get(hash)
284-
async with aiohttp.ClientSession(
285-
self.url,
287+
session = self.session
288+
async with session.request(
289+
action, url,
290+
data=data,
286291
headers={
287292
**headers,
288293
**{
289294
"Authorization": await self._get_token()
290295
}
291296
}
292-
) as session:
293-
async with session.request(
294-
action, url,
295-
data=data,
296-
) as resp:
297-
try:
298-
result = AlistResult(
299-
**await resp.json()
300-
)
301-
if result.code != 200:
302-
logger.terror("storage.error.action_alist", method=action, url=url, status=result.code, message=result.message)
303-
logger.debug(data)
304-
logger.debug(result)
305-
else:
306-
self.cache.set(hash, result, 30)
307-
return result
308-
except:
309-
logger.terror("storage.error.alist", status=resp.status, message=await resp.text())
310-
raise
311-
297+
) as resp:
298+
try:
299+
result = AlistResult(
300+
**await resp.json()
301+
)
302+
if result.code != 200:
303+
logger.terror("storage.error.action_alist", method=action, url=url, status=result.code, message=result.message)
304+
logger.debug(data)
305+
logger.debug(result)
306+
else:
307+
self.cache.set(hash, result, 30)
308+
return result
309+
except:
310+
logger.terror("storage.error.alist", status=resp.status, message=await resp.text())
311+
raise
312+
312313
async def __info_file(self, file_hash: str) -> AlistFileInfo:
313314
r = await self._action_data(
314315
"post",
@@ -450,4 +451,5 @@ async def write_file(self, file: File, content: bytes, mtime: float | None) -> b
450451
)
451452
return result.code == 200
452453

453-
454+
async def close(self):
455+
await self.session.close()

i18n/zh_cn.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,6 @@
4848
"database.error.write": "数据库写入出错,原因:",
4949
"cluster.info.enable.measure_storage": "已开启 存储 测速",
5050
"cluster.error.init_measure_file": "无法初始化 测速文件,存储 [${path} (${type})] 大小 [${size}] 哈希 [${hash}]",
51-
"storage.info.alist.link_cache": "Alist 存储 [${url}] [${path}] 链接缓存状态 [${time} (${raw})]"
51+
"storage.info.alist.link_cache": "Alist 存储 [${url}] [${path}] 链接缓存状态 [${time} (${raw})]",
52+
"cluster.error.get_file": "获取文件 ${hash} 出错,原因:"
5253
}

0 commit comments

Comments
 (0)