Skip to content

Commit f0433a5

Browse files
FEATURE: add sop forced insert
1 parent cb9cd9a commit f0433a5

File tree

9 files changed

+84
-12
lines changed

9 files changed

+84
-12
lines changed

engines/default/default_engine.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,15 +500,16 @@ default_set_elem_release(ENGINE_HANDLE* handle, const void *cookie,
500500
static ENGINE_ERROR_CODE
501501
default_set_elem_insert(ENGINE_HANDLE* handle, const void* cookie,
502502
const void* key, const int nkey, eitem *eitem,
503-
item_attr *attrp, bool *created, uint16_t vbucket)
503+
item_attr *attrp, bool *created, uint16_t vbucket,
504+
bool force)
504505
{
505506
struct default_engine *engine = get_handle(handle);
506507
ENGINE_ERROR_CODE ret;
507508
VBUCKET_GUARD(engine, vbucket);
508509

509510
ACTION_BEFORE_WRITE(cookie, key, nkey);
510511
ret = set_elem_insert(engine, key, nkey, (set_elem_item*)eitem,
511-
attrp, created, cookie);
512+
attrp, created, cookie, force);
512513
ACTION_AFTER_WRITE(cookie, ret);
513514
return ret;
514515
}

engines/default/items.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2234,7 +2234,7 @@ static ENGINE_ERROR_CODE do_set_elem_get(struct default_engine *engine,
22342234

22352235
static ENGINE_ERROR_CODE do_set_elem_insert(struct default_engine *engine,
22362236
hash_item *it, set_elem_item *elem,
2237-
const void *cookie)
2237+
const void *cookie, bool force)
22382238
{
22392239
set_meta_info *info = (set_meta_info *)item_get_meta(it);
22402240
int32_t real_mcnt = (info->mcnt == -1 ? max_set_size : info->mcnt);
@@ -2251,7 +2251,10 @@ static ENGINE_ERROR_CODE do_set_elem_insert(struct default_engine *engine,
22512251
/* overflow check */
22522252
assert(info->ovflact == OVFL_ERROR);
22532253
if (info->ccnt >= real_mcnt) {
2254-
return ENGINE_EOVERFLOW;
2254+
if (!force || info->ccnt >= max_set_size) {
2255+
return ENGINE_EOVERFLOW;
2256+
}
2257+
info->mcnt = info->ccnt+1;
22552258
}
22562259

22572260
/* create the root hash node if it does not exist */
@@ -6675,7 +6678,8 @@ void set_elem_release(struct default_engine *engine, set_elem_item **elem_array,
66756678
}
66766679

66776680
ENGINE_ERROR_CODE set_elem_insert(struct default_engine *engine, const char *key, const size_t nkey,
6678-
set_elem_item *elem, item_attr *attrp, bool *created, const void *cookie)
6681+
set_elem_item *elem, item_attr *attrp, bool *created, const void *cookie,
6682+
bool force)
66796683
{
66806684
hash_item *it = NULL;
66816685
ENGINE_ERROR_CODE ret;
@@ -6698,7 +6702,7 @@ ENGINE_ERROR_CODE set_elem_insert(struct default_engine *engine, const char *key
66986702
}
66996703
}
67006704
if (ret == ENGINE_SUCCESS) {
6701-
ret = do_set_elem_insert(engine, it, elem, cookie);
6705+
ret = do_set_elem_insert(engine, it, elem, cookie, force);
67026706
if (ret != ENGINE_SUCCESS && *created) {
67036707
do_item_unlink(engine, it, ITEM_UNLINK_NORMAL);
67046708
}

engines/default/items.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,8 @@ ENGINE_ERROR_CODE set_elem_insert(struct default_engine *engine,
444444
const char *key, const size_t nkey,
445445
set_elem_item *elem,
446446
item_attr *attrp,
447-
bool *created, const void *cookie);
447+
bool *created, const void *cookie,
448+
bool force);
448449

449450
ENGINE_ERROR_CODE set_elem_delete(struct default_engine *engine,
450451
const char *key, const size_t nkey,

engines/demo/demo_engine.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,8 @@ Demo_set_elem_release(ENGINE_HANDLE* handle, const void *cookie,
356356
static ENGINE_ERROR_CODE
357357
Demo_set_elem_insert(ENGINE_HANDLE* handle, const void* cookie,
358358
const void* key, const int nkey, eitem *eitem,
359-
item_attr *attrp, bool *created, uint16_t vbucket)
359+
item_attr *attrp, bool *created, uint16_t vbucket,
360+
bool force)
360361
{
361362
return ENGINE_ENOTSUP;
362363
}

include/memcached/engine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ extern "C" {
392392
ENGINE_ERROR_CODE (*set_elem_insert)(ENGINE_HANDLE* handle, const void* cookie,
393393
const void* key, const int nkey, eitem *eitem,
394394
item_attr *attrp, bool *created,
395-
uint16_t vbucket);
395+
uint16_t vbucket, bool force);
396396

397397
ENGINE_ERROR_CODE (*set_elem_delete)(ENGINE_HANDLE* handle, const void* cookie,
398398
const void* key, const int nkey,

memcached.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,7 +1682,7 @@ static void process_sop_insert_complete(conn *c) {
16821682

16831683
ret = mc_engine.v1->set_elem_insert(mc_engine.v0, c,
16841684
c->coll_key, c->coll_nkey, elem,
1685-
c->coll_attrp, &created, 0);
1685+
c->coll_attrp, &created, 0, c->force);
16861686
if (ret == ENGINE_EWOULDBLOCK) {
16871687
c->ewouldblock = true;
16881688
ret = ENGINE_SUCCESS;
@@ -5072,7 +5072,7 @@ static void process_bin_sop_insert_complete(conn *c) {
50725072
ret = mc_engine.v1->set_elem_insert(mc_engine.v0, c,
50735073
c->coll_key, c->coll_nkey, elem,
50745074
c->coll_attrp, &created,
5075-
c->binary_header.request.vbucket);
5075+
c->binary_header.request.vbucket, c->force);
50765076
if (ret == ENGINE_EWOULDBLOCK) {
50775077
c->ewouldblock = true;
50785078
ret = ENGINE_SUCCESS;
@@ -10586,8 +10586,10 @@ static void process_sop_command(conn *c, token_t *tokens, const size_t ntokens)
1058610586
}
1058710587
vlen += 2;
1058810588

10589+
c->force = (strcmp(tokens[ntokens - 2 - (c->noreply ? 1 : 0)].value, "force") == 0);
10590+
1058910591
int read_ntokens = SOP_KEY_TOKEN + 2;
10590-
int post_ntokens = 1 + (c->noreply ? 1 : 0);
10592+
int post_ntokens = 1 + (c->noreply ? 1 : 0) + (c->force ? 1: 0);
1059110593
int rest_ntokens = ntokens - read_ntokens - post_ntokens;
1059210594

1059310595
if (rest_ntokens >= 2) {

memcached.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,7 @@ struct conn {
602602
char client_ip[16];
603603

604604
bool noreply; /* True if the reply should not be sent. */
605+
bool force;
605606
/* current stats command */
606607

607608
struct {

t/coll_sop_forced_insert.t

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/usr/bin/perl
2+
3+
use strict;
4+
use Test::More tests => 51001;
5+
use FindBin qw($Bin);
6+
use lib "$Bin/lib";
7+
use MemcachedTest;
8+
9+
my $engine = shift;
10+
my $server = get_memcached($engine);
11+
my $sock = $server->sock;
12+
13+
my $flags = 13;
14+
my $default_set_size = 4000;
15+
my $maximum_set_size = 50000;
16+
my $cnt;
17+
18+
sub sop_forced_insert_over_maxcount {
19+
my ($key, $create) = @_;
20+
my $index;
21+
22+
for ($index = 0; $index < $maximum_set_size; $index++) {
23+
my $val = "datum$index";
24+
my $vleng = length($val);
25+
my $cmd;
26+
my $rst;
27+
28+
if ($index == 0) {
29+
#$cmd = "sop insert $key $vleng $create force";
30+
$cmd = "sop insert $key $vleng $create";
31+
$rst = "CREATED_STORED";
32+
}
33+
34+
else {
35+
$cmd = "sop insert $key $vleng force";
36+
$rst = "STORED";
37+
}
38+
mem_cmd_is($sock, $cmd, $val, $rst);
39+
}
40+
}
41+
42+
43+
sub sop_forced_insert_over_hardlimit{
44+
my ($key, $from, $to) = @_;
45+
my $index;
46+
47+
for($index = $from; $index <= $to; $index++){
48+
my $val = "datum$index";
49+
my $vleng = length($val);
50+
my $cmd = "sop insert $key $vleng force";
51+
my $rst = "OVERFLOWED";
52+
53+
mem_cmd_is($sock, $cmd, $val, $rst);
54+
}
55+
}
56+
57+
sop_forced_insert_over_maxcount("skey", "create $flags 0 1");
58+
sop_forced_insert_over_hardlimit("skey", $maximum_set_size, $maximum_set_size+1000);
59+
60+
# after test
61+
release_memcached($engine, $server);

t/tlist/engine_default_s.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
./t/coll_pipeline_sop_exist.t
4040
./t/coll_readable_attr.t
4141
./t/coll_sop_segfault_p012611.t
42+
./t/coll_sop_forced_insert.t
4243
./t/coll_sop_unittest.t
4344
./t/daemonize.t
4445
./t/dash-M.t

0 commit comments

Comments
 (0)