refactoring

This commit is contained in:
Maxim Devaev 2022-07-24 15:42:43 +03:00
parent 800da71670
commit 1564c68727
3 changed files with 24 additions and 12 deletions

View File

@ -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:

View File

@ -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:

View File

@ -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()