From d3a69998e4e513b799fcf72a2d13bb8ec883c30f Mon Sep 17 00:00:00 2001 From: John Sully Date: Sun, 16 Feb 2020 18:41:29 -0500 Subject: [PATCH 1/4] Fix memory leak in RDB load Former-commit-id: 06ad1c15d719a34fed36244b12a593f749bbb8a6 --- src/rdb.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/rdb.cpp b/src/rdb.cpp index 48205f430..5b316a4a8 100644 --- a/src/rdb.cpp +++ b/src/rdb.cpp @@ -1545,9 +1545,15 @@ robj *rdbLoadObject(int rdbtype, rio *rdb, robj *key, uint64_t mvcc_tstamp) { == NULL) return NULL; if (rdbtype == RDB_TYPE_ZSET_2) { - if (rdbLoadBinaryDoubleValue(rdb,&score) == -1) return NULL; + if (rdbLoadBinaryDoubleValue(rdb,&score) == -1) { + sdsfree(sdsele); + return NULL; + } } else { - if (rdbLoadDoubleValue(rdb,&score) == -1) return NULL; + if (rdbLoadDoubleValue(rdb,&score) == -1) { + sdsfree(sdsele); + return NULL; + } } /* Don't care about integer-encoded strings. */ @@ -2181,6 +2187,8 @@ int rdbLoadRio(rio *rdb, rdbSaveInfo *rsi, int loading_aof) { decrRefCount(val); val = nullptr; } + decrRefCount(key); + key = nullptr; } /* Reset the state that is key-specified and is populated by From dde7fc4c18c705625415d05e1836f8063f342370 Mon Sep 17 00:00:00 2001 From: John Sully Date: Sun, 16 Feb 2020 18:41:29 -0500 Subject: [PATCH 2/4] Fix memory leak in RDB load Former-commit-id: 4e9d2f08b11cc76bb2716514fa6d55f76160fd13 --- src/rdb.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/rdb.cpp b/src/rdb.cpp index a3351fe59..ebace63e5 100644 --- a/src/rdb.cpp +++ b/src/rdb.cpp @@ -1597,9 +1597,15 @@ robj *rdbLoadObject(int rdbtype, rio *rdb, robj *key, uint64_t mvcc_tstamp) { == NULL) return NULL; if (rdbtype == RDB_TYPE_ZSET_2) { - if (rdbLoadBinaryDoubleValue(rdb,&score) == -1) return NULL; + if (rdbLoadBinaryDoubleValue(rdb,&score) == -1) { + sdsfree(sdsele); + return NULL; + } } else { - if (rdbLoadDoubleValue(rdb,&score) == -1) return NULL; + if (rdbLoadDoubleValue(rdb,&score) == -1) { + sdsfree(sdsele); + return NULL; + } } /* Don't care about integer-encoded strings. */ @@ -2403,6 +2409,8 @@ int rdbLoadRio(rio *rdb, int rdbflags, rdbSaveInfo *rsi) { decrRefCount(val); val = nullptr; } + decrRefCount(key); + key = nullptr; } if (g_pserver->key_load_delay) usleep(g_pserver->key_load_delay); From b6db2d32ad14e24f968d780f975b8fd08c08df44 Mon Sep 17 00:00:00 2001 From: John Sully Date: Sun, 16 Feb 2020 18:53:46 -0500 Subject: [PATCH 3/4] Graceful shutdown of server threads when quit is requested Former-commit-id: b9db899f6ccea62222170c6eec264d403a7a911d --- src/db.cpp | 2 +- src/server.cpp | 25 ++++++++++++++++++++++--- src/server.h | 3 +++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index e94e0cdb1..562485941 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -977,7 +977,7 @@ void shutdownCommand(client *c) { * Also when in Sentinel mode clear the SAVE flag and force NOSAVE. */ if (g_pserver->loading || g_pserver->sentinel_mode) flags = (flags & ~SHUTDOWN_SAVE) | SHUTDOWN_NOSAVE; - if (prepareForShutdown(flags) == C_OK) exit(0); + if (prepareForShutdown(flags) == C_OK) throw ShutdownException(); addReplyError(c,"Errors trying to SHUTDOWN. Check logs."); } diff --git a/src/server.cpp b/src/server.cpp index 15f52ab52..6fee88732 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1894,7 +1894,7 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { /* We received a SIGTERM, shutting down here in a safe way, as it is * not ok doing so inside the signal handler. */ if (g_pserver->shutdown_asap) { - if (prepareForShutdown(SHUTDOWN_NOFLAGS) == C_OK) exit(0); + if (prepareForShutdown(SHUTDOWN_NOFLAGS) == C_OK) throw ShutdownException(); serverLog(LL_WARNING,"SIGTERM received but errors trying to shut down the server, check the logs for more information"); g_pserver->shutdown_asap = 0; } @@ -3812,8 +3812,17 @@ int prepareForShutdown(int flags) { /* Close the listening sockets. Apparently this allows faster restarts. */ closeListeningSockets(1); + + for (int iel = 0; iel < cserver.cthreads; ++iel) + { + aePostFunction(g_pserver->rgthreadvar[iel].el, [iel]{ + g_pserver->rgthreadvar[iel].el->stop = 1; + }); + } + serverLog(LL_WARNING,"%s is now ready to exit, bye bye...", g_pserver->sentinel_mode ? "Sentinel" : "KeyDB"); + return C_OK; } @@ -5033,8 +5042,16 @@ void *workerThreadMain(void *parg) aeEventLoop *el = g_pserver->rgthreadvar[iel].el; aeSetBeforeSleepProc(el, isMainThread ? beforeSleep : beforeSleepLite, isMainThread ? 0 : AE_SLEEP_THREADSAFE); aeSetAfterSleepProc(el, afterSleep, AE_SLEEP_THREADSAFE); - aeMain(el); + try + { + aeMain(el); + } + catch (ShutdownException) + { + } + serverAssert(!GlobalLocksAcquired()); aeDeleteEventLoop(el); + return NULL; } @@ -5334,7 +5351,9 @@ int main(int argc, char **argv) { /* The main thread sleeps until all the workers are done. this is so that all worker threads are orthogonal in their startup/shutdown */ void *pvRet; - pthread_join(rgthread[IDX_EVENT_LOOP_MAIN], &pvRet); + for (int iel = 0; iel < cserver.cthreads; ++iel) + pthread_join(rgthread[iel], &pvRet); + return 0; } diff --git a/src/server.h b/src/server.h index 135a216ae..58ea3e620 100644 --- a/src/server.h +++ b/src/server.h @@ -2922,6 +2922,9 @@ inline int FCorrectThread(client *c) } #define AssertCorrectThread(c) serverAssert(FCorrectThread(c)) +class ShutdownException +{}; + #define redisDebug(fmt, ...) \ printf("DEBUG %s:%d > " fmt "\n", __FILE__, __LINE__, __VA_ARGS__) #define redisDebugMark() \ From d229b03b2c69b4f63bc569169452661d321ca2e6 Mon Sep 17 00:00:00 2001 From: John Sully Date: Tue, 28 Jan 2020 19:06:33 -0500 Subject: [PATCH 4/4] Support C++14 and remove dependency on future standard 2a Former-commit-id: 18496b62853738bf7bd48f65fe34aafcba8bbe0b --- src/Makefile | 2 +- src/config.cpp | 200 ++++++++++++++++++++++++--------------------- src/connection.cpp | 26 +++--- src/server.h | 2 +- 4 files changed, 122 insertions(+), 108 deletions(-) diff --git a/src/Makefile b/src/Makefile index b89f69b53..fd4cf9926 100644 --- a/src/Makefile +++ b/src/Makefile @@ -21,7 +21,7 @@ NODEPS:=clean distclean # Default settings STD=-std=c11 -pedantic -DREDIS_STATIC='' -CXX_STD=-std=c++2a -pedantic -fno-rtti -D__STDC_FORMAT_MACROS +CXX_STD=-std=c++14 -pedantic -fno-rtti -D__STDC_FORMAT_MACROS ifneq (,$(findstring clang,$(CC))) ifneq (,$(findstring FreeBSD,$(uname_S))) STD+=-Wno-c11-extensions diff --git a/src/config.cpp b/src/config.cpp index 442309a82..8f6cfbad5 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -123,7 +123,7 @@ clientBufferLimitsConfig clientBufferLimitsDefaults[CLIENT_TYPE_OBUF_COUNT] = { * rewrite. */ typedef struct boolConfigData { int *config; /* The pointer to the server config this value is stored in */ - const int default_value; /* The default value of the config on rewrite */ + int default_value; /* The default value of the config on rewrite */ int (*is_valid_fn)(int val, const char **err); /* Optional function to check validity of new value (generic doc above) */ int (*update_fn)(int val, int prev, const char **err); /* Optional function to apply new value at runtime (generic doc above) */ } boolConfigData; @@ -140,7 +140,7 @@ typedef struct stringConfigData { typedef struct enumConfigData { int *config; /* The pointer to the server config this value is stored in */ configEnum *enum_value; /* The underlying enum type this data represents */ - const int default_value; /* The default value of the config on rewrite */ + int default_value; /* The default value of the config on rewrite */ int (*is_valid_fn)(int val, const char **err); /* Optional function to check validity of new value (generic doc above) */ int (*update_fn)(int val, int prev, const char **err); /* Optional function to apply new value at runtime (generic doc above) */ } enumConfigData; @@ -162,7 +162,7 @@ typedef struct numericConfigData { int is_memory; /* Indicates if this value can be loaded as a memory value */ long long lower_bound; /* The lower bound of this numeric value */ long long upper_bound; /* The upper bound of this numeric value */ - const long long default_value; /* The default value of the config on rewrite */ + long long default_value; /* The default value of the config on rewrite */ int (*is_valid_fn)(long long val, const char **err); /* Optional function to check validity of new value (generic doc above) */ int (*update_fn)(long long val, long long prev, const char **err); /* Optional function to apply new value at runtime (generic doc above) */ numericType numeric_type; /* An enum indicating the type of this value */ @@ -1669,15 +1669,17 @@ static void boolConfigRewrite(typeData data, const char *name, struct rewriteCon rewriteConfigYesNoOption(state, name,*(data.yesno.config), data.yesno.default_value); } -#define createBoolConfig(name, alias, modifiable, config_addr, default, is_valid, update) { \ - embedCommonConfig(name, alias, modifiable) \ - {boolConfigInit, boolConfigLoad, boolConfigSet, boolConfigGet, boolConfigRewrite}, \ - { { /* .data.yesno */ \ - &(config_addr), \ - (default), \ - (is_valid), \ - (update), \ - } } \ +constexpr standardConfig createBoolConfig(const char *name, const char *alias, int modifiable, int &config_addr, int defaultValue, int (*is_valid)(int val, const char **err), int (*update)(int val, int prev, const char **err)) +{ + standardConfig conf = { + embedCommonConfig(name, alias, modifiable) + { boolConfigInit, boolConfigLoad, boolConfigSet, boolConfigGet, boolConfigRewrite } + }; + conf.data.yesno.config = &config_addr; + conf.data.yesno.default_value = defaultValue; + conf.data.yesno.is_valid_fn = is_valid; + conf.data.yesno.update_fn = update; + return conf; } /* String Configs */ @@ -1734,16 +1736,19 @@ static void stringConfigRewrite(typeData data, const char *name, struct rewriteC #define ALLOW_EMPTY_STRING 0 #define EMPTY_STRING_IS_NULL 1 -#define createStringConfig(name, alias, modifiable, empty_to_null, config_addr, default, is_valid, update) { \ - embedCommonConfig(name, alias, modifiable) \ - embedConfigInterface(stringConfigInit, stringConfigLoad, stringConfigSet, stringConfigGet, stringConfigRewrite) \ - { .string = { \ - &(config_addr), \ - (default), \ - (is_valid), \ - (update), \ - (empty_to_null), \ - } } \ +constexpr standardConfig createStringConfig(const char *name, const char *alias, int modifiable, int empty_to_null, char *&config_addr, const char *defaultValue, int (*is_valid)(char*,const char**), int (*update)(char*,char*,const char**)) { + standardConfig conf = { + embedCommonConfig(name, alias, modifiable) + embedConfigInterface(stringConfigInit, stringConfigLoad, stringConfigSet, stringConfigGet, stringConfigRewrite) + }; + conf.data.string = { + &(config_addr), + (defaultValue), + (is_valid), + (update), + (empty_to_null), + }; + return conf; } /* Enum configs */ @@ -1805,16 +1810,20 @@ static void configEnumRewrite(typeData data, const char *name, struct rewriteCon rewriteConfigEnumOption(state, name,*(data.enumd.config), data.enumd.enum_value, data.enumd.default_value); } -#define createEnumConfig(name, alias, modifiable, enum, config_addr, default, is_valid, update) { \ - embedCommonConfig(name, alias, modifiable) \ - embedConfigInterface(configEnumInit, configEnumLoad, configEnumSet, configEnumGet, configEnumRewrite) \ - { .enumd = { \ - &(config_addr), \ - (enum), \ - (default), \ - (is_valid), \ - (update), \ - } } \ +constexpr standardConfig createEnumConfig(const char *name, const char *alias, int modifiable, configEnum *enumVal, int &config_addr, int defaultValue, int (*is_valid)(int,const char**), int (*update)(int,int,const char**)) { + standardConfig c = { + embedCommonConfig(name, alias, modifiable) + embedConfigInterface(configEnumInit, configEnumLoad, configEnumSet, configEnumGet, configEnumRewrite) + }; + c.data.enumd = { + &(config_addr), + (enumVal), + (defaultValue), + (is_valid), + (update), + }; + + return c; } /* Gets a 'long long val' and sets it into the union, using a macro to get @@ -1986,85 +1995,90 @@ static void numericConfigRewrite(typeData data, const char *name, struct rewrite #define INTEGER_CONFIG 0 #define MEMORY_CONFIG 1 -#define embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) { \ - embedCommonConfig(name, alias, modifiable) \ - embedConfigInterface(numericConfigInit, numericConfigLoad, numericConfigSet, numericConfigGet, numericConfigRewrite) \ - { .numeric = { \ - .is_memory = (memory), \ - .lower_bound = (lower), \ - .upper_bound = (upper), \ - .default_value = (default), \ - .is_valid_fn = (is_valid), \ - .update_fn = (update), - -#define createIntConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - .numeric_type = NUMERIC_TYPE_INT, \ - .config { .i = &(config_addr) } \ - } } \ +constexpr standardConfig embedCommonNumericalConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) { + standardConfig conf = { + embedCommonConfig(name, alias, modifiable) + embedConfigInterface(numericConfigInit, numericConfigLoad, numericConfigSet, numericConfigGet, numericConfigRewrite) + }; + conf.data.numeric.is_memory = (memory); + conf.data.numeric.lower_bound = (lower); + conf.data.numeric.upper_bound = (upper); + conf.data.numeric.default_value = (defaultValue); + conf.data.numeric.is_valid_fn = (is_valid); + conf.data.numeric.update_fn = (update); + return conf; } -#define createUIntConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - .numeric_type = NUMERIC_TYPE_UINT, \ - .config { .ui = &(config_addr) } \ - } } \ +constexpr standardConfig createIntConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, int &config_addr, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) +{ + standardConfig conf = embedCommonNumericalConfig(name, alias, modifiable, lower, upper, defaultValue, memory, is_valid, update); + conf.data.numeric.numeric_type = NUMERIC_TYPE_INT; + conf.data.numeric.config.i = &config_addr; + return conf; } -#define createLongConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - .numeric_type = NUMERIC_TYPE_LONG, \ - .config { .l = &(config_addr) } \ - } } \ +constexpr standardConfig createUIntConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, unsigned int &config_addr, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) +{ + auto conf = embedCommonNumericalConfig(name, alias, modifiable, lower, upper, defaultValue, memory, is_valid, update); + conf.data.numeric.numeric_type = NUMERIC_TYPE_UINT; + conf.data.numeric.config.ui = &(config_addr); + return conf; } -#define createULongConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - .numeric_type = NUMERIC_TYPE_ULONG, \ - .config { .ul = &(config_addr) } \ - } } \ +constexpr standardConfig createLongConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, long &config_addr, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) { + auto conf = embedCommonNumericalConfig(name, alias, modifiable, lower, upper, defaultValue, memory, is_valid, update); + conf.data.numeric.numeric_type = NUMERIC_TYPE_LONG; + conf.data.numeric.config.l = &(config_addr); + return conf; } -#define createLongLongConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - .numeric_type = NUMERIC_TYPE_LONG_LONG, \ - .config { .ll = &(config_addr) } \ - } } \ +constexpr standardConfig createULongConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, unsigned long &config_addr, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) { + auto conf = embedCommonNumericalConfig(name, alias, modifiable, lower, upper, defaultValue, memory, is_valid, update); + conf.data.numeric.numeric_type = NUMERIC_TYPE_ULONG; + conf.data.numeric.config.ul = &(config_addr); + return conf; } -#define createULongLongConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - .numeric_type = NUMERIC_TYPE_ULONG_LONG, \ - .config { .ull = &(config_addr) } \ - } } \ +constexpr standardConfig createLongLongConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, long long &config_addr, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) { + auto conf = embedCommonNumericalConfig(name, alias, modifiable, lower, upper, defaultValue, memory, is_valid, update); + conf.data.numeric.numeric_type = NUMERIC_TYPE_LONG_LONG; + conf.data.numeric.config.ll = &(config_addr); + return conf; } -#define createSizeTConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - .numeric_type = NUMERIC_TYPE_SIZE_T, \ - .config { .st = &(config_addr) } \ - } } \ +constexpr standardConfig createULongLongConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, unsigned long long &config_addr, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) { + auto conf = embedCommonNumericalConfig(name, alias, modifiable, lower, upper, defaultValue, memory, is_valid, update); + conf.data.numeric.numeric_type = NUMERIC_TYPE_ULONG_LONG; + conf.data.numeric.config.ull = &(config_addr); + return conf; } -#define createSSizeTConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - .numeric_type = NUMERIC_TYPE_SSIZE_T, \ - .config { .sst = &(config_addr) } \ - } } \ +constexpr standardConfig createSizeTConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, size_t &config_addr, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) { + auto conf = embedCommonNumericalConfig(name, alias, modifiable, lower, upper, defaultValue, memory, is_valid, update); + conf.data.numeric.numeric_type = NUMERIC_TYPE_SIZE_T; + conf.data.numeric.config.st = &(config_addr); + return conf; } -#define createTimeTConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - .numeric_type = NUMERIC_TYPE_TIME_T, \ - .config { .tt = &(config_addr) } \ - } } \ +constexpr standardConfig createSSizeTConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, ssize_t &config_addr, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) { + auto conf = embedCommonNumericalConfig(name, alias, modifiable, lower, upper, defaultValue, memory, is_valid, update); + conf.data.numeric.numeric_type = NUMERIC_TYPE_SSIZE_T; + conf.data.numeric.config.sst = &(config_addr); + return conf; } -#define createOffTConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \ - .numeric_type = NUMERIC_TYPE_OFF_T, \ - .config { .ot = &(config_addr) } \ - } } \ +constexpr standardConfig createTimeTConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, time_t &config_addr, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) { + auto conf = embedCommonNumericalConfig(name, alias, modifiable, lower, upper, defaultValue, memory, is_valid, update); + conf.data.numeric.numeric_type = NUMERIC_TYPE_TIME_T; + conf.data.numeric.config.tt = &(config_addr); + return conf; +} + +constexpr standardConfig createOffTConfig(const char *name, const char *alias, int modifiable, long long lower, long long upper, off_t &config_addr, long long defaultValue, int memory, int (*is_valid)(long long, const char**), int (*update)(long long, long long, const char**)) { + auto conf = embedCommonNumericalConfig(name, alias, modifiable, lower, upper, defaultValue, memory, is_valid, update); + conf.data.numeric.numeric_type = NUMERIC_TYPE_OFF_T; + conf.data.numeric.config.ot = &(config_addr); + return conf; } static int isValidActiveDefrag(int val, const char **err) { diff --git a/src/connection.cpp b/src/connection.cpp index b819c982a..fe987e3f0 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -330,19 +330,19 @@ static ssize_t connSocketSyncReadLine(connection *conn, char *ptr, ssize_t size, ConnectionType CT_Socket = { - .ae_handler = connSocketEventHandler, - .connect = connSocketConnect, - .write = connSocketWrite, - .read = connSocketRead, - .close = connSocketClose, - .accept = connSocketAccept, - .set_write_handler = connSocketSetWriteHandler, - .set_read_handler = connSocketSetReadHandler, - .get_last_error = connSocketGetLastError, - .blocking_connect = connSocketBlockingConnect, - .sync_write = connSocketSyncWrite, - .sync_read = connSocketSyncRead, - .sync_readline = connSocketSyncReadLine + connSocketEventHandler, + connSocketConnect, + connSocketWrite, + connSocketRead, + connSocketClose, + connSocketAccept, + connSocketSetWriteHandler, + connSocketSetReadHandler, + connSocketGetLastError, + connSocketBlockingConnect, + connSocketSyncWrite, + connSocketSyncRead, + connSocketSyncReadLine }; diff --git a/src/server.h b/src/server.h index d5cb48c92..0c7f6cc1a 100644 --- a/src/server.h +++ b/src/server.h @@ -241,7 +241,7 @@ public: #define C_ERR -1 /* Static server configuration */ -#define CONFIG_DEFAULT_HZ 20 /* Time interrupt calls/sec. */ +#define CONFIG_DEFAULT_HZ 10 /* Time interrupt calls/sec. */ #define CONFIG_MIN_HZ 1 #define CONFIG_MAX_HZ 500 #define MAX_CLIENTS_PER_CLOCK_TICK 200 /* HZ is adapted based on that. */