Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

memcached_get return NOT FOUND for exists key after buffered delete/increment #142

Open
degtyaryov opened this issue Jan 26, 2024 · 0 comments

Comments

@degtyaryov
Copy link

For command DeleteQ and IncrementQ server memcached return answer:

Memcache Protocol, Delete Quietly Response
    Magic: Response (129)
    Opcode: Delete Quietly (20)
    Key Length: 0
    Extras length: 0
    Data type: Raw bytes (0)
    Status: Key not found (1)
        [Expert Info (Note/Response): Delete Quietly: Key not found]
            [Delete Quietly: Key not found]
            [Severity level: Note]
            [Group: Response]
    [Value length: 9]
    Total body length: 9
    Opaque: 1835008
    CAS: 0
    Value: Not found
Memcache Protocol, Increment Quietly Response
    Magic: Response (129)
    Opcode: Increment Quietly (21)
    Key Length: 0
    Extras length: 0
    Data type: Raw bytes (0)
    Status: Unknown (6)
        [Expert Info (Note/Response): Increment Quietly: Status: 6]
            [Increment Quietly: Status: 6]
            [Severity level: Note]
            [Group: Response]
    [Value length: 46]
    Total body length: 46
    Opaque: 262144
    CAS: 0
    Value: Non-numeric server-side value for incr or decr

For next request GET response exists in TCP package:

Memcache Protocol, Get Key Response
    Magic: Response (129)
    Opcode: Get Key (12)
    Key Length: 4
    Extras length: 4
    Data type: Raw bytes (0)
    Status: No error (0)
    [Value length: 6]
    Total body length: 14
    Opaque: 3473408
    CAS: 365468
    Extras
        Flags: 0x00000000
    Key: KEY1
    Value: VALUE1

But libmemcached return NOT FOUND

memcached_mget loses all results for all keys.

Environment:

  • libmemcached-awesome 1.1.4
  • memcached-1.6.21

Example for delete:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <libmemcached/memcached.h>

int main(int argc, char *argv[])
{
    char *key1= "KEY1";
    char *value1= "VALUE1";
    
    char *key2= "KEY2";
    char *value2= "VALUE2";

    memcached_server_st *servers = NULL;
    memcached_st *memc;
    memcached_return rc;
    
    size_t key1_length = strlen(key1);
    size_t key2_length = strlen(key2);

    char *return_value;
    size_t return_value_length;
    uint32_t flags;
    
    memcached_server_st *memcached_servers_parse (const char *server_strings);

    memc= memcached_create(NULL);
    
    servers= memcached_server_list_append(servers, "127.0.0.1", 11211, &rc);
    rc= memcached_server_push(memc, servers);
    
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 1);
    
    rc= memcached_set(memc, key1, key1_length, value1, strlen(value1), (time_t)0, (uint32_t)0);
    
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1);
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY, 1);

    for (int i = 0; i < 100; ++i) {
        rc= memcached_delete(memc, key2, key2_length, (time_t)0);
    }

    return_value = memcached_get(memc, key1, key1_length, &return_value_length, &flags, &rc);
    fprintf(stdout,"Value: %s\n",return_value);

Example for increment:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <libmemcached/memcached.h>

int main(int argc, char *argv[])
{
    char *key= "KEY";
    char *value= "VALUE";

    memcached_server_st *servers = NULL;
    memcached_st *memc;
    memcached_return rc;
    
    uint64_t incr = UINT64_MAX;
    size_t key_length = strlen(key);

    char return_key[MEMCACHED_MAX_KEY];
    size_t return_key_length;
    char *return_value;
    size_t return_value_length;
    uint32_t flags;
    
    
    const char* keys[] = {key};
    size_t keys_length[] = {key_length};
    
    memcached_server_st *memcached_servers_parse (const char *server_strings);

    memc= memcached_create(NULL);
    
    servers= memcached_server_list_append(servers, "127.0.0.1", 11211, &rc);
    rc= memcached_server_push(memc, servers);
    
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 1);
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1);
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY, 1);

   
    rc= memcached_set(memc, key, key_length, value, strlen(value), (time_t)0, (uint32_t)0);
    rc = memcached_increment_with_initial(memc, key, key_length, 1, 1, (time_t)600, &incr);

    rc = memcached_mget(memc, keys, keys_length, 1);
    
    return_value = memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc);
    fprintf(stdout,"Value: %s\n",return_value);
    
    return_value = memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc);
    fprintf(stdout,"Value: %s\n",return_value);

    memcached_quit(memc);
    
    return 0;
}

php-memcached-dev/php-memcached#554

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant