From patchwork Wed Jun 4 21:02:06 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Weston Andros Adamson X-Patchwork-Id: 4297001 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 3470DBEEA7 for ; Wed, 4 Jun 2014 21:03:04 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3C09620218 for ; Wed, 4 Jun 2014 21:03:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4AA6E201F7 for ; Wed, 4 Jun 2014 21:03:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752086AbaFDVCs (ORCPT ); Wed, 4 Jun 2014 17:02:48 -0400 Received: from mail-ie0-f174.google.com ([209.85.223.174]:45717 "EHLO mail-ie0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752067AbaFDVCr (ORCPT ); Wed, 4 Jun 2014 17:02:47 -0400 Received: by mail-ie0-f174.google.com with SMTP id lx4so68895iec.19 for ; Wed, 04 Jun 2014 14:02:46 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=28SzuRROuGoOH+8La6+PqU9MKBlrC1P7KIjiGZRFuJw=; b=dyltfsLrPAzIQlYCmXk9aO1OnEwWkJLPqil2jss8f7u7/ysarazT1vwJJCZhhAz083 6IFDK1VEE3FDdS6tdKROtEgp1v8KgBbNsHWYnTrEBtp8zgI4dYe9E/qd4nGAJ0i/iQCQ suHOE4SUEWCQarC7sPxG1uzT+snI3pv2+HMlUKHraFTgn6EpUGbHQWMVAyTlPbAG9THI mQiMpGY7uFJyFBsjjGi3CNu0tUtyoZCTJXw6wrDmKa0vLbirggLSHA4ZhIp99Wxkd8pb zSgivbNXF9y/qT/SU7NGVqqe8bMdeSmW0qkblP3RjHIAUT0qWEwPSQkyXRBNgaypd+es PUTQ== X-Gm-Message-State: ALoCoQlSIMUu2vPoAdBCNBhc2buOYVAgMmS+lM7CXXTxToyymJitZfGcjuOAjiQpZy+cIqtDISoW X-Received: by 10.50.152.38 with SMTP id uv6mr11459648igb.34.1401915766352; Wed, 04 Jun 2014 14:02:46 -0700 (PDT) Received: from gavrio-wifi.robotsandstuff.fake (c-98-209-19-144.hsd1.mi.comcast.net. [98.209.19.144]) by mx.google.com with ESMTPSA id qh3sm47684584igb.17.2014.06.04.14.02.44 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 04 Jun 2014 14:02:45 -0700 (PDT) From: Weston Andros Adamson To: bfields@fieldses.org Cc: linux-nfs@vger.kernel.org, Weston Andros Adamson Subject: [PATCH pynfs 17/17] nfs3clnt: reconnect when sending on inactive pipe Date: Wed, 4 Jun 2014 17:02:06 -0400 Message-Id: <1401915726-29092-19-git-send-email-dros@primarydata.com> X-Mailer: git-send-email 1.8.5.2 (Apple Git-48) In-Reply-To: <1401915726-29092-1-git-send-email-dros@primarydata.com> References: <1401915726-29092-1-git-send-email-dros@primarydata.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Weston Andros Adamson --- nfs4.1/nfs3client.py | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/nfs4.1/nfs3client.py b/nfs4.1/nfs3client.py index 79a6f0e..176765c 100644 --- a/nfs4.1/nfs3client.py +++ b/nfs4.1/nfs3client.py @@ -30,14 +30,19 @@ class PORTMAPClient(rpc.Client): def __init__(self, host='localhost', port=PMAP_PORT): rpc.Client.__init__(self, PMAP_PROG, PMAP_VERS) self.server_address = (host, port) - self.c1 = self.connect(self.server_address) + self._pipe = None + + def get_pipe(self): + if not self._pipe or not self._pipe.is_active(): + self._pipe = self.connect(self.server_address) + return self._pipe def proc_async(self, procnum, procarg, credinfo=None, pipe=None, checks=True, packer=PORTMAPPacker): if credinfo is None: credinfo = self.default_cred if pipe is None: - pipe = self.c1 + pipe = self.get_pipe() p = packer(check_enum=checks, check_array=checks) arg_packer = getattr(p, 'pack_%s' % procarg.__class__.__name__) arg_packer(procarg) @@ -51,7 +56,7 @@ class PORTMAPClient(rpc.Client): def listen(self, xid, restypename, pipe=None, timeout=10.0): if pipe is None: - pipe = self.c1 + pipe = self.get_pipe() header, data = pipe.listen(xid, timeout) if data: p = PORTMAPUnpacker(data) @@ -69,14 +74,19 @@ class Mnt3Client(rpc.Client): def __init__(self, host='localhost', port=None): rpc.Client.__init__(self, MOUNT_PROGRAM, MOUNT_V3) self.server_address = (host, port) - self.c1 = self.connect(self.server_address) + self._pipe = None + + def get_pipe(self): + if not self._pipe or not self._pipe.is_active(): + self._pipe = self.connect(self.server_address) + return self._pipe def proc_async(self, procnum, procarg, credinfo=None, pipe=None, checks=True, packer=MNT3Packer): if credinfo is None: credinfo = self.default_cred if pipe is None: - pipe = self.c1 + pipe = self.get_pipe() p = packer(check_enum=checks, check_array=checks) arg_packer = getattr(p, 'pack_%s' % procarg.__class__.__name__) arg_packer(procarg) @@ -90,7 +100,7 @@ class Mnt3Client(rpc.Client): def listen(self, xid, restypename, pipe=None, timeout=10.0): if pipe is None: - pipe = self.c1 + pipe = self.get_pipe() header, data = pipe.listen(xid, timeout) if data: p = MNT3Unpacker(data) @@ -110,15 +120,6 @@ class Mnt3Client(rpc.Client): class NFS3Client(rpc.Client): def __init__(self, host='localhost', port=None, ctrl_proc=16, summary=None): rpc.Client.__init__(self, 100003, 3) - #self.prog = 0x40000000 - #self.versions = [1] # List of supported versions of prog - - #self.minorversion = minorversion - #self.minor_versions = [minorversion] - #self.tag = "default tag" - #self.impl_id = nfs_impl_id4("citi.umich.edu", "pynfs X.X", - # nfs4lib.get_nfstime()) - self.portmap = PORTMAPClient(host=host) self.mntport = self.portmap.get_port(MOUNT_PROGRAM, MOUNT_V3) if not port: @@ -128,17 +129,21 @@ class NFS3Client(rpc.Client): self.verifier = struct.pack('>d', time.time()) self.server_address = (host, self.port) - self.c1 = self.connect(self.server_address) - #self.sessions = {} # XXX Really, this should be per server self.ctrl_proc = ctrl_proc self.summary = summary + self._pipe = None self.mntclnt = Mnt3Client(host=host, port=self.mntport) + def get_pipe(self): + if not self._pipe or not self._pipe.is_active(): + self._pipe = self.connect(self.server_address) + return self._pipe + def set_cred(self, credinfo): self.default_cred = credinfo def null_async(self, data=""): - return self.send_call(self.c1, 0, data) + return self.send_call(self.get_pipe(), 0, data) def null(self, *args, **kwargs): xid = self.null_async(*args, **kwargs) @@ -149,7 +154,7 @@ class NFS3Client(rpc.Client): if credinfo is None: credinfo = self.default_cred if pipe is None: - pipe = self.c1 + pipe = self.get_pipe() p = packer(check_enum=checks, check_array=checks) arg_packer = getattr(p, 'pack_%s' % procarg.__class__.__name__) arg_packer(procarg) @@ -167,7 +172,7 @@ class NFS3Client(rpc.Client): def listen(self, xid, procarg=None, pipe=None, timeout=10.0): if pipe is None: - pipe = self.c1 + pipe = self.get_pipe() header, data = pipe.listen(xid, timeout) if data: p = NFS3Unpacker(data)