mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 17:20:30 +08:00
refactoring
This commit is contained in:
parent
800da71670
commit
1564c68727
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import contextlib
|
import contextlib
|
||||||
|
import time
|
||||||
|
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
from typing import Type
|
from typing import Type
|
||||||
@ -36,6 +37,7 @@ from ...logging import get_logger
|
|||||||
from ...errors import OperationError
|
from ...errors import OperationError
|
||||||
from ...errors import IsBusyError
|
from ...errors import IsBusyError
|
||||||
|
|
||||||
|
from ... import aiotools
|
||||||
from ... import aiofs
|
from ... import aiofs
|
||||||
|
|
||||||
from .. import BasePlugin
|
from .. import BasePlugin
|
||||||
@ -187,8 +189,9 @@ class MsdImageReader:
|
|||||||
logger.exception("Can't close image reader")
|
logger.exception("Can't close image reader")
|
||||||
|
|
||||||
|
|
||||||
class MsdImageWriter:
|
class MsdImageWriter: # pylint: disable=too-many-instance-attributes
|
||||||
def __init__(self, path: str, size: int, sync: int) -> None:
|
def __init__(self, notifier: aiotools.AioNotifier, path: str, size: int, sync: int) -> None:
|
||||||
|
self.__notifier = notifier
|
||||||
self.__name = os.path.basename(path)
|
self.__name = os.path.basename(path)
|
||||||
self.__path = path
|
self.__path = path
|
||||||
self.__size = size
|
self.__size = size
|
||||||
@ -197,6 +200,7 @@ class MsdImageWriter:
|
|||||||
self.__file: Optional[aiofiles.base.AiofilesContextManager] = None
|
self.__file: Optional[aiofiles.base.AiofilesContextManager] = None
|
||||||
self.__written = 0
|
self.__written = 0
|
||||||
self.__unsynced = 0
|
self.__unsynced = 0
|
||||||
|
self.__tick = 0.0
|
||||||
|
|
||||||
def get_file(self) -> aiofiles.base.AiofilesContextManager:
|
def get_file(self) -> aiofiles.base.AiofilesContextManager:
|
||||||
assert self.__file is not None
|
assert self.__file is not None
|
||||||
@ -226,6 +230,11 @@ class MsdImageWriter:
|
|||||||
await aiofs.afile_sync(self.__file)
|
await aiofs.afile_sync(self.__file)
|
||||||
self.__unsynced = 0
|
self.__unsynced = 0
|
||||||
|
|
||||||
|
now = time.monotonic()
|
||||||
|
if self.__tick + 1 < now or self.__written == self.__size:
|
||||||
|
self.__tick = now
|
||||||
|
await self.__notifier.notify()
|
||||||
|
|
||||||
return self.__written
|
return self.__written
|
||||||
|
|
||||||
async def close(self) -> None:
|
async def close(self) -> None:
|
||||||
|
|||||||
@ -167,7 +167,6 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
|
|||||||
|
|
||||||
self.__reader: Optional[MsdImageReader] = None
|
self.__reader: Optional[MsdImageReader] = None
|
||||||
self.__writer: Optional[MsdImageWriter] = None
|
self.__writer: Optional[MsdImageWriter] = None
|
||||||
self.__writer_tick = 0.0
|
|
||||||
|
|
||||||
self.__notifier = aiotools.AioNotifier()
|
self.__notifier = aiotools.AioNotifier()
|
||||||
self.__state = _State(self.__notifier)
|
self.__state = _State(self.__notifier)
|
||||||
@ -377,7 +376,12 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
|
|||||||
await self.__remount_rw(True)
|
await self.__remount_rw(True)
|
||||||
self.__set_image_complete(name, False)
|
self.__set_image_complete(name, False)
|
||||||
|
|
||||||
self.__writer = await MsdImageWriter(path, size, self.__sync_chunk_size).open()
|
self.__writer = await MsdImageWriter(
|
||||||
|
notifier=self.__notifier,
|
||||||
|
path=path,
|
||||||
|
size=size,
|
||||||
|
sync=self.__sync_chunk_size,
|
||||||
|
).open()
|
||||||
|
|
||||||
await self.__notifier.notify()
|
await self.__notifier.notify()
|
||||||
yield self.__write_chunk_size
|
yield self.__write_chunk_size
|
||||||
@ -394,13 +398,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
|
|||||||
|
|
||||||
async def write_image_chunk(self, chunk: bytes) -> int:
|
async def write_image_chunk(self, chunk: bytes) -> int:
|
||||||
assert self.__writer
|
assert self.__writer
|
||||||
written = await self.__writer.write(chunk)
|
return (await self.__writer.write(chunk))
|
||||||
now = time.monotonic()
|
|
||||||
if self.__writer_tick + 1 < now:
|
|
||||||
# Это нужно для ручного оповещения о свободном пространстве на диске, см. get_state()
|
|
||||||
self.__writer_tick = now
|
|
||||||
await self.__notifier.notify()
|
|
||||||
return written
|
|
||||||
|
|
||||||
@aiotools.atomic
|
@aiotools.atomic
|
||||||
async def remove(self, name: str) -> None:
|
async def remove(self, name: str) -> None:
|
||||||
|
|||||||
@ -237,7 +237,12 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
|
|||||||
if self.__connected:
|
if self.__connected:
|
||||||
raise MsdConnectedError()
|
raise MsdConnectedError()
|
||||||
|
|
||||||
self.__device_writer = await MsdImageWriter(self.__device_info.path, size, self.__sync_chunk_size).open()
|
self.__device_writer = await MsdImageWriter(
|
||||||
|
notifier=self.__notifier,
|
||||||
|
path=self.__device_info.path,
|
||||||
|
size=size,
|
||||||
|
sync=self.__sync_chunk_size,
|
||||||
|
).open()
|
||||||
|
|
||||||
await self.__write_image_info(False)
|
await self.__write_image_info(False)
|
||||||
await self.__notifier.notify()
|
await self.__notifier.notify()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user