Skip to content

Commit 496ea9f

Browse files
author
Carter Li
committed
test: wait for block device I/O readiness in integration tests
Signed-off-by: Carter Li <carter.li@suse.com>
1 parent 7461df3 commit 496ea9f

2 files changed

Lines changed: 33 additions & 9 deletions

File tree

integration/common/core.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ def restore_with_frontend(url, engine_name, backup):
387387
client.volume_frontend_start(FRONTEND_TGT_BLOCKDEV)
388388
v = client.volume_get()
389389
assert v.frontendState == "up"
390+
get_blockdev(v.name)
390391
return
391392

392393

@@ -515,6 +516,9 @@ def snapshot_revert_with_frontend(url, engine_name, name):
515516
client.volume_frontend_shutdown()
516517
cmd.snapshot_revert(url, name)
517518
client.volume_frontend_start(FRONTEND_TGT_BLOCKDEV)
519+
v = client.volume_get()
520+
assert v.frontendState == "up"
521+
get_blockdev(v.name)
518522

519523

520524
def cleanup_replica_dir(dir=""):
@@ -547,10 +551,13 @@ def open_replica(grpc_client, size=SIZE):
547551

548552
def get_blockdev(volume):
549553
dev = blockdev(volume)
550-
for i in range(10):
551-
if not dev.ready():
552-
time.sleep(1)
553-
assert dev.ready()
554+
ready = False
555+
for _ in range(RETRY_COUNTS):
556+
ready = dev.ready()
557+
if ready:
558+
break
559+
time.sleep(RETRY_INTERVAL)
560+
assert ready
554561
return dev
555562

556563

@@ -754,6 +761,9 @@ def expand_volume_with_frontend(grpc_controller_client, size): # NOQA
754761
grpc_controller_client.volume_expand(size)
755762
wait_for_volume_expansion(grpc_controller_client, size)
756763
grpc_controller_client.volume_frontend_start(FRONTEND_TGT_BLOCKDEV)
764+
v = grpc_controller_client.volume_get()
765+
assert v.frontendState == "up"
766+
get_blockdev(v.name)
757767

758768

759769
def wait_for_volume_expansion(grpc_controller_client, size): # NOQA

integration/common/frontend.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import errno
12
import os
23
from os import path
34
import stat
@@ -85,9 +86,22 @@ def writeat(self, offset, data):
8586
return writeat_direct(self.dev, offset, data)
8687

8788
def ready(self):
88-
if not os.path.exists(self.dev):
89-
return False
90-
mode = os.stat(self.dev).st_mode
91-
if not stat.S_ISBLK(mode):
92-
return False
89+
fd = None
90+
try:
91+
st = os.stat(self.dev)
92+
if not stat.S_ISBLK(st.st_mode):
93+
return False
94+
# The block device node can exist before the underlying iSCSI
95+
# device is able to service I/O. Probe it with a non-blocking
96+
# open + small read so we only report ready once it truly works.
97+
fd = os.open(self.dev, os.O_RDONLY | os.O_NONBLOCK)
98+
os.pread(fd, PAGE_SIZE, 0)
99+
except OSError as e:
100+
if e.errno in (errno.ENXIO, errno.ENODEV, errno.ENOENT, errno.EIO,
101+
errno.EAGAIN, errno.EWOULDBLOCK, errno.EBUSY):
102+
return False
103+
raise
104+
finally:
105+
if fd is not None:
106+
os.close(fd)
93107
return True

0 commit comments

Comments
 (0)