Skip to content

Commit 396af5d

Browse files
Emantorjluebbe
authored andcommitted
remote/exporter: guard against repeated resource requests
Handle acquire/release calls for already acquired/released resources as errors by raising an exception and providing the reason to the coordinator. That also means that these calls will now return an error to the coordinator. Signed-off-by: Rouven Czerwinski <[email protected]>
1 parent 89bc444 commit 396af5d

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

labgrid/remote/exporter.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ class BrokenResourceError(ExporterError):
3737
pass
3838

3939

40+
class UnknownResourceError(ExporterError):
41+
pass
42+
43+
44+
class InvalidResourceRequestError(ExporterError):
45+
pass
46+
47+
4048
def log_subprocess_kernel_stack(logger, child):
4149
if child.poll() is not None: # nothing to check if no longer running
4250
return
@@ -889,8 +897,9 @@ async def message_pump(self):
889897
out_message.set_acquired_request.resource_name,
890898
)
891899
success = True
892-
except BrokenResourceError as e:
900+
except (BrokenResourceError, InvalidResourceRequestError, UnknownResourceError) as e:
893901
reason = e.args[0]
902+
logging.warning("set_acquired_request failed: %s", reason)
894903
finally:
895904
in_message = labgrid_coordinator_pb2.ExporterInMessage()
896905
in_message.response.success = success
@@ -924,8 +933,14 @@ async def message_pump(self):
924933
async def acquire(self, group_name, resource_name, place_name):
925934
resource = self.groups.get(group_name, {}).get(resource_name)
926935
if resource is None:
927-
logging.error("acquire request for unknown resource %s/%s by %s", group_name, resource_name, place_name)
928-
return
936+
raise UnknownResourceError(
937+
f"acquire request for unknown resource {group_name}/{resource_name} by {place_name}"
938+
)
939+
940+
if resource.acquired:
941+
raise InvalidResourceRequestError(
942+
f"Resource {group_name}/{resource_name} is already acquired by {resource.acquired}"
943+
)
929944

930945
try:
931946
resource.acquire(place_name)
@@ -935,8 +950,10 @@ async def acquire(self, group_name, resource_name, place_name):
935950
async def release(self, group_name, resource_name):
936951
resource = self.groups.get(group_name, {}).get(resource_name)
937952
if resource is None:
938-
logging.error("release request for unknown resource %s/%s", group_name, resource_name)
939-
return
953+
raise UnknownResourceError(f"release request for unknown resource {group_name}/{resource_name}")
954+
955+
if not resource.acquired:
956+
raise InvalidResourceRequestError(f"Resource {group_name}/{resource_name} is not acquired")
940957

941958
try:
942959
resource.release()

0 commit comments

Comments
 (0)