diff options
author | zhaozhao.zz <276441700@qq.com> | 2022-03-25 10:45:40 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-25 10:45:40 +0800 |
commit | 78bef6e1fe4b69e9cca6a922911bd88a92584edb (patch) | |
tree | 118d28a0dc758f5af8155e6fda4d89e17383cd9b /src/blocked.c | |
parent | 1a57af629c4fa4e6bac35602a5373445ca42753b (diff) | |
download | redis-78bef6e1fe4b69e9cca6a922911bd88a92584edb.tar.gz |
optimize(remove) usage of client's pending_querybuf (#10413)
To remove `pending_querybuf`, the key point is reusing `querybuf`, it means master client's `querybuf` is not only used to parse command, but also proxy to sub-replicas.
1. add a new variable `repl_applied` for master client to record how many data applied (propagated via `replicationFeedStreamFromMasterStream()`) but not trimmed in `querybuf`.
2. don't sdsrange `querybuf` in `commandProcessed()`, we trim it to `repl_applied` after the whole replication pipeline processed to avoid fragmented `sdsrange`. And here are some scenarios we cannot trim to `qb_pos`:
* we don't receive complete command from master
* master client blocked because of client pause
* IO threads operate read, master client flagged with CLIENT_PENDING_COMMAND
In these scenarios, `qb_pos` points to the part of the current command or the beginning of next command, and the current command is not applied yet, so the `repl_applied` is not equal to `qb_pos`.
Some other notes:
* Do not do big arg optimization on master client, since we can only sdsrange `querybuf` after data sent to replicas.
* Set `qb_pos` and `repl_applied` to 0 when `freeClient` in `replicationCacheMaster`.
* Rewrite `processPendingCommandsAndResetClient` to `processPendingCommandAndInputBuffer`, let `processInputBuffer` to be called successively after `processCommandAndResetClient`.
Diffstat (limited to 'src/blocked.c')
-rw-r--r-- | src/blocked.c | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/src/blocked.c b/src/blocked.c index 2754da9e0..65b584213 100644 --- a/src/blocked.c +++ b/src/blocked.c @@ -141,12 +141,7 @@ void processUnblockedClients(void) { * the code is conceptually more correct this way. */ if (!(c->flags & CLIENT_BLOCKED)) { /* If we have a queued command, execute it now. */ - if (processPendingCommandsAndResetClient(c) == C_OK) { - /* Now process client if it has more data in it's buffer. */ - if (c->querybuf && sdslen(c->querybuf) > 0) { - if (processInputBuffer(c) == C_ERR) c = NULL; - } - } else { + if (processPendingCommandAndInputBuffer(c) == C_ERR) { c = NULL; } } |