diff mbox series

[v2,7/9] nfs-sysfs.py: Add a command for changing xprt state

Message ID 20210806201739.472806-8-Anna.Schumaker@Netapp.com (mailing list archive)
State New, archived
Headers show
Series Add a tool for using the new sysfs files | expand

Commit Message

Anna Schumaker Aug. 6, 2021, 8:17 p.m. UTC
From: Anna Schumaker <Anna.Schumaker@Netapp.com>

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 <Anna.Schumaker@Netapp.com>
---
 tools/nfs-sysfs/xprt.py | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

Comments

Mora, Jorge Aug. 17, 2021, 5 p.m. UTC | #1
Hello Anna,

Comments are inline:

--Jorge

On 8/6/21, 2:17 PM, "Anna Schumaker on behalf of schumaker.anna@gmail.com" <schumakeranna@gmail.com on behalf of schumaker.anna@gmail.com> wrote:

    NetApp Security WARNING: This is an external email. Do not click links or open attachments unless you recognize the sender and know the content is safe.




    From: Anna Schumaker <Anna.Schumaker@Netapp.com>

    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 <Anna.Schumaker@Netapp.com>
    ---
     tools/nfs-sysfs/xprt.py | 29 +++++++++++++++++++++++++++--
     1 file changed, 27 insertions(+), 2 deletions(-)

    diff --git a/tools/nfs-sysfs/xprt.py b/tools/nfs-sysfs/xprt.py
    index 2160cb0a9575..92b83ebc4cd1 100644
    --- a/tools/nfs-sysfs/xprt.py
    +++ b/tools/nfs-sysfs/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):
JM: Do not compare with True or False just use boolean as is:
              if not self.exists:
    +        if self.exists == False:
    +            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])
JM: Do not compare with True:
              if args.offline:
              elif args.online:
              elif args.remove:
    +        if args.offline == True:
    +            xprt.set_state("offline")
    +        elif args.online == True:
    +            xprt.set_state("online")
    +        elif args.remove == True:
    +            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.32.0
diff mbox series

Patch

diff --git a/tools/nfs-sysfs/xprt.py b/tools/nfs-sysfs/xprt.py
index 2160cb0a9575..92b83ebc4cd1 100644
--- a/tools/nfs-sysfs/xprt.py
+++ b/tools/nfs-sysfs/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 self.exists == False:
+            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 == True:
+            xprt.set_state("offline")
+        elif args.online == True:
+            xprt.set_state("online")
+        elif args.remove == True:
+            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)