mirror of
https://github.com/dragonflydb/dragonfly
synced 2024-11-21 23:19:53 +00:00
fix(server): Fix QUIT not shutting down connection (#280)
* fix(server): Fix QUIT not shutting down connection Fixes #170
This commit is contained in:
parent
0fbd1afa36
commit
add252c301
@ -698,6 +698,10 @@ auto Connection::FromArgs(RespVec args, mi_heap_t* heap) -> Request* {
|
||||
return req;
|
||||
}
|
||||
|
||||
void Connection::ShutdownSelf() {
|
||||
util::Connection::Shutdown();
|
||||
}
|
||||
|
||||
void RespToArgList(const RespVec& src, CmdArgVec* dest) {
|
||||
dest->resize(src.size());
|
||||
for (size_t i = 0; i < src.size(); ++i) {
|
||||
|
@ -72,6 +72,8 @@ class Connection : public util::Connection {
|
||||
std::string GetClientInfo() const;
|
||||
uint32 GetClientId() const;
|
||||
|
||||
void ShutdownSelf();
|
||||
|
||||
protected:
|
||||
void OnShutdown() override;
|
||||
void OnPreMigrateThread() override;
|
||||
|
@ -721,6 +721,7 @@ void Service::Quit(CmdArgList args, ConnectionContext* cntx) {
|
||||
|
||||
SinkReplyBuilder* builder = cntx->reply_builder();
|
||||
builder->CloseConnection();
|
||||
cntx->owner()->ShutdownSelf();
|
||||
}
|
||||
|
||||
void Service::Multi(CmdArgList args, ConnectionContext* cntx) {
|
||||
|
@ -48,7 +48,7 @@ def df_server(request, tmp_dir: Path, test_env):
|
||||
arguments = [arg.format(**test_env) for arg in request.param]
|
||||
dfly_proc = subprocess.Popen([DRAGONFLY_PATH, *arguments],
|
||||
env=test_env, cwd=str(tmp_dir))
|
||||
time.sleep(0.1)
|
||||
time.sleep(0.3)
|
||||
return_code = dfly_proc.poll()
|
||||
if return_code is not None:
|
||||
dfly_proc.terminate()
|
||||
@ -66,17 +66,19 @@ def df_server(request, tmp_dir: Path, test_env):
|
||||
print(outs)
|
||||
print(errs)
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def connection(df_server):
|
||||
return redis.Connection()
|
||||
|
||||
@pytest.fixture(scope="class")
|
||||
def connection(df_server):
|
||||
def raw_client(df_server):
|
||||
""" Creates the Redis client to interact with the Dragonfly instance """
|
||||
pool = redis.ConnectionPool(decode_responses=True)
|
||||
client = redis.Redis(connection_pool=pool)
|
||||
return client
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def client(connection):
|
||||
def client(raw_client):
|
||||
""" Flushes all the records, runs before each test. """
|
||||
connection.flushall()
|
||||
return connection
|
||||
raw_client.flushall()
|
||||
return raw_client
|
||||
|
20
tests/dragonfly/server_family_test.py
Normal file
20
tests/dragonfly/server_family_test.py
Normal file
@ -0,0 +1,20 @@
|
||||
import pytest
|
||||
import redis
|
||||
|
||||
def test_quit(connection):
|
||||
connection.send_command("QUIT")
|
||||
assert connection.read_response() == b'OK'
|
||||
|
||||
with pytest.raises(redis.exceptions.ConnectionError) as e:
|
||||
connection.read_response()
|
||||
|
||||
def test_quit_after_sub(connection):
|
||||
connection = redis.Connection()
|
||||
connection.send_command("SUBSCRIBE", "foo")
|
||||
connection.read_response()
|
||||
|
||||
connection.send_command("QUIT")
|
||||
assert connection.read_response() == b'OK'
|
||||
|
||||
with pytest.raises(redis.exceptions.ConnectionError) as e:
|
||||
connection.read_response()
|
Loading…
Reference in New Issue
Block a user