Merged revisions 5092 via svnmerge from
authorJan Kupec <jkupec@suse.cz>
Fri, 23 Feb 2007 16:42:21 +0000 (16:42 +0000)
committerJan Kupec <jkupec@suse.cz>
Fri, 23 Feb 2007 16:42:21 +0000 (16:42 +0000)
http://svn.suse.de/svn/zypp/branches/SuSE-Linux-10_2-Branch/libzypp

........
  r5092 | jkupec | 2007-02-23 17:20:47 +0100 (Fri, 23 Feb 2007) | 2 lines

  adding soft,timeo=X nfs mount options by default (#235211)
........

package/libzypp.changes
zypp/media/MediaNFS.cc
zypp/media/MediaNFS.h

index 5ca889b4dcd3a8244ae9ac69f9f3b05ac1e93ece..0ffca30ca9727cf0458b0b64c6d6afecb9149d75 100644 (file)
@@ -1,3 +1,9 @@
+-------------------------------------------------------------------
+Fri Feb 23 17:40:23 CET 2007 - jkupec@suse.cz
+
+- adding sotf,timeo=X nfs mount options by default (#235211)
+- r5093
+
 -------------------------------------------------------------------
 Fri Feb 23 14:16:19 CET 2007 - jkupec@suse.cz
 
index 1a6c98fc83594ddf0bdb232934e64100babc8eae..b09559d92c48b86a0fbea1d4c7d92813c5860804 100644 (file)
@@ -11,6 +11,7 @@
 */
 
 #include <iostream>
+#include <sstream>
 
 #include "zypp/base/Logger.h"
 #include "zypp/base/String.h"
@@ -102,19 +103,41 @@ namespace zypp {
       {
        options="ro";
       }
-    
-      // Add option "nolock", unless option "lock" or "unlock" is already set.
-      // This should prevent the mount command hanging when the portmapper isn't
-      // running.
+
       vector<string> optionList;
       str::split( options, std::back_inserter(optionList), "," );
       vector<string>::const_iterator it;
+      bool contains_lock  = false, contains_soft = false,
+           contains_timeo = false, contains_hard = false;
+
       for( it = optionList.begin(); it != optionList.end(); ++it ) {
-       if ( *it == "lock" || *it == "nolock" ) break;
+        if ( *it == "lock" || *it == "nolock" ) contains_lock = true;
+        else if ( *it == "soft") contains_soft = true;
+        else if ( *it == "hard") contains_hard = true;
+        else if ( it->find("timeo") != string::npos ) contains_timeo = true;
       }
-      if ( it == optionList.end() ) {
-       optionList.push_back( "nolock" );
-       options = str::join( optionList, "," );
+
+      if ( !(contains_lock && contains_soft) ) {
+        // Add option "nolock", unless option "lock" or "unlock" is already set.
+        // This should prevent the mount command hanging when the portmapper isn't
+        // running.
+        if ( !contains_lock ) {
+          optionList.push_back( "nolock" );
+        }
+        // Add options "soft,timeo=NFS_MOUNT_TIMEOUT", unless they are set
+        // already or "hard" option is explicitly specified. This prevent
+        // the mount command from hanging when the nfs server is not responding
+        // and file transactions from an unresponsive to throw an error after
+        // a short time instead of hanging forever
+        if ( !(contains_soft || contains_hard) ) {
+          optionList.push_back( "soft" );
+          if ( !contains_timeo ) {
+            ostringstream s;
+            s << "timeo=" << NFS_MOUNT_TIMEOUT;
+            optionList.push_back( s.str() );
+          }
+        }
+        options = str::join( optionList, "," );
       }
 
       mount.mount(path,mountpoint,filesystem,options);
index 09704138e5a9cd5a3cbf6fb8f2cd4aecf9bfca42..0893b6e7c9a990ddae9b3cda6970af9d56971ded 100644 (file)
 
 #include "zypp/media/MediaHandler.h"
 
+/**
+ * Value of nfs mount minor timeout in tenths of a second.
+ */
+#define NFS_MOUNT_TIMEOUT 10
+
 namespace zypp {
   namespace media {