Skip to content

Commit a45f3b8

Browse files
authored
plan9: Merge pull request #1332 from svinota/p11-plan9-call-improvements
plan9 call improvements Bug-Url: #1332
2 parents 6c57f3b + d4d52bd commit a45f3b8

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

pyroute2/fixtures/plan9.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import time
12
from collections.abc import AsyncGenerator
23
from socket import socketpair
34

@@ -7,6 +8,10 @@
78
from pyroute2.plan9.server import Plan9ServerSocket
89

910

11+
def test_time():
12+
return time.time_ns()
13+
14+
1015
class AsyncPlan9Context:
1116

1217
server = None
@@ -19,8 +24,11 @@ def __init__(self):
1924
self.server = Plan9ServerSocket(use_socket=self.server_sock)
2025
self.client = Plan9ClientSocket(use_socket=self.client_sock)
2126
self._task = None
22-
inode = self.server.filesystem.create('test_file')
23-
inode.data.write(self.sample_data)
27+
with self.server.filesystem.create('test_file') as i:
28+
i.data.write(self.sample_data)
29+
with self.server.filesystem.create('test_time') as i:
30+
i.metadata.call_on_read = True
31+
i.register_function(test_time, loader=lambda x: {})
2432

2533
async def ensure_session(self):
2634
self._task = await self.server.async_run()

pyroute2/plan9/filesystem.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
import os
55
import pwd
66
import time
7+
from dataclasses import dataclass
78
from functools import partial
89

910
from pyroute2.plan9 import Plan9Exit, Qid, Stat, Tcall, Tread, Twrite
1011

1112

1213
def _publish_function_w(session, inode, request, response):
13-
inode.metadata['dirty'] = True
14+
inode.metadata.dirty = True
1415
inode.data.seek(0)
1516
inode.data.truncate()
1617
inode.data.write(request['data'])
@@ -21,11 +22,11 @@ def _publish_function_w(session, inode, request, response):
2122
def _publish_function_r(
2223
func, loader, dumper, session, inode, request, response
2324
):
24-
if request['offset'] == 0 and inode.metadata.get('dirty'):
25+
if request['offset'] == 0 and inode.metadata.has_new_data():
2526
try:
2627
kwarg = loader(inode.data.getvalue())
2728
ret = func(**kwarg)
28-
inode.metadata['dirty'] = False
29+
inode.metadata.dirty = False
2930
except Plan9Exit:
3031
raise
3132
except Exception as e:
@@ -62,6 +63,15 @@ def _publish_function_c(
6263
return response
6364

6465

66+
@dataclass
67+
class InodeMetadata:
68+
call_on_read: bool = False
69+
dirty: bool = False
70+
71+
def has_new_data(self) -> bool:
72+
return self.dirty or self.call_on_read
73+
74+
6575
class Inode:
6676
children = None
6777
parents = None
@@ -86,7 +96,7 @@ def __init__(
8696
self.parents = parents if parents is not None else set()
8797
self.children = children if children is not None else set()
8898
self.callbacks = {}
89-
self.metadata = {}
99+
self.metadata = InodeMetadata()
90100
self.stat = Stat()
91101
self.qid = Qid(qtype, 0, path)
92102
self.stat['uid'] = (
@@ -108,6 +118,12 @@ def __init__(
108118
self.stat['name'] = name
109119
self.sync()
110120

121+
def __enter__(self):
122+
return self
123+
124+
def __exit__(self, exc_type, exc_value, traceback):
125+
pass
126+
111127
def sync(self):
112128
self.stat['length'] = len(self.data.getvalue())
113129

tests/test_core/test_plan9/test_basic.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import time
2+
13
import pytest
24

35

@@ -8,6 +10,17 @@ async def test_server_data_read(async_p9_context):
810
assert response['data'] == async_p9_context.sample_data
911

1012

13+
@pytest.mark.asyncio
14+
async def test_server_time_read(async_p9_context):
15+
ts = time.time_ns()
16+
fid = await async_p9_context.client.fid('test_time')
17+
responses = [await async_p9_context.client.read(fid) for _ in range(5)]
18+
times = {int(x['data'].decode('utf-8')) for x in responses}
19+
assert len(times) == 5
20+
assert min(times) > ts
21+
assert max(times) < time.time_ns()
22+
23+
1124
@pytest.mark.asyncio
1225
async def test_server_data_write(async_p9_context):
1326
new_sample = b'aevei3PhaeGeiseh'

0 commit comments

Comments
 (0)