Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c801414b40 | ||
|
|
f4c317d285 |
No files matched your search
@@ -35,6 +35,7 @@
|
||||
#include <sys/stat.h>
|
||||
|
||||
const char *KEYDB_SET_VERSION = KEYDB_REAL_VERSION;
|
||||
char *replicateDbDisableString = nullptr; // The raw string the user provided so we can rewrite the same way
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Config file name-value maps.
|
||||
@@ -2192,6 +2193,79 @@ static int isValidAOFfilename(char *val, const char **err) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int updateDbDisable(char *val, const char **err) {
|
||||
cserver.setDbReplicateDisable.clear();
|
||||
serverLog(LL_WARNING, "UPDATE");
|
||||
if (val == nullptr)
|
||||
return 1;
|
||||
|
||||
char *pchCur = val;
|
||||
char *pchStart = val;
|
||||
int dbStart = -1;
|
||||
|
||||
for (;;) {
|
||||
char *endptr;
|
||||
switch (*pchCur)
|
||||
{
|
||||
case '-':
|
||||
if (pchStart < pchCur && dbStart < 0) {
|
||||
errno = 0;
|
||||
dbStart = strtol(pchStart, &endptr, 10);
|
||||
if (errno || endptr != pchCur || dbStart < 0) {
|
||||
*err = "Invalid database in list";
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
*err = "Invalid database range in list";
|
||||
return 0;
|
||||
}
|
||||
pchStart = pchCur + 1;
|
||||
break;
|
||||
|
||||
case ' ':
|
||||
case '\0':
|
||||
if (pchStart < pchCur) {
|
||||
errno = 0;
|
||||
int db = strtol(pchStart, &endptr, 10);
|
||||
if (errno || endptr != pchCur || db < 0) {
|
||||
*err = "Invalid database in list";
|
||||
return 0;
|
||||
}
|
||||
if (dbStart < 0)
|
||||
dbStart = db;
|
||||
for (;dbStart <= db; ++dbStart) {
|
||||
if (cserver.setDbReplicateDisable.find(dbStart) == cserver.setDbReplicateDisable.end()) {
|
||||
cserver.setDbReplicateDisable.insert(dbStart);
|
||||
}
|
||||
}
|
||||
dbStart = -1;
|
||||
}
|
||||
pchStart = pchCur + 1;
|
||||
break;
|
||||
}
|
||||
if (*pchCur == '\0')
|
||||
break;
|
||||
++pchCur;
|
||||
}
|
||||
|
||||
if (dbStart >= 0) {
|
||||
*err = "Incomplete database range";
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Display the disabled databases in the log (sorted ascending)
|
||||
std::vector<int> vecdb;
|
||||
for (int db : cserver.setDbReplicateDisable) {
|
||||
vecdb.push_back(db);
|
||||
}
|
||||
std::sort(vecdb.begin(), vecdb.end());
|
||||
for (int db : vecdb) {
|
||||
serverLog(LL_WARNING, "Replicate disabled for DB: %d", db);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int updateHZ(long long val, long long prev, const char **err) {
|
||||
UNUSED(prev);
|
||||
UNUSED(err);
|
||||
@@ -2394,6 +2468,7 @@ standardConfig configs[] = {
|
||||
createStringConfig("bio_cpulist", NULL, IMMUTABLE_CONFIG, EMPTY_STRING_IS_NULL, g_pserver->bio_cpulist, NULL, NULL, NULL),
|
||||
createStringConfig("aof_rewrite_cpulist", NULL, IMMUTABLE_CONFIG, EMPTY_STRING_IS_NULL, g_pserver->aof_rewrite_cpulist, NULL, NULL, NULL),
|
||||
createStringConfig("bgsave_cpulist", NULL, IMMUTABLE_CONFIG, EMPTY_STRING_IS_NULL, g_pserver->bgsave_cpulist, NULL, NULL, NULL),
|
||||
createStringConfig("replicate-db-disable", NULL, IMMUTABLE_CONFIG, EMPTY_STRING_IS_NULL, replicateDbDisableString, nullptr, updateDbDisable, nullptr),
|
||||
|
||||
/* Enum Configs */
|
||||
createEnumConfig("supervised", NULL, IMMUTABLE_CONFIG, supervised_mode_enum, cserver.supervised_mode, SUPERVISED_NONE, NULL, NULL),
|
||||
|
||||
+1
-1
@@ -2496,7 +2496,7 @@ void readQueryFromClient(connection *conn) {
|
||||
sdsIncrLen(c->querybuf,nread);
|
||||
c->lastinteraction = g_pserver->unixtime;
|
||||
if (c->flags & CLIENT_MASTER) c->read_reploff += nread;
|
||||
g_pserver->stat_net_input_bytes += nread;
|
||||
g_pserver->stat_net_input_bytes.fetch_add(nread, std::memory_order_relaxed);
|
||||
if (sdslen(c->querybuf) > cserver.client_max_querybuf_len) {
|
||||
sds ci = catClientInfoString(sdsempty(),c), bytes = sdsempty();
|
||||
|
||||
|
||||
@@ -377,6 +377,11 @@ void replicationFeedSlaves(list *slaves, int dictid, robj **argv, int argc) {
|
||||
serverAssert(GlobalLocksAcquired());
|
||||
static client *fake = nullptr;
|
||||
|
||||
if (cserver.setDbReplicateDisable.find(dictid) != cserver.setDbReplicateDisable.end()) {
|
||||
if (strcasecmp(szFromObj(argv[0]), "ping") != 0)
|
||||
return;
|
||||
}
|
||||
|
||||
if (dictid < 0)
|
||||
dictid = 0; // this can happen if we send a PING before any real operation
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <mutex>
|
||||
#include <unordered_set>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#include <lua.h>
|
||||
@@ -1457,6 +1458,8 @@ struct redisServerConst {
|
||||
bool fUsePro = false;
|
||||
int thread_min_client_threshold = 50;
|
||||
int multimaster_no_forward;
|
||||
|
||||
std::unordered_set<int> setDbReplicateDisable;
|
||||
};
|
||||
|
||||
struct redisServer {
|
||||
|
||||
@@ -91,6 +91,7 @@ start_server {tags {"introspection"}} {
|
||||
aof_rewrite_cpulist
|
||||
bgsave_cpulist
|
||||
active-replica
|
||||
replicate-db-disable
|
||||
}
|
||||
|
||||
if {!$::tls} {
|
||||
|
||||
Reference in new issue
Block a user