Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:15-SP2
util-linux
fix-lib-internal-cache-size.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File fix-lib-internal-cache-size.patch of Package util-linux
From 2fa4168c8bc9d5438bc1dfadda293c7c21b6fa59 Mon Sep 17 00:00:00 2001 From: Michael Trapp <michael.trapp@sap.com> Date: Mon, 6 Mar 2023 10:40:20 +0000 Subject: [PATCH] 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. --- libuuid/src/gen_uuid.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) Index: util-linux-2.33.2/libuuid/src/gen_uuid.c =================================================================== --- util-linux-2.33.2.orig/libuuid/src/gen_uuid.c +++ util-linux-2.33.2/libuuid/src/gen_uuid.c @@ -528,25 +528,35 @@ int __uuid_generate_time_cont(uuid_t out */ static int uuid_generate_time_generic(uuid_t out) { #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 cache_size = 1; + THREAD_LOCAL int cache_size = cs_min; + THREAD_LOCAL int last_used = 0; THREAD_LOCAL struct uuid uu; THREAD_LOCAL time_t last_time = 0; time_t now; - if (num > 0) { + if (num > 0) { /* expire cache */ now = time(NULL); - if (now > last_time+1) + if (now > last_time+1) { + last_used = cache_size - num; num = 0; + } } - if (num <= 0) { + if (num <= 0) { /* fill cache */ /* * num + OP_BULK provides a local cache in each application. * 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) - cache_size *= 10; + if ((last_used == cache_size) && (cache_size < cs_max)) + cache_size *= cs_factor; + else if ((last_used < (cache_size / cs_factor)) && (cache_size > cs_min)) + cache_size /= cs_factor; + num = cache_size; if (get_uuid_via_daemon(UUIDD_OP_BULK_TIME_UUID, @@ -556,9 +566,12 @@ static int uuid_generate_time_generic(uu num--; return 0; } + + /* request to daemon failed, reset cache */ num = 0; + cache_size = cs_min; } - if (num > 0) { + if (num > 0) { /* serve uuid from cache */ uu.time_low++; if (uu.time_low == 0) { uu.time_mid++; @@ -567,6 +580,8 @@ static int uuid_generate_time_generic(uu } num--; uuid_pack(&uu, out); + if (num == 0) + last_used = cache_size; return 0; } #else
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor