From: Nikita Pettik <korablev@tarantool.org> To: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH] sql: account prepared stmt cache size right after entry removal Date: Mon, 13 Jan 2020 12:50:39 +0300 [thread overview] Message-ID: <0a9dc9f36c43ab8c9f8e16660a8c9e33074d3ae4.1578904897.git.korablev@tarantool.org> (raw) SQL prepared statement cache is implemented as two data structures: hash table <stmt_id : pointer-to-metadata> and GC queue. The latter is required to avoid workload spikes on session's disconnect: instead of cleaning up memory for all session-local prepared statements, prepared statements to be deleted are moved to GC queue. When memory limit for PS is reached, all elements from queue are removed at once. If statement traps to the GC queue it is assumed to be already dead. Accidentally, change of occupied by PS cache takes place only after GC queue clean-up, so correct size of PS cache is displayed only after GC cycles. Let's fix this and account PS cache size change right after entry removal (i.e. at the moment PS gets into GC queue). --- Branch: https://github.com/tarantool/tarantool/tree/np/fix-prepared-stmt-cache-size-calc src/box/sql_stmt_cache.c | 2 +- test/sql/prepared.result | 9 +++++++++ test/sql/prepared.test.lua | 3 +++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/box/sql_stmt_cache.c b/src/box/sql_stmt_cache.c index 53966dbff..5e2fb3def 100644 --- a/src/box/sql_stmt_cache.c +++ b/src/box/sql_stmt_cache.c @@ -92,7 +92,6 @@ sql_stmt_cache_delete(struct stmt_cache_entry *entry) if (sql_stmt_cache.last_found == entry) sql_stmt_cache.last_found = NULL; rlist_del(&entry->link); - sql_stmt_cache.mem_used -= sql_cache_entry_sizeof(entry->stmt); sql_cache_entry_delete(entry); } @@ -175,6 +174,7 @@ sql_stmt_cache_entry_unref(struct stmt_cache_entry *entry) assert(i != mh_end(cache->hash)); mh_i32ptr_del(cache->hash, i, NULL); rlist_add(&sql_stmt_cache.gc_queue, &entry->link); + sql_stmt_cache.mem_used -= sql_cache_entry_sizeof(entry->stmt); if (sql_stmt_cache.last_found == entry) sql_stmt_cache.last_found = NULL; } diff --git a/test/sql/prepared.result b/test/sql/prepared.result index 18253283f..71ab0bb57 100644 --- a/test/sql/prepared.result +++ b/test/sql/prepared.result @@ -189,6 +189,15 @@ unprepare(s.stmt_id) | - null | ... +assert(box.info.sql().cache.stmt_count == 0) + | --- + | - true + | ... +assert(box.info.sql().cache.size == 0) + | --- + | - true + | ... + -- Test preparation of different types of queries. -- Let's start from DDL. It doesn't make much sense since -- any prepared DDL statement can be executed once, but diff --git a/test/sql/prepared.test.lua b/test/sql/prepared.test.lua index c1203712e..1e3f02b09 100644 --- a/test/sql/prepared.test.lua +++ b/test/sql/prepared.test.lua @@ -78,6 +78,9 @@ end; test_run:cmd("setopt delimiter ''"); unprepare(s.stmt_id) +assert(box.info.sql().cache.stmt_count == 0) +assert(box.info.sql().cache.size == 0) + -- Test preparation of different types of queries. -- Let's start from DDL. It doesn't make much sense since -- any prepared DDL statement can be executed once, but -- 2.15.1
next reply other threads:[~2020-01-13 9:50 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-01-13 9:50 Nikita Pettik [this message] 2020-01-15 16:36 ` Nikita Pettik
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=0a9dc9f36c43ab8c9f8e16660a8c9e33074d3ae4.1578904897.git.korablev@tarantool.org \ --to=korablev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH] sql: account prepared stmt cache size right after entry removal' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox