diff options
author | unknown <stewart@mysql.com[stewart]> | 2007-03-22 22:35:07 +1100 |
---|---|---|
committer | unknown <stewart@mysql.com[stewart]> | 2007-03-22 22:35:07 +1100 |
commit | aa8b15b70b80f6c33c05a1aaf3d926bf10715525 (patch) | |
tree | 632b950d268067bf0f77e5279446dbd650fea6f1 /storage/ndb/src/common/util | |
parent | c59722ad839db68b751e2f9be64671edc95cefab (diff) | |
download | mariadb-git-aa8b15b70b80f6c33c05a1aaf3d926bf10715525.tar.gz |
[PATCH] WL#3704 mgmapi timeouts: Change to have total timeout for call, not per request
use portable method, getting milliseconds between calls - Linux would
let us do funky stuff by getting the timeout from select(2). Everywhere
else sucks and doesn't let us do that :(
Index: ndb-work/storage/ndb/include/util/InputStream.hpp
===================================================================
storage/ndb/include/util/InputStream.hpp:
WL#3704 mgmapi timeouts: Change to have total timeout for call, not per request
storage/ndb/include/util/OutputStream.hpp:
WL#3704 mgmapi timeouts: Change to have total timeout for call, not per request
storage/ndb/include/util/socket_io.h:
WL#3704 mgmapi timeouts: Change to have total timeout for call, not per request
storage/ndb/src/common/util/InputStream.cpp:
WL#3704 mgmapi timeouts: Change to have total timeout for call, not per request
storage/ndb/src/common/util/OutputStream.cpp:
WL#3704 mgmapi timeouts: Change to have total timeout for call, not per request
storage/ndb/src/common/util/socket_io.cpp:
WL#3704 mgmapi timeouts: Change to have total timeout for call, not per request
storage/ndb/src/mgmsrv/Services.cpp:
WL#3704 mgmapi timeouts: Change to have total timeout for call, not per request
Diffstat (limited to 'storage/ndb/src/common/util')
-rw-r--r-- | storage/ndb/src/common/util/InputStream.cpp | 11 | ||||
-rw-r--r-- | storage/ndb/src/common/util/OutputStream.cpp | 22 | ||||
-rw-r--r-- | storage/ndb/src/common/util/socket_io.cpp | 44 |
3 files changed, 55 insertions, 22 deletions
diff --git a/storage/ndb/src/common/util/InputStream.cpp b/storage/ndb/src/common/util/InputStream.cpp index ee7f2d5c8b2..2337344d91a 100644 --- a/storage/ndb/src/common/util/InputStream.cpp +++ b/storage/ndb/src/common/util/InputStream.cpp @@ -37,7 +37,8 @@ SocketInputStream::SocketInputStream(NDB_SOCKET_TYPE socket, unsigned read_timeout_ms) : m_socket(socket) { m_startover= true; - m_timeout_ms = read_timeout_ms; + m_timeout_remain= m_timeout_ms = read_timeout_ms; + m_timedout= false; } @@ -55,9 +56,13 @@ SocketInputStream::gets(char * buf, int bufLen) { else offset= strlen(buf); - int res = readln_socket(m_socket, m_timeout_ms, buf+offset, bufLen-offset, m_mutex); + int time= 0; + int res = readln_socket(m_socket, m_timeout_remain, &time, + buf+offset, bufLen-offset, m_mutex); - if(res == 0) + if(res >= 0) + m_timeout_remain-=time; + if(res == 0 || m_timeout_remain<=0) { m_timedout= true; buf[0]=0; diff --git a/storage/ndb/src/common/util/OutputStream.cpp b/storage/ndb/src/common/util/OutputStream.cpp index ebc352b1b50..0943e47e33f 100644 --- a/storage/ndb/src/common/util/OutputStream.cpp +++ b/storage/ndb/src/common/util/OutputStream.cpp @@ -44,7 +44,7 @@ FileOutputStream::println(const char * fmt, ...){ SocketOutputStream::SocketOutputStream(NDB_SOCKET_TYPE socket, unsigned write_timeout_ms){ m_socket = socket; - m_timeout_ms = write_timeout_ms; + m_timeout_remain= m_timeout_ms = write_timeout_ms; m_timedout= false; } @@ -55,12 +55,18 @@ SocketOutputStream::print(const char * fmt, ...){ if(timedout()) return -1; + int time= 0; va_start(ap, fmt); - const int ret = vprint_socket(m_socket, m_timeout_ms, fmt, ap); + int ret = vprint_socket(m_socket, m_timeout_ms, &time, fmt, ap); va_end(ap); - if (errno==ETIMEDOUT) + if(ret >= 0) + m_timeout_remain-=time; + if(errno==ETIMEDOUT || m_timeout_remain<=0) + { m_timedout= true; + ret= -1; + } return ret; } @@ -71,12 +77,18 @@ SocketOutputStream::println(const char * fmt, ...){ if(timedout()) return -1; + int time= 0; va_start(ap, fmt); - const int ret = vprintln_socket(m_socket, m_timeout_ms, fmt, ap); + int ret = vprintln_socket(m_socket, m_timeout_ms, &time, fmt, ap); va_end(ap); - if (errno==ETIMEDOUT) + if(ret >= 0) + m_timeout_remain-=time; + if (errno==ETIMEDOUT || m_timeout_remain<=0) + { m_timedout= true; + ret= -1; + } return ret; } diff --git a/storage/ndb/src/common/util/socket_io.cpp b/storage/ndb/src/common/util/socket_io.cpp index d19c792e20f..dfdcd19412f 100644 --- a/storage/ndb/src/common/util/socket_io.cpp +++ b/storage/ndb/src/common/util/socket_io.cpp @@ -18,6 +18,7 @@ #include <NdbTCP.h> #include <socket_io.h> #include <NdbOut.hpp> +#include <NdbTick.h> extern "C" int @@ -47,7 +48,7 @@ read_socket(NDB_SOCKET_TYPE socket, int timeout_millis, extern "C" int -readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, +readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, int *time, char * buf, int buflen, NdbMutex *mutex){ if(buflen <= 1) return 0; @@ -62,7 +63,10 @@ readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, if(mutex) NdbMutex_Unlock(mutex); + Uint64 tick= NdbTick_CurrentMillisecond(); const int selectRes = select(socket + 1, &readset, 0, 0, &timeout); + + *time= NdbTick_CurrentMillisecond() - tick; if(mutex) NdbMutex_Lock(mutex); @@ -126,9 +130,13 @@ readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, FD_ZERO(&readset); FD_SET(socket, &readset); - timeout.tv_sec = (timeout_millis / 1000); - timeout.tv_usec = (timeout_millis % 1000) * 1000; + timeout.tv_sec = ((timeout_millis - *time) / 1000); + timeout.tv_usec = ((timeout_millis - *time) % 1000) * 1000; + + tick= NdbTick_CurrentMillisecond(); const int selectRes = select(socket + 1, &readset, 0, 0, &timeout); + *time= NdbTick_CurrentMillisecond() - tick; + if(selectRes != 1){ return -1; } @@ -139,7 +147,7 @@ readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, extern "C" int -write_socket(NDB_SOCKET_TYPE socket, int timeout_millis, +write_socket(NDB_SOCKET_TYPE socket, int timeout_millis, int *time, const char buf[], int len){ fd_set writeset; FD_ZERO(&writeset); @@ -148,7 +156,11 @@ write_socket(NDB_SOCKET_TYPE socket, int timeout_millis, timeout.tv_sec = (timeout_millis / 1000); timeout.tv_usec = (timeout_millis % 1000) * 1000; + + Uint64 tick= NdbTick_CurrentMillisecond(); const int selectRes = select(socket + 1, 0, &writeset, 0, &timeout); + *time= NdbTick_CurrentMillisecond() - tick; + if(selectRes != 1){ return -1; } @@ -167,9 +179,13 @@ write_socket(NDB_SOCKET_TYPE socket, int timeout_millis, FD_ZERO(&writeset); FD_SET(socket, &writeset); - timeout.tv_sec = 1; - timeout.tv_usec = 0; + timeout.tv_sec = ((timeout_millis - *time) / 1000); + timeout.tv_usec = ((timeout_millis - *time) % 1000) * 1000; + + Uint64 tick= NdbTick_CurrentMillisecond(); const int selectRes2 = select(socket + 1, 0, &writeset, 0, &timeout); + *time= NdbTick_CurrentMillisecond() - tick; + if(selectRes2 != 1){ return -1; } @@ -180,11 +196,11 @@ write_socket(NDB_SOCKET_TYPE socket, int timeout_millis, extern "C" int -print_socket(NDB_SOCKET_TYPE socket, int timeout_millis, +print_socket(NDB_SOCKET_TYPE socket, int timeout_millis, int *time, const char * fmt, ...){ va_list ap; va_start(ap, fmt); - int ret = vprint_socket(socket, timeout_millis, fmt, ap); + int ret = vprint_socket(socket, timeout_millis, time, fmt, ap); va_end(ap); return ret; @@ -192,18 +208,18 @@ print_socket(NDB_SOCKET_TYPE socket, int timeout_millis, extern "C" int -println_socket(NDB_SOCKET_TYPE socket, int timeout_millis, +println_socket(NDB_SOCKET_TYPE socket, int timeout_millis, int *time, const char * fmt, ...){ va_list ap; va_start(ap, fmt); - int ret = vprintln_socket(socket, timeout_millis, fmt, ap); + int ret = vprintln_socket(socket, timeout_millis, time, fmt, ap); va_end(ap); return ret; } extern "C" int -vprint_socket(NDB_SOCKET_TYPE socket, int timeout_millis, +vprint_socket(NDB_SOCKET_TYPE socket, int timeout_millis, int *time, const char * fmt, va_list ap){ char buf[1000]; char *buf2 = buf; @@ -221,7 +237,7 @@ vprint_socket(NDB_SOCKET_TYPE socket, int timeout_millis, } else return 0; - int ret = write_socket(socket, timeout_millis, buf2, size); + int ret = write_socket(socket, timeout_millis, time, buf2, size); if(buf2 != buf) free(buf2); return ret; @@ -229,7 +245,7 @@ vprint_socket(NDB_SOCKET_TYPE socket, int timeout_millis, extern "C" int -vprintln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, +vprintln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, int *time, const char * fmt, va_list ap){ char buf[1000]; char *buf2 = buf; @@ -249,7 +265,7 @@ vprintln_socket(NDB_SOCKET_TYPE socket, int timeout_millis, } buf2[size-1]='\n'; - int ret = write_socket(socket, timeout_millis, buf2, size); + int ret = write_socket(socket, timeout_millis, time, buf2, size); if(buf2 != buf) free(buf2); return ret; |