Date: Monday, October 9, 2006 @ 15:27:33
  Author: gilles
    Path: /cvsroot/carob/carob

Modified: include/ConnectionParameters.hpp (1.28 -> 1.29)
          include/DriverSocket.hpp (1.15 -> 1.16) include/JavaSocket.hpp
          (1.30 -> 1.31) src/Connection.cpp (1.91 -> 1.92)
          src/ConnectionParameters.cpp (1.22 -> 1.23) src/DriverSocket.cpp
          (1.18 -> 1.19) src/JavaSocket.cpp (1.52 -> 1.53)
          test/ConnectionSetup.cpp (1.12 -> 1.13)

Made socket timeout tunable via new connection parameter socketTimeout (default 
to zero = no timeout = use driver host settings)


----------------------------------+
 include/ConnectionParameters.hpp |   29 ++++++++++++++++++++++---
 include/DriverSocket.hpp         |    4 ++-
 include/JavaSocket.hpp           |    4 ++-
 src/Connection.cpp               |    3 +-
 src/ConnectionParameters.cpp     |    7 ++++--
 src/DriverSocket.cpp             |    4 +--
 src/JavaSocket.cpp               |   42 ++++++++++++++-----------------------
 test/ConnectionSetup.cpp         |   20 ++++++++++++++---
 8 files changed, 74 insertions(+), 39 deletions(-)


Index: carob/include/ConnectionParameters.hpp
diff -u carob/include/ConnectionParameters.hpp:1.28 
carob/include/ConnectionParameters.hpp:1.29
--- carob/include/ConnectionParameters.hpp:1.28 Wed Sep 20 17:09:29 2006
+++ carob/include/ConnectionParameters.hpp      Mon Oct  9 15:27:33 2006
@@ -103,9 +103,24 @@
   static const bool            DEFAULT_CONNECTION_PERSISTENCY;
   /** Default for retrieve SQL warnings = false */
   static const bool            DEFAULT_RETRIEVE_SQL_WARNINGS;
+  /** Default timeout in seconds = 0 (no timeout) */
+  static const long            DEFAULT_SOCKET_TIMEOUT;
 
   /**
-   * Creates instance with set of values
+   * Creates instance with a set of values:
+   * @param ctrls a list of controllers to connect to as a vector of
+   *        ControllerInfo.
+   * @param db name of the database (default to "user)
+   * @param uname user name to use on this database (default to "")
+   * @param upass user pass (default to "myDB")
+   * @param cp controller pool policy for failover, one of enum ConnectPolicy
+   *        (default to ROUND_ROBIN)
+   * @param persistentConnection whether to create a persistent connection
+   *        (default to false)
+   * @param retrieveSQLWarnings whether SQL Warnings should be retrieved
+   *        (default to false)
+   * @param socketTimeout read/write timeouts on sockets before aborting
+   *        transmissions (default to 0 = no timeout) 
    */
   ConnectionParameters(const std::vector<ControllerInfo>& ctrls,
                        const std::wstring&  db                = DEFAULT_DB,
@@ -113,7 +128,8 @@
                        const std::wstring&  upass             = DEFAULT_PASSWD,
                        ConnectPolicy        cp                = DEFAULT_POLICY,
                        bool                 persistentConnection = 
DEFAULT_CONNECTION_PERSISTENCY,
-                       bool                 retrieveSQLWarnings = 
DEFAULT_RETRIEVE_SQL_WARNINGS)
+                       bool                 retrieveSQLWarnings = 
DEFAULT_RETRIEVE_SQL_WARNINGS,
+                       long                 socketTimeout     = 
DEFAULT_SOCKET_TIMEOUT)
                    throw (ConnectionException, UnexpectedException);
        virtual ~ConnectionParameters();
   /**
@@ -145,8 +161,10 @@
   void                releaseControllerPool();
   /** Tell whether the connection must remain persistent */
   bool                getPersistentConnection() const { return 
persistent_connections; }
-  /** whether the controller should retrieve SQL warnings */
+  /** Whether the controller should retrieve SQL warnings */
   bool                getRetrieveSQLWarnings() const { return 
retrieve_sql_warnings; }
+  /** Gives the socket operations timeout in seconds */
+  long                getSocketTimeout() const { return socket_timeout; }
 private:
   /** List of controllers to connect to */
   std::vector<ControllerInfo> controller_list;
@@ -167,6 +185,11 @@
   bool                persistent_connections;
   /** Whether to retrieve the sql warnings */
   bool                retrieve_sql_warnings;
+  /**
+   * Timeout (in seconds) after which socket operations should be considered as
+   * failed. Zero value means no timeout
+   */
+  long              socket_timeout;
 };
 
 } //namespace CarobNS
Index: carob/include/DriverSocket.hpp
diff -u carob/include/DriverSocket.hpp:1.15 carob/include/DriverSocket.hpp:1.16
--- carob/include/DriverSocket.hpp:1.15 Wed May 24 08:22:05 2006
+++ carob/include/DriverSocket.hpp      Mon Oct  9 15:27:33 2006
@@ -39,9 +39,11 @@
    * Constructor to directly connect to a host
    * @param host host to connect to
    * @param port port of the host to connect to
