add daily github actions with libc malloc and valgrind
* fix memlry leaks with diskless replica short read. * fix a few timing issues with valgrind runs * fix issue with valgrind and watchdog schedule signal about the valgrind WD issue: the stack trace test in logging.tcl, has issues with valgrind: ==28808== Can't extend stack to 0x1ffeffdb38 during signal delivery for thread 1: ==28808== too small or bad protection modes it seems to be some valgrind bug with SA_ONSTACK. SA_ONSTACK seems unneeded since WD is not recursive (SA_NODEFER was removed), also, not sure if it's even valid without a call to sigaltstack()
This commit is contained in:
parent
a3c7ee6fa3
commit
2b9d070df3
48
.github/workflows/daily.yml
vendored
Normal file
48
.github/workflows/daily.yml
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
name: Daily
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 7 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-jemalloc:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 1200
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: make
|
||||||
|
run: make
|
||||||
|
- name: test
|
||||||
|
run: |
|
||||||
|
sudo apt-get install tcl8.5
|
||||||
|
./runtest --accurate --verbose
|
||||||
|
- name: module api test
|
||||||
|
run: ./runtest-moduleapi --verbose
|
||||||
|
|
||||||
|
test-libc-malloc:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 1200
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: make
|
||||||
|
run: make MALLOC=libc
|
||||||
|
- name: test
|
||||||
|
run: |
|
||||||
|
sudo apt-get install tcl8.5
|
||||||
|
./runtest --accurate --verbose
|
||||||
|
- name: module api test
|
||||||
|
run: ./runtest-moduleapi --verbose
|
||||||
|
|
||||||
|
test-valgrind:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 14400
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: make
|
||||||
|
run: make valgrind
|
||||||
|
- name: test
|
||||||
|
run: |
|
||||||
|
sudo apt-get install tcl8.5 valgrind -y
|
||||||
|
./runtest --valgrind --verbose --clients 1
|
||||||
|
- name: module api test
|
||||||
|
run: ./runtest-moduleapi --valgrind --verbose --clients 1
|
@ -1636,7 +1636,7 @@ void enableWatchdog(int period) {
|
|||||||
/* Watchdog was actually disabled, so we have to setup the signal
|
/* Watchdog was actually disabled, so we have to setup the signal
|
||||||
* handler. */
|
* handler. */
|
||||||
sigemptyset(&act.sa_mask);
|
sigemptyset(&act.sa_mask);
|
||||||
act.sa_flags = SA_ONSTACK | SA_SIGINFO;
|
act.sa_flags = SA_SIGINFO;
|
||||||
act.sa_sigaction = watchdogSignalHandler;
|
act.sa_sigaction = watchdogSignalHandler;
|
||||||
sigaction(SIGALRM, &act, NULL);
|
sigaction(SIGALRM, &act, NULL);
|
||||||
}
|
}
|
||||||
|
60
src/rdb.c
60
src/rdb.c
@ -1441,7 +1441,10 @@ robj *rdbLoadObject(int rdbtype, rio *rdb, sds key) {
|
|||||||
|
|
||||||
/* Load every single element of the list */
|
/* Load every single element of the list */
|
||||||
while(len--) {
|
while(len--) {
|
||||||
if ((ele = rdbLoadEncodedStringObject(rdb)) == NULL) return NULL;
|
if ((ele = rdbLoadEncodedStringObject(rdb)) == NULL) {
|
||||||
|
decrRefCount(o);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
dec = getDecodedObject(ele);
|
dec = getDecodedObject(ele);
|
||||||
size_t len = sdslen(dec->ptr);
|
size_t len = sdslen(dec->ptr);
|
||||||
quicklistPushTail(o->ptr, dec->ptr, len);
|
quicklistPushTail(o->ptr, dec->ptr, len);
|
||||||
@ -1468,8 +1471,10 @@ robj *rdbLoadObject(int rdbtype, rio *rdb, sds key) {
|
|||||||
long long llval;
|
long long llval;
|
||||||
sds sdsele;
|
sds sdsele;
|
||||||
|
|
||||||
if ((sdsele = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL))
|
if ((sdsele = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL)) == NULL) {
|
||||||
== NULL) return NULL;
|
decrRefCount(o);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (o->encoding == OBJ_ENCODING_INTSET) {
|
if (o->encoding == OBJ_ENCODING_INTSET) {
|
||||||
/* Fetch integer value from element. */
|
/* Fetch integer value from element. */
|
||||||
@ -1508,13 +1513,23 @@ robj *rdbLoadObject(int rdbtype, rio *rdb, sds key) {
|
|||||||
double score;
|
double score;
|
||||||
zskiplistNode *znode;
|
zskiplistNode *znode;
|
||||||
|
|
||||||
if ((sdsele = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL))
|
if ((sdsele = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL)) == NULL) {
|
||||||
== NULL) return NULL;
|
decrRefCount(o);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (rdbtype == RDB_TYPE_ZSET_2) {
|
if (rdbtype == RDB_TYPE_ZSET_2) {
|
||||||
if (rdbLoadBinaryDoubleValue(rdb,&score) == -1) return NULL;
|
if (rdbLoadBinaryDoubleValue(rdb,&score) == -1) {
|
||||||
|
decrRefCount(o);
|
||||||
|
sdsfree(sdsele);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (rdbLoadDoubleValue(rdb,&score) == -1) return NULL;
|
if (rdbLoadDoubleValue(rdb,&score) == -1) {
|
||||||
|
decrRefCount(o);
|
||||||
|
sdsfree(sdsele);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't care about integer-encoded strings. */
|
/* Don't care about integer-encoded strings. */
|
||||||
@ -1546,10 +1561,15 @@ robj *rdbLoadObject(int rdbtype, rio *rdb, sds key) {
|
|||||||
while (o->encoding == OBJ_ENCODING_ZIPLIST && len > 0) {
|
while (o->encoding == OBJ_ENCODING_ZIPLIST && len > 0) {
|
||||||
len--;
|
len--;
|
||||||
/* Load raw strings */
|
/* Load raw strings */
|
||||||
if ((field = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL))
|
if ((field = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL)) == NULL) {
|
||||||
== NULL) return NULL;
|
decrRefCount(o);
|
||||||
if ((value = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL))
|
return NULL;
|
||||||
== NULL) return NULL;
|
}
|
||||||
|
if ((value = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL)) == NULL) {
|
||||||
|
sdsfree(field);
|
||||||
|
decrRefCount(o);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Add pair to ziplist */
|
/* Add pair to ziplist */
|
||||||
o->ptr = ziplistPush(o->ptr, (unsigned char*)field,
|
o->ptr = ziplistPush(o->ptr, (unsigned char*)field,
|
||||||
@ -1577,10 +1597,15 @@ robj *rdbLoadObject(int rdbtype, rio *rdb, sds key) {
|
|||||||
while (o->encoding == OBJ_ENCODING_HT && len > 0) {
|
while (o->encoding == OBJ_ENCODING_HT && len > 0) {
|
||||||
len--;
|
len--;
|
||||||
/* Load encoded strings */
|
/* Load encoded strings */
|
||||||
if ((field = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL))
|
if ((field = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL)) == NULL) {
|
||||||
== NULL) return NULL;
|
decrRefCount(o);
|
||||||
if ((value = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL))
|
return NULL;
|
||||||
== NULL) return NULL;
|
}
|
||||||
|
if ((value = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS,NULL)) == NULL) {
|
||||||
|
sdsfree(field);
|
||||||
|
decrRefCount(o);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Add pair to hash table */
|
/* Add pair to hash table */
|
||||||
ret = dictAdd((dict*)o->ptr, field, value);
|
ret = dictAdd((dict*)o->ptr, field, value);
|
||||||
@ -1600,7 +1625,10 @@ robj *rdbLoadObject(int rdbtype, rio *rdb, sds key) {
|
|||||||
while (len--) {
|
while (len--) {
|
||||||
unsigned char *zl =
|
unsigned char *zl =
|
||||||
rdbGenericLoadStringObject(rdb,RDB_LOAD_PLAIN,NULL);
|
rdbGenericLoadStringObject(rdb,RDB_LOAD_PLAIN,NULL);
|
||||||
if (zl == NULL) return NULL;
|
if (zl == NULL) {
|
||||||
|
decrRefCount(o);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
quicklistAppendZiplist(o->ptr, zl);
|
quicklistAppendZiplist(o->ptr, zl);
|
||||||
}
|
}
|
||||||
} else if (rdbtype == RDB_TYPE_HASH_ZIPMAP ||
|
} else if (rdbtype == RDB_TYPE_HASH_ZIPMAP ||
|
||||||
|
@ -54,6 +54,12 @@ tags {"aof"} {
|
|||||||
|
|
||||||
set client [redis [dict get $srv host] [dict get $srv port] 0 $::tls]
|
set client [redis [dict get $srv host] [dict get $srv port] 0 $::tls]
|
||||||
|
|
||||||
|
wait_for_condition 50 100 {
|
||||||
|
[catch {$client ping} e] == 0
|
||||||
|
} else {
|
||||||
|
fail "Loading DB is taking too much time."
|
||||||
|
}
|
||||||
|
|
||||||
test "Truncated AOF loaded: we expect foo to be equal to 5" {
|
test "Truncated AOF loaded: we expect foo to be equal to 5" {
|
||||||
assert {[$client get foo] eq "5"}
|
assert {[$client get foo] eq "5"}
|
||||||
}
|
}
|
||||||
@ -71,6 +77,12 @@ tags {"aof"} {
|
|||||||
|
|
||||||
set client [redis [dict get $srv host] [dict get $srv port] 0 $::tls]
|
set client [redis [dict get $srv host] [dict get $srv port] 0 $::tls]
|
||||||
|
|
||||||
|
wait_for_condition 50 100 {
|
||||||
|
[catch {$client ping} e] == 0
|
||||||
|
} else {
|
||||||
|
fail "Loading DB is taking too much time."
|
||||||
|
}
|
||||||
|
|
||||||
test "Truncated AOF loaded: we expect foo to be equal to 6 now" {
|
test "Truncated AOF loaded: we expect foo to be equal to 6 now" {
|
||||||
assert {[$client get foo] eq "6"}
|
assert {[$client get foo] eq "6"}
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,7 @@ start_server {tags {"repl"}} {
|
|||||||
# correctly the RDB file: such file will contain "lua" AUX
|
# correctly the RDB file: such file will contain "lua" AUX
|
||||||
# sections with scripts already in the memory of the master.
|
# sections with scripts already in the memory of the master.
|
||||||
|
|
||||||
wait_for_condition 50 100 {
|
wait_for_condition 500 100 {
|
||||||
[s -1 master_link_status] eq {up}
|
[s -1 master_link_status] eq {up}
|
||||||
} else {
|
} else {
|
||||||
fail "Replication not started."
|
fail "Replication not started."
|
||||||
|
Loading…
x
Reference in New Issue
Block a user