Re: pgsql: Introduce hash_search_with_hash_value() function
От | Pavel Stehule |
---|---|
Тема | Re: pgsql: Introduce hash_search_with_hash_value() function |
Дата | |
Msg-id | CAFj8pRBN65zcR62uOy+wbM61yVJ0P7G-m6tgZZc3NVQRsCz5nw@mail.gmail.com обсуждение исходный текст |
Ответ на | pgsql: Introduce hash_search_with_hash_value() function (Alexander Korotkov <akorotkov@postgresql.org>) |
Ответы |
Re: pgsql: Introduce hash_search_with_hash_value() function
|
Список | pgsql-committers |
Hi
st 7. 8. 2024 v 6:08 odesílatel Alexander Korotkov <akorotkov@postgresql.org> napsal:
Introduce hash_search_with_hash_value() function
This new function iterates hash entries with given hash values. This function
is designed to avoid full sequential hash search in the syscache invalidation
callbacks.
Discussion: https://postgr.es/m/5812a6e5-68ae-4d84-9d85-b443176966a1%40sigaev.ru
Author: Teodor Sigaev
Reviewed-by: Aleksander Alekseev, Tom Lane, Michael Paquier, Roman Zharkov
Reviewed-by: Andrei Lepikhov
I tried to use hash_seq_init_with_hash_value in session variables patch, but it doesn't work there.
<-->if (!sessionvars)
<--><-->return;
elog(NOTICE, "%u", hashvalue);
<-->hash_seq_init(&status, sessionvars);
<-->while ((svar = (SVariable) hash_seq_search(&status)) != NULL)
<-->{
<--><-->if (hashvalue == 0 || svar->hashvalue == hashvalue)
<--><-->{
<--><--><-->elog(NOTICE, "FOUND OLD");
<--><--><-->svar->is_valid = false;
<--><-->}
<-->}
<-->/*
<--> * If the hashvalue is not specified, we have to recheck all currently
<--> * used session variables. Since we can't tell the exact session variable
<--> * from its hashvalue, we have to iterate over all items in the hash bucket.
<--> */
<-->if (hashvalue == 0)
<--><-->hash_seq_init(&status, sessionvars);
<-->else
<--><-->hash_seq_init_with_hash_value(&status, sessionvars, hashvalue);
<-->while ((svar = (SVariable) hash_seq_search(&status)) != NULL)
<-->{
<--><-->Assert(hashvalue == 0 || svar->hashvalue == hashvalue);
elog(NOTICE, "found");
<--><-->svar->is_valid = false;
<--><-->needs_validation = true;
<-->}
}
<--><-->return;
elog(NOTICE, "%u", hashvalue);
<-->hash_seq_init(&status, sessionvars);
<-->while ((svar = (SVariable) hash_seq_search(&status)) != NULL)
<-->{
<--><-->if (hashvalue == 0 || svar->hashvalue == hashvalue)
<--><-->{
<--><--><-->elog(NOTICE, "FOUND OLD");
<--><--><-->svar->is_valid = false;
<--><-->}
<-->}
<-->/*
<--> * If the hashvalue is not specified, we have to recheck all currently
<--> * used session variables. Since we can't tell the exact session variable
<--> * from its hashvalue, we have to iterate over all items in the hash bucket.
<--> */
<-->if (hashvalue == 0)
<--><-->hash_seq_init(&status, sessionvars);
<-->else
<--><-->hash_seq_init_with_hash_value(&status, sessionvars, hashvalue);
<-->while ((svar = (SVariable) hash_seq_search(&status)) != NULL)
<-->{
<--><-->Assert(hashvalue == 0 || svar->hashvalue == hashvalue);
elog(NOTICE, "found");
<--><-->svar->is_valid = false;
<--><-->needs_validation = true;
<-->}
}
Old methods found an entry, but new not.
What am I doing wrong?
Regards
Pavel
Branch
------
master
Details
-------
https://git.postgresql.org/pg/commitdiff/d0f020037e19c33c74d683eb7e0c7cc5725294b4
Modified Files
--------------
src/backend/utils/hash/dynahash.c | 38 ++++++++++++++++++++++++++++++++++++++
src/include/utils/hsearch.h | 5 +++++
2 files changed, 43 insertions(+)
В списке pgsql-committers по дате отправления: