libuuid: fix lib internal cache size

The lib internal cache improves throughput in high load
scenarios but for applications with a low request rate,
the cache size must be adapted to this situation.
Therefore the cache size should be changed to the current
requirements of the application during runtime.
This commit is contained in:
Michael Trapp 2023-03-06 10:40:20 +00:00 committed by Karel Zak
parent 11208370c9
commit 2fa4168c8b

View file

@ -528,25 +528,35 @@ int __uuid_generate_time_cont(uuid_t out, int *num, uint32_t cont_offset)
*/ */
static int uuid_generate_time_generic(uuid_t out) { static int uuid_generate_time_generic(uuid_t out) {
#ifdef HAVE_TLS #ifdef HAVE_TLS
/* thread local cache for uuidd based requests */
const int cs_min = (1<<6);
const int cs_max = (1<<18);
const int cs_factor = 2;
THREAD_LOCAL int num = 0; THREAD_LOCAL int num = 0;
THREAD_LOCAL int cache_size = 1; THREAD_LOCAL int cache_size = cs_min;
THREAD_LOCAL int last_used = 0;
THREAD_LOCAL struct uuid uu; THREAD_LOCAL struct uuid uu;
THREAD_LOCAL time_t last_time = 0; THREAD_LOCAL time_t last_time = 0;
time_t now; time_t now;
if (num > 0) { if (num > 0) { /* expire cache */
now = time(NULL); now = time(NULL);
if (now > last_time+1) if (now > last_time+1) {
last_used = cache_size - num;
num = 0; num = 0;
}
} }
if (num <= 0) { if (num <= 0) { /* fill cache */
/* /*
* num + OP_BULK provides a local cache in each application. * num + OP_BULK provides a local cache in each application.
* Start with a small cache size to cover short running applications * Start with a small cache size to cover short running applications
* and increment the cache size over the runntime. * and adjust the cache size over the runntime.
*/ */
if (cache_size < 1000000) if ((last_used == cache_size) && (cache_size < cs_max))
cache_size *= 10; cache_size *= cs_factor;
else if ((last_used < (cache_size / cs_factor)) && (cache_size > cs_min))
cache_size /= cs_factor;
num = cache_size; num = cache_size;
if (get_uuid_via_daemon(UUIDD_OP_BULK_TIME_UUID, if (get_uuid_via_daemon(UUIDD_OP_BULK_TIME_UUID,
@ -556,9 +566,11 @@ static int uuid_generate_time_generic(uuid_t out) {
num--; num--;
return 0; return 0;
} }
/* request to daemon failed, reset cache */
num = 0; num = 0;
cache_size = cs_min;
} }
if (num > 0) { if (num > 0) { /* serve uuid from cache */
uu.time_low++; uu.time_low++;
if (uu.time_low == 0) { if (uu.time_low == 0) {
uu.time_mid++; uu.time_mid++;
@ -567,6 +579,8 @@ static int uuid_generate_time_generic(uuid_t out) {
} }
num--; num--;
uuid_pack(&uu, out); uuid_pack(&uu, out);
if (num == 0)
last_used = cache_size;
return 0; return 0;
} }
#else #else