2021-10-22 20:56:34

by Anna Schumaker

[permalink] [raw]
Subject: [PATCH v4 7/9] rpcsys: Add a command for changing xprt state

From: Anna Schumaker <[email protected]>

We can set it offline or online, or we can remove an xprt. The kernel
only supports removing offlined transports, so we make sure to set the
state to "offline" before sending the remove command.

Signed-off-by: Anna Schumaker <[email protected]>
---
tools/rpcsys/xprt.py | 29 +++++++++++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/tools/rpcsys/xprt.py b/tools/rpcsys/xprt.py
index 2160cb0a9575..9426c99dae2b 100644
--- a/tools/rpcsys/xprt.py
+++ b/tools/rpcsys/xprt.py
@@ -8,15 +8,18 @@ class Xprt:
self.type = str(path).rsplit("-", 2)[2]
self.dstaddr = open(path / "dstaddr", 'r').readline().strip()
self.srcaddr = open(path / "srcaddr", 'r').readline().strip()
+ self.exists = True

- with open(path / "xprt_state") as f:
- self.state = ','.join(f.readline().split()[1:])
+ self.read_state()
self.__dict__.update(sysfs.read_info_file(path / "xprt_info"))

def __lt__(self, rhs):
return self.id < rhs.id

def __str__(self):
+ if not self.exists:
+ return "xprt %s: has been removed" % self.id
+
state = self.state
if self.main_xprt:
state = "MAIN," + self.state
@@ -31,6 +34,13 @@ class Xprt:
(self.binding_q_len, self.sending_q_len, self.pending_q_len, self.backlog_q_len, self.tasks_queuelen)
return line

+ def read_state(self):
+ if not self.path.exists():
+ self.exists = False
+ return
+ with open(self.path / "xprt_state") as f:
+ self.state = ','.join(f.readline().split()[1:])
+
def small_str(self):
return "xprt %s: %s, %s%s" % (self.id, self.type, self.dstaddr,
f" [main]" if self.main_xprt else "" )
@@ -41,6 +51,11 @@ class Xprt:
f.write(resolved)
self.dstaddr = open(self.path / "dstaddr", 'r').readline().strip()

+ def set_state(self, state):
+ with open(self.path / "xprt_state", 'w') as f:
+ f.write(state)
+ self.read_state()
+

def list_xprts(args):
xprts = [ Xprt(f) for f in (sysfs.SUNRPC / "xprt-switches").glob("**/xprt-*") ]
@@ -60,6 +75,13 @@ def set_xprt_property(args):
try:
if args.dstaddr != None:
xprt.set_dstaddr(args.dstaddr[0])
+ if args.offline:
+ xprt.set_state("offline")
+ elif args.online:
+ xprt.set_state("online")
+ elif args.remove:
+ xprt.set_state("offline")
+ xprt.set_state("remove")
print(xprt)
except Exception as e:
print(e)
@@ -73,4 +95,7 @@ def add_command(subparser):
parser = subparser.add_parser("set", help="Set an xprt property")
parser.add_argument("--id", metavar="ID", nargs=1, type=int, required=True, help="Id of a specific xprt to modify")
parser.add_argument("--dstaddr", metavar="dstaddr", nargs=1, type=str, help="New dstaddr to set")
+ parser.add_argument("--offline", action="store_true", help="Set an xprt offline")
+ parser.add_argument("--online", action="store_true", help="Set an offline xprt back online")
+ parser.add_argument("--remove", action="store_true", help="Remove an xprt")
parser.set_defaults(func=set_xprt_property)
--
2.33.1