From 6daa29da467b9ada923c9ba4834aefc2cc76558d Mon Sep 17 00:00:00 2001 From: Jonathan Pickett Date: Wed, 22 Jan 2014 17:03:44 -0800 Subject: [PATCH 1/6] added failure error messages back in to QFork MasterInit --- src/Win32_Interop/Win32_QFork.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Win32_Interop/Win32_QFork.cpp b/src/Win32_Interop/Win32_QFork.cpp index 6b3cc8fb..d4b57c4b 100644 --- a/src/Win32_Interop/Win32_QFork.cpp +++ b/src/Win32_Interop/Win32_QFork.cpp @@ -257,6 +257,7 @@ BOOL QForkMasterInit() { 0, sizeof(QForkControl), NULL); if (g_hQForkControlFileMap == NULL) { + printf( "Problem with CreateFileMapping\n"); errno = EBADF; goto err; } @@ -267,6 +268,7 @@ BOOL QForkMasterInit() { 0, 0, 0); if (g_pQForkControl == NULL) { + printf( "Problem with MapViewOfFile\n"); errno = ENOMEM; goto err; } @@ -274,6 +276,7 @@ BOOL QForkMasterInit() { // This must be called only once per process! Calling it more times than that will not recreate existing // section, and dlmalloc will ultimately fail with an access violation. Once is good. if (dlmallopt(M_GRANULARITY, cAllocationGranularity) == 0) { + printf( "DLMalloc failed initializing allocation granularity.\n"); errno = ENOMEM; goto err; } @@ -286,6 +289,7 @@ BOOL QForkMasterInit() { SIZE_T maxPhysicalMapping = ms.ullTotalPhys - cSystemReserve; g_pQForkControl->availableBlocksInHeap = (int)(maxPhysicalMapping / cAllocationGranularity); if (g_pQForkControl->availableBlocksInHeap <= 0) { + printf( "Not enough physical memory to initialize Redis. Physical memory must be greater than 3GB.\n"); errno = ENOMEM; goto err; } @@ -308,6 +312,7 @@ BOOL QForkMasterInit() { FILE_ATTRIBUTE_NORMAL| FILE_FLAG_DELETE_ON_CLOSE, NULL ); if (g_pQForkControl->heapMemoryMapFile == INVALID_HANDLE_VALUE) { + printf( "Problem creating memory mapped file.\n"); errno = EBADF; goto err; } @@ -322,6 +327,7 @@ BOOL QForkMasterInit() { LODWORD(mmSize), NULL); if (g_pQForkControl->heapMemoryMap == NULL) { + printf( "Problem mapping heap.\n"); errno = EBADF; goto err; } @@ -336,6 +342,7 @@ BOOL QForkMasterInit() { MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE); if (pHigh == NULL) { + printf( "Viirtual memory reservation failed.\n"); DWORD err = GetLastError(); errno = ENOMEM; goto err; @@ -354,6 +361,7 @@ BOOL QForkMasterInit() { 0, pHigh); if (g_pQForkControl->heapStart == NULL) { + printf( "Mapping view of heap failed.\n"); DWORD err = GetLastError(); errno = ENOMEM; goto err; @@ -395,6 +403,12 @@ BOOL QForkMasterInit() { return TRUE; err: + printf( "Error ocurred initializing Redis."); + if( GetLastError() != 0 ) { + printf( " GetLastError() returns 0x%08x", GetLastError()); + } + printf( "\n"); + return FALSE; } From e35841ce76329dc6f2386735b29f2972baecdf2a Mon Sep 17 00:00:00 2001 From: Jonathan Pickett Date: Mon, 27 Jan 2014 19:26:47 -0800 Subject: [PATCH 2/6] --loglevel command line argument was not working --- src/config.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config.c b/src/config.c index 14de1a1b..82d32ad3 100644 --- a/src/config.c +++ b/src/config.c @@ -140,6 +140,9 @@ void loadServerConfigFromString(char *config) { err = "Invalid log level. Must be one of debug, notice, warning"; goto loaderr; } +#ifdef _WIN32 + setLogVerbosityLevel(server.verbosity); +#endif } else if (!strcasecmp(argv[0],"logfile") && argc == 2) { FILE *logfp; From e1f312e547ee092be024946e47cc75f8276f256f Mon Sep 17 00:00:00 2001 From: Jonathan Pickett Date: Mon, 27 Jan 2014 21:12:31 -0800 Subject: [PATCH 3/6] redis log not working with anything ofther than stdout --- src/RedisLog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/RedisLog.c b/src/RedisLog.c index bd17142b..416ad536 100644 --- a/src/RedisLog.c +++ b/src/RedisLog.c @@ -45,7 +45,7 @@ void setLogFile(const char* logFileName) free((void*)logFile); logFile = NULL; } - logFile = (char*)malloc(strlen(logFile)); + logFile = (char*)malloc(strlen(logFileName)); if (logFile==NULL) { redisLog(REDIS_WARNING, "memory allocation failure"); return; From 66b7f8a0440af464b5867d74a167d6c5b8447650 Mon Sep 17 00:00:00 2001 From: Jonathan Pickett Date: Tue, 28 Jan 2014 11:49:20 -0800 Subject: [PATCH 4/6] working through issues regarding sentinal not working --- deps/hiredis/async.c | 6 +++--- src/Win32_Interop/win32fixes.c | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/deps/hiredis/async.c b/deps/hiredis/async.c index b95b86fa..4bdfd384 100644 --- a/deps/hiredis/async.c +++ b/deps/hiredis/async.c @@ -156,9 +156,9 @@ redisAsyncContext *redisAsyncConnect(const char *ip, int port) { struct sockaddr_in sa; redisContext *c = redisPreConnectNonBlock(ip, port, &sa); redisAsyncContext *ac = redisAsyncInitialize(c); - if (aeWinSocketConnect(c->fd, (struct sockaddr *)&sa, sizeof(sa)) != 0) { - c->err = errno; - strerror_r(errno,c->errstr,sizeof(c->errstr)); + if (aeWinSocketConnect(ac->c.fd, (struct sockaddr *)&sa, sizeof(sa)) != 0) { + ac->c.err = errno; + strerror_r(errno,ac->c.errstr,sizeof(ac->c.errstr)); } __redisAsyncCopyError(ac); return ac; diff --git a/src/Win32_Interop/win32fixes.c b/src/Win32_Interop/win32fixes.c index 0afc27e2..48c2c7d1 100644 --- a/src/Win32_Interop/win32fixes.c +++ b/src/Win32_Interop/win32fixes.c @@ -84,6 +84,24 @@ pid_t wait3(int *stat_loc, int options, void *rusage) { REDIS_NOTUSED(stat_loc); REDIS_NOTUSED(options); REDIS_NOTUSED(rusage); +//JEP: BUGBUG +// http://linux.die.net/man/2/wait3 says: +// "wait3(status, options, rusage); is equivalent to: waitpid(-1, status, options); " +// +// http://linux.die.net/man/2/waitpid says: +// "The value of pid can be: +// < -1 meaning wait for any child process whose process group ID is equal to the absolute value of pid. +// -1 meaning wait for any child process. +// 0 meaning wait for any child process whose process group ID is equal to that of the calling process. +// > 0 meaning wait for the child whose process ID is equal to the value of pid." +// +// On Windows waitpid evaluates to _cwait, so the -1 passed referrs to the current process. Thus it will never signal. +// +// Since windows parent->child relationships are unreliable (process ids are recycled leading to unexpected PID relationships), +// the hiredis mechanism of process signaling will have to be changed. It should be using process handles on Windows. + + + return (pid_t) waitpid((intptr_t) -1, 0, WAIT_FLAGS); } From 8812fe61bd666726114b6ec8dac4849060b086f4 Mon Sep 17 00:00:00 2001 From: Jonathan Pickett Date: Tue, 28 Jan 2014 11:58:14 -0800 Subject: [PATCH 5/6] added lua and hiredis libs as project references --- msvs/RedisServer.vcxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/msvs/RedisServer.vcxproj b/msvs/RedisServer.vcxproj index 89850d81..8e8c02cb 100644 --- a/msvs/RedisServer.vcxproj +++ b/msvs/RedisServer.vcxproj @@ -171,6 +171,12 @@ {8c07f811-c81c-432c-b334-1ae6faecf951} + + {13e85053-54b3-487b-8ddb-3430b1c1b3bf} + + + {170b0909-5f75-467f-9501-c99dec16c6dc} + From 4440406bb5892a6bd2578cc5022d908ecb3cd497 Mon Sep 17 00:00:00 2001 From: Jonathan Pickett Date: Tue, 28 Jan 2014 18:08:38 -0800 Subject: [PATCH 6/6] Using project reference rather than linker library input. This fixes the annoying 'do you want to rebuild the universe just because you pressed F5' problem. Built is now built. --- msvs/RedisCheckAof/RedisCheckAof.vcxproj | 4 ++-- msvs/RedisCli/RedisCli.vcxproj | 7 +++++-- msvs/RedisServer.vcxproj | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/msvs/RedisCheckAof/RedisCheckAof.vcxproj b/msvs/RedisCheckAof/RedisCheckAof.vcxproj index 1b35edc3..3ecfd947 100644 --- a/msvs/RedisCheckAof/RedisCheckAof.vcxproj +++ b/msvs/RedisCheckAof/RedisCheckAof.vcxproj @@ -57,7 +57,7 @@ true $(OutDir)redis-check-aof$(TargetExt) - ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) false MSVCRT UseLinkTimeCodeGeneration @@ -79,7 +79,7 @@ true true $(OutDir)redis-check-aof$(TargetExt) - ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) false diff --git a/msvs/RedisCli/RedisCli.vcxproj b/msvs/RedisCli/RedisCli.vcxproj index 26628ef6..23d63e0f 100644 --- a/msvs/RedisCli/RedisCli.vcxproj +++ b/msvs/RedisCli/RedisCli.vcxproj @@ -58,7 +58,7 @@ true $(OutDir)redis-cli$(TargetExt) $(OutDir);$(OutDir)lib - hiredis.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) false MSVCRT UseLinkTimeCodeGeneration @@ -81,7 +81,7 @@ true $(OutDir)redis-cli$(TargetExt) $(OutDir);$(OutDir)lib - hiredis.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) false @@ -102,6 +102,9 @@ {8c07f811-c81c-432c-b334-1ae6faecf951} + + {13e85053-54b3-487b-8ddb-3430b1c1b3bf} + diff --git a/msvs/RedisServer.vcxproj b/msvs/RedisServer.vcxproj index 8e8c02cb..304db548 100644 --- a/msvs/RedisServer.vcxproj +++ b/msvs/RedisServer.vcxproj @@ -60,7 +60,7 @@ true Console $(OutDir);$(OutDir)lib - lua.lib;hiredis.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;advapi32.lib;shell32.lib;%(AdditionalDependencies) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;advapi32.lib;shell32.lib;%(AdditionalDependencies) false UseLinkTimeCodeGeneration MSVCRT.lib @@ -82,7 +82,7 @@ true true $(OutDir);$(OutDir)lib - lua.lib;hiredis.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;advapi32.lib;shell32.lib;%(AdditionalDependencies) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;advapi32.lib;shell32.lib;%(AdditionalDependencies) false UseLinkTimeCodeGeneration