Skip to content

Commit 5d20aeb

Browse files
committed
memcached: add a method that shows slab info
Before switching to our own slab arena user can control usage and information about slab arena using Tarantool Lua API (specifically box.slab.{check,info,stat}() functions), see [1]. Example of output box.slab.info() is below: tarantool> box.slab.info() --- - items_size: 146896 items_used_ratio: 26.05% quota_size: 268435456 quota_used_ratio: 12.50% arena_used_ratio: 3.7% items_used: 38264 quota_used: 33554432 arena_size: 33554432 arena_used: 1234296 ... With our own slab arena we need a way to obtain information about arena. It's a reason why new method slab() was introduced. tarantool> require('memcached'):slab() --- - info: quota_used: 4194304 arena_used_ratio: 0 quota_used_ratio: 0.097656249999998 arena_size: 4194304 quota_size: 4294967296 arena_used: 0 ... 1. https://www.tarantool.io/en/doc/latest/reference/reference_lua/box_slab/slab_info/
1 parent 765113a commit 5d20aeb

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
lines changed

memcached/init.lua

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ struct memcached_stat {
5454
uint64_t auth_errors;
5555
};
5656

57+
struct slab_arena_info {
58+
size_t arena_size;
59+
size_t arena_used;
60+
double arena_used_ratio;
61+
62+
size_t quota_size;
63+
size_t quota_used;
64+
double quota_used_ratio;
65+
};
66+
5767
void
5868
memcached_set_opt (struct memcached_service *srv, int opt, ...);
5969

@@ -82,6 +92,9 @@ memcached_get_stat (struct memcached_service *);
8292
struct memcached_service *
8393
memcached_create(const char *, uint32_t);
8494

95+
struct slab_arena_info *
96+
memcached_slab_arena_info();
97+
8598
int memcached_start (struct memcached_service *);
8699
void memcached_stop (struct memcached_service *);
87100
void memcached_free (struct memcached_service *);
@@ -233,6 +246,17 @@ local RUNNING = 'r'
233246
local STOPPED = 's'
234247
local ERRORED = 'e'
235248

249+
250+
local slab_arena_info_table = {
251+
'arena_size',
252+
'arena_used',
253+
'arena_used_ratio',
254+
255+
'quota_size',
256+
'quota_used',
257+
'quota_used_ratio',
258+
}
259+
236260
local stat_table = {
237261
'total_items', 'curr_items',
238262
'curr_conns', 'total_conns',
@@ -386,7 +410,20 @@ local function memcached_get(name)
386410
return memcached_services[name]
387411
end
388412

413+
local function memcached_slab()
414+
local slab_arena_info = memcached_internal.memcached_slab_arena_info()
415+
local slab = {
416+
info = {}
417+
}
418+
for _, v in pairs(slab_arena_info_table) do
419+
slab.info[v] = slab_arena_info[0][v]
420+
end
421+
422+
return slab
423+
end
424+
389425
return {
426+
slab = memcached_slab,
390427
create = memcached_init,
391428
get = memcached_get,
392429
server = setmetatable({}, {

memcached/internal/memcached.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,20 @@
5151
__thread struct slab_cache slabc;
5252
struct quota quota;
5353
struct slab_arena arena;
54+
struct slab_arena_info slab_info;
55+
56+
struct slab_arena_info *
57+
memcached_slab_arena_info()
58+
{
59+
slab_info.arena_size = arena.used;
60+
61+
slab_info.quota_used = quota_used(arena.quota);
62+
slab_info.quota_size = quota_total(arena.quota);
63+
slab_info.quota_used_ratio = 100 * ((double) slab_info.quota_used /
64+
((double) slab_info.quota_size + 0.0001));
65+
66+
return &slab_info;
67+
}
5468

5569
void
5670
memcached_slab_arena_create()

memcached/internal/memcached.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ enum memcached_proto_type {
2727
MEMCACHED_PROTO_MAX
2828
};
2929

30+
struct slab_arena_info {
31+
size_t arena_size;
32+
size_t arena_used;
33+
double arena_used_ratio;
34+
35+
size_t quota_size;
36+
size_t quota_used;
37+
double quota_used_ratio;
38+
};
39+
3040
struct memcached_stat {
3141
/* connection informations */
3242
unsigned int curr_items;

test/common/instance_api.test.lua

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,19 @@ local self_instance = mc:grant('Vera')
123123
test:isnt(self_instance, nil, 'instance:grant() returns self object')
124124

125125
os.exit(test:check() and 0 or 1)
126+
127+
-- instance:slab()
128+
129+
local slab = mc:slab()
130+
test:istable(slab, 'instance:slab() returns a table')
131+
test:istable(slab.info, 'instance:slab().info returns a table')
132+
test:isnumber(slab.info.arena_size, 'instance:slab().info.arena_size returns a number')
133+
test:isnumber(slab.info.arena_used, 'instance:slab().info.arena_used returns a number')
134+
test:isnumber(slab.info.arena_used_ratio, 'instance:slab().info.arena_used_ratio returns a number')
135+
test:isnumber(slab.info.quota_size, 'instance:slab().info.quota_size returns a number')
136+
test:isnumber(slab.info.quota_used, 'instance:slab().info.quota_used returns a number')
137+
test:isnumber(slab.info.quota_used_ratio, 'instance:slab().info.quota_used_ratio returns a number')
138+
local quota_used_ratio = 100 * slab.info.quota_used / slab.info.quota_used
139+
test:is(slab.info.quota_used_ratio, quota_used_ratio, 'instance:slab().info.quota_used_ratio is correct')
140+
141+
os.exit(test:check() and 0 or 1)

0 commit comments

Comments
 (0)