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
|
from .shared import OcfCompletion
|
||||||
|
|
||||||
|
|
||||||
|
class WriteMode(IntEnum):
|
||||||
|
ZERO_PAD = 0
|
||||||
|
READ_MODIFY_WRITE = 1
|
||||||
|
|
||||||
|
|
||||||
class IoDir(IntEnum):
|
class IoDir(IntEnum):
|
||||||
READ = 0
|
READ = 0
|
||||||
WRITE = 1
|
WRITE = 1
|
||||||
@ -120,7 +125,7 @@ class Sync:
|
|||||||
self.io = io
|
self.io = io
|
||||||
|
|
||||||
def sync_submit(self, submit_method):
|
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")
|
raise Exception("completion callback is already set")
|
||||||
cmpl = OcfCompletion([("err", c_int)])
|
cmpl = OcfCompletion([("err", c_int)])
|
||||||
self.io.callback = cmpl.callback
|
self.io.callback = cmpl.callback
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#
|
#
|
||||||
# Copyright(c) 2019-2022 Intel Corporation
|
# Copyright(c) 2019-2022 Intel Corporation
|
||||||
|
# Copyright(c) 2024 Huawei Technologies
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
#
|
#
|
||||||
|
|
||||||
@ -24,16 +25,18 @@ from hashlib import md5
|
|||||||
import weakref
|
import weakref
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
import warnings
|
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 .queue import Queue
|
||||||
from .shared import OcfErrorCode, Uuid
|
from .shared import OcfErrorCode, Uuid
|
||||||
from ..ocf import OcfLib
|
from ..ocf import OcfLib
|
||||||
from ..utils import print_buffer, Size as S
|
from ..utils import print_buffer, Size as S
|
||||||
from .data import Data
|
from .data import Data, DataSeek
|
||||||
from .queue import Queue
|
from .queue import Queue
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class IoFlags(IntEnum):
|
class IoFlags(IntEnum):
|
||||||
FLUSH = 1
|
FLUSH = 1
|
||||||
|
|
||||||
@ -341,6 +344,66 @@ class Volume:
|
|||||||
)
|
)
|
||||||
return Io.from_pointer(io)
|
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):
|
class RamVolume(Volume):
|
||||||
props = None
|
props = None
|
||||||
|
@ -5,6 +5,9 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
from .volume_exp_obj import OcfInternalVolume
|
from .volume_exp_obj import OcfInternalVolume
|
||||||
|
from .queue import Queue
|
||||||
|
from .io import Sync, IoDir
|
||||||
|
from .data import Data
|
||||||
|
|
||||||
|
|
||||||
class CoreVolume(OcfInternalVolume):
|
class CoreVolume(OcfInternalVolume):
|
||||||
@ -18,3 +21,16 @@ class CoreVolume(OcfInternalVolume):
|
|||||||
|
|
||||||
def md5(self):
|
def md5(self):
|
||||||
return self._exp_obj_md5(4096)
|
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) 2019-2022 Intel Corporation
|
||||||
|
# Copyright(c) 2024 Huawei Technologies
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
#
|
#
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user