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:
Michal Mielewczyk 2024-09-10 14:56:54 +02:00
parent f75ad04ec7
commit 97477d484f
4 changed files with 88 additions and 3 deletions

View File

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

View File

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

View File

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

View File

@ -1,5 +1,6 @@
#
# Copyright(c) 2019-2022 Intel Corporation
# Copyright(c) 2024 Huawei Technologies
# SPDX-License-Identifier: BSD-3-Clause
#