+   * @param timeout delay before considering socket read/write operations as
+   *        failed
    * @throws ConnectionException
    */
-  DriverSocket(const std::wstring& host, in_addr_t port) 
+  DriverSocket(const std::wstring& host, in_addr_t port, long timeout) 
       throw (ConnectionException, UnexpectedException);
 
   /**
Index: carob/include/JavaSocket.hpp
diff -u carob/include/JavaSocket.hpp:1.30 carob/include/JavaSocket.hpp:1.31
--- carob/include/JavaSocket.hpp:1.30   Wed Sep 20 17:09:29 2006
+++ carob/include/JavaSocket.hpp        Mon Oct  9 15:27:33 2006
@@ -72,10 +72,12 @@
    * Creates the socket.
    * @param blocking whether or not socket operations must be blocking (default
    *        is true, blocking socket)
+   * @param timeout delay before considering read/write operations as failed
+   *        (default to 0 = no timeout)
    * @return true upon successfull creation, false otherwise
    * @throws ConnectionException
    */
-  bool          create(bool blocking = true)
+  bool          create(bool blocking = true, long timeout = 0)
                     throw (ConnectionException, UnexpectedException);
   /**
    * Connects to the given host/port
Index: carob/src/Connection.cpp
diff -u carob/src/Connection.cpp:1.91 carob/src/Connection.cpp:1.92
--- carob/src/Connection.cpp:1.91       Fri Oct  6 17:26:24 2006
+++ carob/src/Connection.cpp    Mon Oct  9 15:27:33 2006
@@ -171,7 +171,8 @@
     //Here is the connection protocol...
     // 1. connect to the controller
     driverSocketPtr = new DriverSocket(connected_controller.getHostName(),
-                                       connected_controller.getHostPort());
+                                       connected_controller.getHostPort(),
+                                       parameters.getSocketTimeout());
     // 2. sent the Protocol version information
     *driverSocketPtr<<ProtocolVersion;
     protocolVersionSend = true;
Index: carob/src/ConnectionParameters.cpp
diff -u carob/src/ConnectionParameters.cpp:1.22 
carob/src/ConnectionParameters.cpp:1.23
--- carob/src/ConnectionParameters.cpp:1.22     Thu Jul 27 17:10:42 2006
+++ carob/src/ConnectionParameters.cpp  Mon Oct  9 15:27:33 2006
@@ -103,6 +103,7 @@
 const ConnectPolicy   ConnectionParameters::DEFAULT_POLICY                 = 
ROUND_ROBIN; 
 const bool            ConnectionParameters::DEFAULT_CONNECTION_PERSISTENCY = 
false ;
 const bool            ConnectionParameters::DEFAULT_RETRIEVE_SQL_WARNINGS  = 
false ;
+const long            ConnectionParameters::DEFAULT_SOCKET_TIMEOUT         = 0 
;
 
 ConnectionParameters::ConnectionParameters(
     const std::vector<ControllerInfo>& ctrls,
@@ -111,14 +112,16 @@
     const std::wstring& upass /*= DEFAULT_PASSWD*/,
     ConnectPolicy cp /*= DEFAULT_POLICY*/,
     bool persistentConnections /*= DEFAULT_CONNECTION_PERSISTENCY */,
-    bool retrieveSQLWarnings /*= DEFAULT_RETRIEVE_SQL_WARNINGS */)
+    bool retrieveSQLWarnings /*= DEFAULT_RETRIEVE_SQL_WARNINGS */,
+    long socketTimeout /*= DEFAULT_SOCKET_TIMEOUT */)
         throw (ConnectionException, UnexpectedException) :
             database_name(checkDatabaseName(db)),
             user_name(uname),
             user_pass(upass),
             connect_policy(cp),
             persistent_connections(persistentConnections),
