chore: Fix memcached flags not updated (#2787)

Signed-off-by: Vladislav Oleshko <vlad@dragonflydb.io>
This commit is contained in:
Vladislav 2024-03-29 12:10:58 +03:00 committed by GitHub
parent 05084354c7
commit c8724adddf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 20 additions and 15 deletions

View file

@ -830,14 +830,10 @@ bool DbSlice::UpdateExpire(DbIndex db_ind, PrimeIterator it, uint64_t at) {
void DbSlice::SetMCFlag(DbIndex db_ind, PrimeKey key, uint32_t flag) {
auto& db = *db_arr_[db_ind];
if (flag == 0) {
if (db.mcflag.Erase(key) == 0) {
LOG(ERROR) << "Internal error, inconsistent state, mcflag should be present but not found "
<< key.ToString();
}
db.mcflag.Erase(key);
} else {
auto [it, inserted] = db.mcflag.Insert(std::move(key), flag);
if (!inserted)
it->second = flag;
auto [it, _] = db.mcflag.Insert(std::move(key), flag);
it->second = flag;
}
}

View file

@ -655,12 +655,9 @@ OpStatus SetCmd::SetExisting(const SetParams& params, PrimeIterator it, ExpireIt
it->first.SetSticky(true);
}
// Check whether we need to update flags table.
bool req_flag_update = (params.memcache_flags != 0) != prime_value.HasFlag();
if (req_flag_update) {
prime_value.SetFlag(params.memcache_flags != 0);
db_slice.SetMCFlag(op_args_.db_cntx.db_index, it->first.AsRef(), params.memcache_flags);
}
// Update flags
prime_value.SetFlag(params.memcache_flags != 0);
db_slice.SetMCFlag(op_args_.db_cntx.db_index, it->first.AsRef(), params.memcache_flags);
db_slice.RemoveFromTiered(it, op_args_.db_cntx.db_index);
// overwrite existing entry.

View file

@ -254,7 +254,7 @@ def port_picker():
@pytest.fixture(scope="function")
def memcached_client(df_server: DflyInstance):
client = pymemcache.Client(f"localhost:{df_server.mc_port}", default_noreply=False)
client = pymemcache.Client(f"127.0.0.1:{df_server.mc_port}", default_noreply=False)
yield client

View file

@ -2,8 +2,9 @@ from pymemcache.client.base import Client as MCClient
from . import dfly_args
from .instance import DflyInstance
import socket
import random
DEFAULT_ARGS = {"memcached_port": 12111, "proactor_threads": 4}
DEFAULT_ARGS = {"memcached_port": 11211, "proactor_threads": 4}
# Generic basic tests
@ -122,3 +123,14 @@ def test_version(memcached_client: MCClient):
stats = memcached_client.stats()
version = stats[b"version"].decode("utf-8")
assert version.startswith("v") or version == "dev"
@dfly_args(DEFAULT_ARGS)
def test_flags(memcached_client: MCClient):
for i in range(1, 20):
flags = random.randrange(50, 1000)
memcached_client.set("a", "real-value", flags=flags, noreply=True)
res = memcached_client.raw_command("get a", "END\r\n").split()
if len(res) > 0:
assert res[2].decode() == str(flags)