Now tracks memory and resizes 'accurately', need to fix cluster
Former-commit-id: 5f0e01cc199427ab6dfd7f8f28321f6a1f34fd1c
This commit is contained in:
parent
7ef58a333f
commit
f6305ed15b
@ -2347,6 +2347,7 @@ static int updateReplBacklogSize(long long val, long long prev, const char **err
|
|||||||
UNUSED(err);
|
UNUSED(err);
|
||||||
g_pserver->repl_backlog_size = prev;
|
g_pserver->repl_backlog_size = prev;
|
||||||
resizeReplicationBacklog(val);
|
resizeReplicationBacklog(val);
|
||||||
|
g_pserver->repl_backlog_config_size = g_pserver->repl_backlog_size;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,9 +392,16 @@ size_t freeMemoryGetNotCountedMemory(void) {
|
|||||||
while((ln = listNext(&li))) {
|
while((ln = listNext(&li))) {
|
||||||
client *replica = (client*)listNodeValue(ln);
|
client *replica = (client*)listNodeValue(ln);
|
||||||
std::unique_lock<fastlock>(replica->lock);
|
std::unique_lock<fastlock>(replica->lock);
|
||||||
overhead += getClientOutputBufferMemoryUsage(replica);
|
/* we don't wish to multiple count the replication backlog shared usage */
|
||||||
|
overhead += (getClientOutputBufferMemoryUsage(replica) - getClientReplicationBacklogSharedUsage(replica));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* also don't count the replication backlog memory
|
||||||
|
* that's where the replication clients get their memory from */
|
||||||
|
overhead += (g_pserver->repl_backlog_size - g_pserver->repl_backlog_config_size);
|
||||||
|
|
||||||
|
|
||||||
if (g_pserver->aof_state != AOF_OFF) {
|
if (g_pserver->aof_state != AOF_OFF) {
|
||||||
overhead += sdsalloc(g_pserver->aof_buf)+aofRewriteBufferSize();
|
overhead += sdsalloc(g_pserver->aof_buf)+aofRewriteBufferSize();
|
||||||
}
|
}
|
||||||
@ -516,6 +523,7 @@ int freeMemoryIfNeeded(bool fQuickCycle, bool fPreSnapshot) {
|
|||||||
if (g_pserver->maxmemory_policy == MAXMEMORY_NO_EVICTION)
|
if (g_pserver->maxmemory_policy == MAXMEMORY_NO_EVICTION)
|
||||||
goto cant_free; /* We need to free memory, but policy forbids. */
|
goto cant_free; /* We need to free memory, but policy forbids. */
|
||||||
|
|
||||||
|
serverLog(LL_NOTICE, "evicting i guess lol, the overhead was %ld, the repl_backlog_size, %lld", freeMemoryGetNotCountedMemory(), g_pserver->repl_backlog_size);
|
||||||
while (mem_freed < mem_tofree) {
|
while (mem_freed < mem_tofree) {
|
||||||
int j, k, i;
|
int j, k, i;
|
||||||
static unsigned int next_db = 0;
|
static unsigned int next_db = 0;
|
||||||
|
@ -224,7 +224,6 @@ void clientInstallWriteHandler(client *c) {
|
|||||||
(c->replstate == REPL_STATE_NONE ||
|
(c->replstate == REPL_STATE_NONE ||
|
||||||
(c->replstate == SLAVE_STATE_ONLINE && !c->repl_put_online_on_ack)))
|
(c->replstate == SLAVE_STATE_ONLINE && !c->repl_put_online_on_ack)))
|
||||||
{
|
{
|
||||||
// serverLog(LL_NOTICE, "we installing boyz");
|
|
||||||
AssertCorrectThread(c);
|
AssertCorrectThread(c);
|
||||||
serverAssert(c->lock.fOwnLock());
|
serverAssert(c->lock.fOwnLock());
|
||||||
/* Here instead of installing the write handler, we just flag the
|
/* Here instead of installing the write handler, we just flag the
|
||||||
@ -1801,6 +1800,9 @@ int writeToClient(client *c, int handler_installed) {
|
|||||||
if (nwrittenPart2 == -1) nwritten = -1;
|
if (nwrittenPart2 == -1) nwritten = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c->flags & CLIENT_SLAVE && handler_installed)
|
||||||
|
serverLog(LL_NOTICE, "Total bytes written, %ld, write handler installed?: %d", totwritten, handler_installed);
|
||||||
|
|
||||||
g_pserver->stat_net_output_bytes += totwritten;
|
g_pserver->stat_net_output_bytes += totwritten;
|
||||||
if (nwritten == -1) {
|
if (nwritten == -1) {
|
||||||
if (connGetState(c->conn) == CONN_STATE_CONNECTED) {
|
if (connGetState(c->conn) == CONN_STATE_CONNECTED) {
|
||||||
@ -1821,6 +1823,11 @@ int writeToClient(client *c, int handler_installed) {
|
|||||||
if (!(c->flags & CLIENT_MASTER)) c->lastinteraction = g_pserver->unixtime;
|
if (!(c->flags & CLIENT_MASTER)) c->lastinteraction = g_pserver->unixtime;
|
||||||
}
|
}
|
||||||
if (!clientHasPendingReplies(c) && c->repl_curr_idx == -1) {
|
if (!clientHasPendingReplies(c) && c->repl_curr_idx == -1) {
|
||||||
|
if(c->flags & CLIENT_SLAVE && handler_installed){
|
||||||
|
serverLog(LL_NOTICE, "Uninstalling handler");
|
||||||
|
serverLog(LL_NOTICE, "handler repl_backlog_idx: %lld, repl_curr_idx: %lld, repl_backlog_size: %lld", repl_backlog_idx, c->repl_curr_idx, g_pserver->repl_backlog_size);
|
||||||
|
serverLog(LL_NOTICE, "handler repl_curr_off: %lld, master_repl_offset: %lld", c->repl_curr_off, g_pserver->master_repl_offset);
|
||||||
|
}
|
||||||
c->sentlen = 0;
|
c->sentlen = 0;
|
||||||
if (handler_installed) connSetWriteHandler(c->conn, NULL);
|
if (handler_installed) connSetWriteHandler(c->conn, NULL);
|
||||||
|
|
||||||
@ -1836,6 +1843,7 @@ int writeToClient(client *c, int handler_installed) {
|
|||||||
/* Write event handler. Just send data to the client. */
|
/* Write event handler. Just send data to the client. */
|
||||||
void sendReplyToClient(connection *conn) {
|
void sendReplyToClient(connection *conn) {
|
||||||
client *c = (client*)connGetPrivateData(conn);
|
client *c = (client*)connGetPrivateData(conn);
|
||||||
|
serverLog(LL_NOTICE, "called the sendreplytoclient");
|
||||||
if (writeToClient(c,1) == C_ERR)
|
if (writeToClient(c,1) == C_ERR)
|
||||||
{
|
{
|
||||||
AeLocker ae;
|
AeLocker ae;
|
||||||
@ -1970,6 +1978,7 @@ int handleClientsWithPendingWrites(int iel, int aof_state) {
|
|||||||
|
|
||||||
auto vec = std::move(g_pserver->rgthreadvar[iel].clients_pending_write);
|
auto vec = std::move(g_pserver->rgthreadvar[iel].clients_pending_write);
|
||||||
processed += (int)vec.size();
|
processed += (int)vec.size();
|
||||||
|
// serverLog(LL_NOTICE, "entered handleClientsWithPendingWrites");
|
||||||
|
|
||||||
for (client *c : vec) {
|
for (client *c : vec) {
|
||||||
serverAssertDebug(FCorrectThread(c));
|
serverAssertDebug(FCorrectThread(c));
|
||||||
@ -2008,8 +2017,10 @@ int handleClientsWithPendingWrites(int iel, int aof_state) {
|
|||||||
/* If after the synchronous writes above we still have data to
|
/* If after the synchronous writes above we still have data to
|
||||||
* output to the client, we need to install the writable handler. */
|
* output to the client, we need to install the writable handler. */
|
||||||
if (clientHasPendingReplies(c) || c->repl_curr_idx != -1) {
|
if (clientHasPendingReplies(c) || c->repl_curr_idx != -1) {
|
||||||
if (connSetWriteHandlerWithBarrier(c->conn, sendReplyToClient, ae_flags, true) == C_ERR)
|
serverLog(LL_NOTICE, "Setting a write handler for later");
|
||||||
|
if (connSetWriteHandlerWithBarrier(c->conn, sendReplyToClient, ae_flags, true) == C_ERR) {
|
||||||
freeClientAsync(c);
|
freeClientAsync(c);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3359,11 +3370,6 @@ void rewriteClientCommandArgument(client *c, int i, robj *newval) {
|
|||||||
* that writes to said replica are using data from the replication backlog
|
* that writes to said replica are using data from the replication backlog
|
||||||
* as opposed to it's own internal buffer, this number should keep track of that */
|
* as opposed to it's own internal buffer, this number should keep track of that */
|
||||||
unsigned long getClientReplicationBacklogSharedUsage(client *c) {
|
unsigned long getClientReplicationBacklogSharedUsage(client *c) {
|
||||||
if (c->flags & CLIENT_SLAVE && c->repl_curr_idx != -1){
|
|
||||||
// serverLog(LL_NOTICE, "repl_backlog_size %lld, repl_backlog_idx %lld, master_repl_offset %lld, repl_curr_idx %lld, repl_curr_off %lld",
|
|
||||||
// g_pserver->repl_backlog_size, g_pserver->repl_backlog_idx, g_pserver->master_repl_offset, c->repl_curr_idx, c->repl_curr_off);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (!(c->flags & CLIENT_SLAVE) || c->repl_curr_idx == -1) ? 0 : g_pserver->master_repl_offset - c->repl_curr_off;
|
return (!(c->flags & CLIENT_SLAVE) || c->repl_curr_idx == -1) ? 0 : g_pserver->master_repl_offset - c->repl_curr_off;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4684,5 +4684,21 @@ void flushReplBacklogToClients()
|
|||||||
// This may be called multiple times per "frame" so update with our progress flushing to clients
|
// This may be called multiple times per "frame" so update with our progress flushing to clients
|
||||||
g_pserver->repl_batch_idxStart = g_pserver->repl_backlog_idx;
|
g_pserver->repl_batch_idxStart = g_pserver->repl_backlog_idx;
|
||||||
g_pserver->repl_batch_offStart = g_pserver->master_repl_offset;
|
g_pserver->repl_batch_offStart = g_pserver->master_repl_offset;
|
||||||
|
} else if (getLowestOffsetAmongReplicas() != -1){
|
||||||
|
listIter li;
|
||||||
|
listNode *ln;
|
||||||
|
listRewind(g_pserver->slaves, &li);
|
||||||
|
while ((ln = listNext(&li))) {
|
||||||
|
client *replica = (client*)listNodeValue(ln);
|
||||||
|
|
||||||
|
std::unique_lock<fastlock> ul(replica->lock, std::defer_lock);
|
||||||
|
if (FCorrectThread(replica))
|
||||||
|
ul.lock();
|
||||||
|
|
||||||
|
/* try to force prepare client to write i guess? */
|
||||||
|
if (replica->repl_curr_idx != -1){
|
||||||
|
if (prepareClientToWrite(replica) != C_OK) continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user