pyocf: Helpers for sync IOs for Volume
Signed-off-by: Sara Merzel <sara.merzel@huawei.com> Signed-off-by: Roel Apfelbaum <roel.apfelbaum@huawei.com> Signed-off-by: Michal Mielewczyk <michal.mielewczyk@huawei.com>
This commit is contained in:
parent
f75ad04ec7
commit
97477d484f
@ -22,6 +22,11 @@ from .data import Data
|
||||
from .shared import OcfCompletion
|
||||
|
||||
|
||||
class WriteMode(IntEnum):
|
||||
ZERO_PAD = 0
|
||||
READ_MODIFY_WRITE = 1
|
||||
|
||||
|
||||
class IoDir(IntEnum):
|
||||
READ = 0
|
||||
WRITE = 1
|
||||
@ -120,7 +125,7 @@ class Sync:
|
||||
self.io = io
|
||||
|
||||
def sync_submit(self, submit_method):
|
||||
if getattr(self.io, 'callback', None):
|
||||
if getattr(self.io, "callback", None):
|
||||
raise Exception("completion callback is already set")
|
||||
cmpl = OcfCompletion([("err", c_int)])
|
||||
self.io.callback = cmpl.callback
|
||||
|
@ -1,5 +1,6 @@
|
||||
#
|
||||
# Copyright(c) 2019-2022 Intel Corporation
|
||||
# Copyright(c) 2024 Huawei Technologies
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
|
||||
@ -24,16 +25,18 @@ from hashlib import md5
|
||||
import weakref
|
||||
from enum import IntEnum
|
||||
import warnings
|
||||
from typing import Union
|
||||
|
||||
from .io import Io, IoOps, IoDir
|
||||
from .io import Io, IoOps, IoDir, WriteMode, Sync
|
||||
from .queue import Queue
|
||||
from .shared import OcfErrorCode, Uuid
|
||||
from ..ocf import OcfLib
|
||||
from ..utils import print_buffer, Size as S
|
||||
from .data import Data
|
||||
from .data import Data, DataSeek
|
||||
from .queue import Queue
|
||||
|
||||
|
||||
|
||||
class IoFlags(IntEnum):
|
||||
FLUSH = 1
|
||||
|
||||
@ -341,6 +344,66 @@ class Volume:
|
||||
)
|
||||
return Io.from_pointer(io)
|
||||
|
||||
def sync_io(
|
||||
self,
|
||||
queue,
|
||||
address: int,
|
||||
data: Data,
|
||||
direction: IoDir,
|
||||
io_class=0,
|
||||
flags=0,
|
||||
submit_func=Sync.submit,
|
||||
):
|
||||
assert address % 512 == 0
|
||||
assert data.size % 512 == 0
|
||||
|
||||
io = self.new_io(queue, address, data.size, direction, io_class, flags)
|
||||
io.set_data(data)
|
||||
completion = submit_func(Sync(io))
|
||||
|
||||
assert int(completion.results["err"]) == 0
|
||||
|
||||
def write_sync_4k(
|
||||
self,
|
||||
queue: Queue,
|
||||
address: int,
|
||||
data: Union[bytes, Data],
|
||||
mode: WriteMode,
|
||||
io_class=0,
|
||||
flags=0,
|
||||
):
|
||||
if mode not in list(WriteMode):
|
||||
raise ValueError(f"illegal write mode: {mode}")
|
||||
|
||||
size = len(data)
|
||||
|
||||
address_4k = (address // 4096) * 4096
|
||||
|
||||
end_address_4k = ((address + size + 4095) // 4096) * 4096
|
||||
size_4k = end_address_4k - address_4k
|
||||
|
||||
write_data = Data(size_4k)
|
||||
|
||||
if mode == WriteMode.ZERO_PAD:
|
||||
write_data.zero(size_4k)
|
||||
elif mode == WriteMode.READ_MODIFY_WRITE:
|
||||
self.sync_io(queue, address_4k, write_data, IoDir.READ)
|
||||
|
||||
write_data.seek(DataSeek.BEGIN, address - address_4k)
|
||||
write_data.write(data, size)
|
||||
|
||||
self.sync_io(queue, address_4k, write_data, IoDir.WRITE, io_class, flags)
|
||||
|
||||
def read_sync(self, queue: Queue, address: int, size: int, io_class=0, flags=0) -> bytes:
|
||||
read_data = Data(size)
|
||||
self.sync_io(queue, address, read_data, IoDir.READ, io_class, flags)
|
||||
|
||||
data = bytes(size)
|
||||
read_data.seek(DataSeek.BEGIN, 0)
|
||||
read_data.read(data, size)
|
||||
|
||||
return data
|
||||
|
||||
|
||||
class RamVolume(Volume):
|
||||
props = None
|
||||
|
@ -5,6 +5,9 @@
|
||||
#
|
||||
|
||||
from .volume_exp_obj import OcfInternalVolume
|
||||
from .queue import Queue
|
||||
from .io import Sync, IoDir
|
||||
from .data import Data
|
||||
|
||||
|
||||
class CoreVolume(OcfInternalVolume):
|
||||
@ -18,3 +21,16 @@ class CoreVolume(OcfInternalVolume):
|
||||
|
||||
def md5(self):
|
||||
return self._exp_obj_md5(4096)
|
||||
|
||||
def sync_io(
|
||||
self,
|
||||
queue: Queue,
|
||||
address: int,
|
||||
data: Data,
|
||||
direction: IoDir,
|
||||
io_class=0,
|
||||
flags=0,
|
||||
submit_func=Sync.submit,
|
||||
):
|
||||
super().sync_io(queue, address, data, direction, io_class, flags, submit_func)
|
||||
self.core.cache.settle()
|
||||
|
@ -1,5 +1,6 @@
|
||||
#
|
||||
# Copyright(c) 2019-2022 Intel Corporation
|
||||
# Copyright(c) 2024 Huawei Technologies
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user