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