Skip to content

Commit ce4c71c

Browse files
committed
chore: 修复初始化重定向存储时候需要很久时间
1 parent 8254e74 commit ce4c71c

File tree

11 files changed

+974
-867
lines changed

11 files changed

+974
-867
lines changed

assets/js/index.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,7 +1402,7 @@ async function load() {
14021402
var server_time = $dashboard_locals.info_runtime
14031403
// return int((t - ((t + UTC) % 86400) - 86400 * day) / 3600)
14041404
var datetime = server_time.current_time - server_time.diff / 1000.0 + (+new Date() - server_time.resp_timestamp) / 1000.0;
1405-
const previous = (datetime + ((datetime + UTC_OFFSET) % 86400) - 86400 * 30);
1405+
const previous = (datetime - ((datetime + UTC_OFFSET) % 86400) - 86400 * 29);
14061406
const res = {}
14071407
for (let i = 0; i < 30; i++) {
14081408
var d = Tools.formatDate(new Date((previous + i * 86400) * 1000.0))
@@ -1504,7 +1504,6 @@ async function load() {
15041504
)
15051505
}
15061506
$dashboard_locals[`${locals_info_key}s_info`] = info.child(2).minWidth(1280)
1507-
console.log(info)
15081507
}
15091508

15101509
var statistics = createElement("div").append(
@@ -1668,6 +1667,7 @@ async function load() {
16681667

16691668
$dashboard_locals.system_info_connection.value = Tools.formatSimpleNumber(0)
16701669
$dashboard_locals.system_info_cpu.value = Tools.formatSimpleNumber(0)
1670+
$dashboard_locals.system_info_cpu_load.value = "0.0%"
16711671
$dashboard_locals.system_info_memory.value = Tools.formatBytes(0)
16721672

16731673
}
@@ -1855,12 +1855,13 @@ async function load() {
18551855
$container.style("height", "auto")
18561856
var container = calcElementHeight($container)
18571857
var height = Math.max(height, container)
1858-
$container.style("height", `${height}px`)
1858+
//$container.style("height", `${height}px`)
18591859
$menu.style("top", `${header}px`)
18601860
$main.style("margin-top", `${header}px`)
18611861
$main.styleProperty("--height", `${header}px`)
18621862
});
18631863
observer.observe($app.origin, { childList: true, subtree: true });
1864+
observer.observe($container.origin, { childList: true, subtree: true });
18641865

18651866
$router.init()
18661867

core/cluster.py

Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,15 @@ async def _check_available(self):
8989
logger.debug(f"Available storages: {len(self.available_storages)}")
9090
if len(self.available_storages) > 0:
9191
self.check_available.release()
92+
await clusters.enable()
9293
else:
9394
self.check_available.acquire()
94-
logger.twarning("storage.warning.unavailable", storages=len(self.storages))
95+
logger.twarning("storage.warning.storage.unavailable", storages=len(self.storages))
96+
if any((
97+
cluster.enabled for cluster in clusters.clusters
98+
)):
99+
logger.twarning("storage.warning.storage.unavailable.for.clusters")
100+
await clusters.disable()
95101

