diff --git a/src/networking.c b/src/networking.c index 671e374f4..6de00be09 100644 --- a/src/networking.c +++ b/src/networking.c @@ -1141,10 +1141,7 @@ void freeClient(client *c) { * some unexpected state, by checking its flags. */ if (server.master && c->flags & CLIENT_MASTER) { serverLog(LL_WARNING,"Connection with master lost."); - if (!(c->flags & (CLIENT_CLOSE_AFTER_REPLY| - CLIENT_CLOSE_ASAP| - CLIENT_BLOCKED))) - { + if (!(c->flags & (CLIENT_PROTOCOL_ERROR|CLIENT_BLOCKED))) { replicationCacheMaster(c); return; } @@ -1558,7 +1555,8 @@ int processInlineBuffer(client *c) { } /* Helper function. Record protocol erro details in server log, - * and set the client as CLIENT_CLOSE_AFTER_REPLY. */ + * and set the client as CLIENT_CLOSE_AFTER_REPLY and + * CLIENT_PROTOCOL_ERROR. */ #define PROTO_DUMP_LEN 128 static void setProtocolError(const char *errstr, client *c) { if (server.verbosity <= LL_VERBOSE) { @@ -1584,7 +1582,7 @@ static void setProtocolError(const char *errstr, client *c) { "Protocol error (%s) from client: %s. %s", errstr, client, buf); sdsfree(client); } - c->flags |= CLIENT_CLOSE_AFTER_REPLY; + c->flags |= (CLIENT_CLOSE_AFTER_REPLY|CLIENT_PROTOCOL_ERROR); } /* Process the query buffer for client 'c', setting up the client argument diff --git a/src/replication.c b/src/replication.c index c59639cd1..f433d6413 100644 --- a/src/replication.c +++ b/src/replication.c @@ -2688,14 +2688,18 @@ void replicationCacheMaster(client *c) { /* Unlink the client from the server structures. */ unlinkClient(c); + /* Clear flags that can create issues once we reconnect the client. */ + c->flags &= ~(CLIENT_CLOSE_ASAP|CLIENT_CLOSE_AFTER_REPLY); + /* Reset the master client so that's ready to accept new commands: * we want to discard te non processed query buffers and non processed * offsets, including pending transactions, already populated arguments, * pending outputs to the master. */ sdsclear(server.master->querybuf); sdsclear(server.master->pending_querybuf); - /* Adjust reploff and read_reploff to the last meaningful offset we executed. - * this is the offset the replica will use for future PSYNC. */ + + /* Adjust reploff and read_reploff to the last meaningful offset we + * executed. This is the offset the replica will use for future PSYNC. */ server.master->reploff = adjustMeaningfulReplOffset(); server.master->read_reploff = server.master->reploff; if (c->flags & CLIENT_MULTI) discardTransaction(c); diff --git a/src/server.h b/src/server.h index 55ee2d300..f835bf5e9 100644 --- a/src/server.h +++ b/src/server.h @@ -255,6 +255,7 @@ typedef long long ustime_t; /* microsecond time type. */ #define CLIENT_TRACKING_NOLOOP (1ULL<<37) /* Don't send invalidation messages about writes performed by myself.*/ #define CLIENT_IN_TO_TABLE (1ULL<<38) /* This client is in the timeout table. */ +#define CLIENT_PROTOCOL_ERROR (1ULL<<39) /* Protocol error chatting with it. */ /* Client block type (btype field in client structure) * if CLIENT_BLOCKED flag is set. */