-            retrieve_sql_warnings(retrieveSQLWarnings)
+            retrieve_sql_warnings(retrieveSQLWarnings),
+            socket_timeout(socketTimeout)
 {
   // Check the given controllers host names
   for (std::vector<ControllerInfo>::const_iterator iter = ctrls.begin();
Index: carob/src/DriverSocket.cpp
diff -u carob/src/DriverSocket.cpp:1.18 carob/src/DriverSocket.cpp:1.19
--- carob/src/DriverSocket.cpp:1.18     Fri Feb 24 18:26:25 2006
+++ carob/src/DriverSocket.cpp  Mon Oct  9 15:27:33 2006
@@ -28,11 +28,11 @@
 
 using namespace CarobNS;
 
-DriverSocket::DriverSocket(const wstring& host, in_addr_t port)
+DriverSocket::DriverSocket(const wstring& host, in_addr_t port, long timeout)
     throw (ConnectionException, UnexpectedException) : JavaSocket()
 {
   wstring fctName(L"DriverSocket::DriverSocket");
-  if (JavaSocket::create())
+  if (JavaSocket::create(true, timeout))
     JavaSocket::connectTo(host, port);
 }
 
Index: carob/src/JavaSocket.cpp
diff -u carob/src/JavaSocket.cpp:1.52 carob/src/JavaSocket.cpp:1.53
--- carob/src/JavaSocket.cpp:1.52       Fri Oct  6 17:33:36 2006
+++ carob/src/JavaSocket.cpp    Mon Oct  9 15:27:33 2006
@@ -53,7 +53,7 @@
   closeSocket();
 }
 
-bool JavaSocket::create(bool blocking /* = true */)
+bool JavaSocket::create(bool blocking /* = true */, long timeout /* = 0 */)
     throw (ConnectionException, UnexpectedException)
 {
   wstring fctName(L"JavaSocket::Create");
@@ -112,31 +112,23 @@
     return false;
   }
 
-  // Set receive timeout in order to failover asap when network is down
-  struct timeval timeout;
-  // FIXME: This ugly hard-coded timeout is temporary !!! Will appear in
-  // connection parameters
-  timeout.tv_sec  = 4;
-  timeout.tv_usec = 0;
-  if (setsockopt(socketFd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) 
< 0)
+  /* Set timeouts on socket if required */ 
+  if (timeout > 0) /* also prevent zero timeout, which is useless ! */
   {
-    if (isErrorEnabled())
-      logError(fctName, L"Could not set socket recv timeout ! failover can 
thus be very slow !");
-  }
-  else
-  {
-    if (isDebugEnabled())
-      logDebug(fctName, L"Recv timeout set.");
-  }
-  if (setsockopt(socketFd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)) 
< 0)
-  {
-    if (isErrorEnabled())
-      logError(fctName, L"Could not set socket snd timeout ! failover can thus 
be very slow !");
-  }
-  else
-  {
-    if (isDebugEnabled())
-      logDebug(fctName, L"Snd timeout set.");
+    // Set receive timeout in order to failover asap when network is down
+    struct timeval timeoutStruct;
+    timeoutStruct.tv_sec  = timeout;
+    timeoutStruct.tv_usec = 0;
+    if (setsockopt(socketFd, SOL_SOCKET, SO_RCVTIMEO, &timeoutStruct, 
sizeof(timeoutStruct)) < 0)
+    {
+      if (isErrorEnabled())
+        logError(fctName, L"Could not set socket recv timeout ! failover can 
thus be very slow !");
+    }
+    if (setsockopt(socketFd, SOL_SOCKET, SO_SNDTIMEO, &timeoutStruct, 
sizeof(timeoutStruct)) < 0)
+    {
+      if (isErrorEnabled())
+        logError(fctName, L"Could not set socket snd timeout ! failover can 
thus be very slow !");
+    }
   }
   if (isDebugEnabled())
     logDebug(fctName, L"Socket created.");
Index: carob/test/ConnectionSetup.cpp
diff -u carob/test/ConnectionSetup.cpp:1.12 carob/test/ConnectionSetup.cpp:1.13
--- carob/test/ConnectionSetup.cpp:1.12 Thu Sep 21 09:27:37 2006
+++ carob/test/ConnectionSetup.cpp      Mon Oct  9 15:27:33 2006
@@ -40,16 +40,28 @@
   std::vector<ControllerInfo> ctrls;
 #if 1
   ctrls.push_back(ControllerInfo(DEFAULT_HOST, DEFAULT_PORT));
-  ConnectionParameters connectionPrms(ctrls);
+  ctrls.push_back(ControllerInfo(DEFAULT_HOST, 25323));
+  ConnectionParameters connectionPrms(ctrls,
+                                      ConnectionParameters::DEFAULT_DB,
+                                      ConnectionParameters::DEFAULT_USER,
+                                      ConnectionParameters::DEFAULT_PASSWD,
+                                      ConnectionParameters::DEFAULT_POLICY,
+                                      
ConnectionParameters::DEFAULT_CONNECTION_PERSISTENCY,
+                                      
ConnectionParameters::DEFAULT_RETRIEVE_SQL_WARNINGS,
+                                      10);
 #else
   // Put your controller settings here.
   // Check this constructor for more details.
   // TODO: these should be run-time settings.
   ctrls.push_back(Controller(L"myhostname", 25322));
   ConnectionParameters connectionPrms(ctrls,
-                                      L"myDB",
-                                      L"user",
-                                      L"");
+                                      ConnectionParameters::DEFAULT_DB,
+                                      ConnectionParameters::DEFAULT_USER,
+                                      ConnectionParameters::DEFAULT_PASSWD,
+                                      ConnectionParameters::DEFAULT_POLICY,
+                                      
ConnectionParameters::DEFAULT_CONNECTION_PERSISTENCY,
+                                      
ConnectionParameters::DEFAULT_RETRIEVE_SQL_WARNINGS,
+                                      10);
 #endif
   try
   {

_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits

Reply via email to