96102
async def __check_available(self, storage: storages.iStorage):
97103
file = MeasureFile(
@@ -183,14 +189,14 @@ async def _check_exists(self, file: File, storage: storages.iStorage):
183189
if storage in self.cache_filelist:
184190
file_hash = file.hash
185191
return file_hash in self.cache_filelist[storage]
186-
return await storage.exists(convert_file_to_storage_file(file))
192+
return False #await storage.exists(convert_file_to_storage_file(file))
187193
async def _check_size(self, file: File, storage: storages.iStorage):
188194
if storage in self.cache_filelist:
189195
file_hash = file.hash
190196
return file_hash in self.cache_filelist[storage] and self.cache_filelist[storage][file_hash].size == file.size
191-
return await self._check_exists(file, storage) and await storage.get_size(convert_file_to_storage_file(file)) == file.size
197+
return False #await self._check_exists(file, storage) and await storage.get_size(convert_file_to_storage_file(file)) == file.size
192198
async def _check_hash(self, file: File, storage: storages.iStorage):
193-
return await self._check_exists(file, storage) and utils.equals_hash(file.hash, (await storage.read_file(convert_file_to_storage_file(file))).getvalue())
199+
return False #await self._check_exists(file, storage) and utils.equals_hash(file.hash, (await storage.read_file(convert_file_to_storage_file(file))).getvalue())
194200

195201
async def get_file(self, hash: str, use_master: bool = False):
196202
file = None
@@ -268,6 +274,15 @@ async def get_file(self, hash: str, use_master: bool = False):
268274
if got_hash == hash:
269275
break
270276
logger.terror("cluster.error.download_hash", got_hash=got_hash, hash=hash, content=body.decode("utf-8", "ignore")[:64])
277+
if got_hash == hash:
278+
scheduler.run_later(
279+
self.write_file,
280+
1,
281+
(
282+
file,
283+
body
284+
)
285+
)
271286
return file
272287

273288
def get_width_storage(self, c_storage: Optional[storages.iStorage] = None) -> storages.iStorage:
@@ -618,6 +633,7 @@ def __init__(self):
618633
self.file_manager = FileListManager(self)
619634
self.storage_manager = StorageManager(self)
620635
self.clusters_certificate: dict[str, ClusterCertificate] = {}
636+
self.initialized = False
621637

622638
def add_cluster(self, cluster: 'Cluster'):
623639
self.cluster_id_tables[cluster.id] = cluster
@@ -644,11 +660,27 @@ async def start(self):
644660
# check files
645661
await self.file_manager.sync()
646662

663+
# init measure
664+
await init_measure()
665+
647666
# start job
648667

668+
self.initialized = True
669+
await self.enable()
670+
671+
async def enable(self):
672+
if not self.initialized:
673+
return
649674
for cluster in self.clusters:
650675
await cluster.enable()
651676

677+
async def disable(self):
678+
await asyncio.gather(*(
679+
cluster.disable()
680+
for cluster in self.clusters
681+
))
682+
683+
652684
def get_cluster_by_id(self, id: Optional[str] = None) -> Optional['Cluster']:
653685
return self.cluster_id_tables.get(id or "", None)
654686

@@ -798,7 +830,8 @@ async def request_cert(self):
798830
key.write(result.ack["key"])
799831

800832
async def enable(self):
801-
cert = await clusters.get_certificates(self.id)
833+
if self.enabled:
834+
return
802835
scheduler.cancel(self.delay_enable_task)
803836
if self.want_enable:
804837
return
@@ -1065,6 +1098,9 @@ def __init__(self, hash: str, size: int, mtime: float, data: bytes, storage: Opt
10651098
MEASURES_HASH: dict[int, str] = {
10661099
}
10671100
MEASURE_BUFFER: bytes = b'\x00'
1101+
DEFAULT_MEASURES = [
1102+
10
1103+
]
10681104

10691105
routes = web.routes
10701106
aweb = web.web
@@ -1081,9 +1117,10 @@ def convert_file_to_storage_file(file: File) -> SFile:
10811117
def init_measure_block(size: int):
10821118
MEASURES_HASH[size] = hashlib.md5(MEASURE_BUFFER * 1024 * 1024 * size).hexdigest()
10831119

1084-
async def init_measure(maxsize: int = 50):
1085-
for i in range(1, maxsize, 10):
1086-
init_measure_block(i)
1120+
async def init_measure():
1121+
for size in DEFAULT_MEASURES:
1122+
init_measure_block(size)
1123+
await init_measure_files()
10871124

10881125
async def init_measure_file(
10891126
storage: storages.iStorage,
@@ -1107,7 +1144,8 @@ async def init_measure_file(
11071144
logger.ttraceback("cluster.error.init_measure_file", path=storage.path, type=storage.type, size=units.format_bytes(size * 1024 * 1024), hash=hash)
11081145
return False
11091146
async def init_measure_files():
1110-
results = await asyncio.gather(*[init_measure_file(storage, size, MEASURES_HASH[size]) for storage in clusters.storage_manager.storages for size in MEASURES_HASH])
1147+
await clusters.storage_manager.available()
1148+
results = await asyncio.gather(*[asyncio.create_task(init_measure_file(storage, size, MEASURES_HASH[size])) for storage in clusters.storage_manager.available_storages for size in MEASURES_HASH])
11111149
logger.debug(results)
11121150

11131151
async def init():
@@ -1226,7 +1264,11 @@ async def _(request: aweb.Request):
12261264
except:
12271265
logger.traceback()
12281266
return aweb.Response(status=400)
1229-
1267+
1268+
@utils.retry(3, 1)
1269+
async def get_file(hash: str):
1270+
return await asyncio.wait_for(asyncio.create_task(clusters.storage_manager.get_file(hash)), 5)
1271+
12301272
@routes.get("/download/{hash}")
12311273
async def _(request: aweb.Request):
12321274
try:
@@ -1255,7 +1297,7 @@ async def _(request: aweb.Request):
12551297
)
12561298
return aweb.Response(status=403)
12571299
try:
1258-
file = await asyncio.wait_for(asyncio.create_task(clusters.storage_manager.get_file(hash)), 5)
1300+
file = await asyncio.create_task(get_file(hash))
12591301
except:
12601302
logger.ttraceback("cluster.error.get_file", hash=hash)
12611303
file = await asyncio.create_task(clusters.storage_manager.get_file(hash, True))

core/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def web_sockets(self):
185185

186186
const = Const()
187187

188-
VERSION = "3.3.15"
188+
VERSION = "3.3.16"
189189
API_VERSION = "1.13.1"
190190
USER_AGENT = f"openbmclapi/{API_VERSION} python-openbmclapi/{VERSION}"
191191
PYTHON_VERSION = ".".join(map(str, (sys.version_info.major, sys.version_info.minor, sys.version_info.micro)))

0 commit comments

Comments
 (0)