All, I've been keeping an eye on tick as it failed a day-or-so ago and it looks to be related to RLS. Using a local CLFAGS="-DCLOBBER_CACHE_ALWAYS -DRANDOMIZE_ALLOCATED_MEMORY" build, I was able to see the regression tests failing in check_role_for_policy() due to a pretty clear reset of the memory used for the policies.
Looking through relcache.c, which I have to admit to not being as
familiar with as some, the issue becomes rather apparent (I believe)-
RelationClearRelation() hasn't been set up to handle the RLS policies
specially, as it does for rules and tupledesc. Fair enough, it's
reasonably straight-forward to add an equalPolicies() and handle the
policies the same way- but I'm left wondering if that's actually
*safe* to do?
To be a bit more clear- why is it safe to change the contents if the
equal() function returns 'false'? I'm guessing the answer is
"locking"- whereby such a change would imply a lock was acquired on
the relation by another backend, which shouldn't be possible if we're
currently working with it, but wanted to double-check that.
I also wonder if we might be better off with a way to identify that
nothing has actually been changed due to the locks we hold and avoid
rebuilding the relation cache entry entirely..
Thanks!
Stephen
signature.asc
Description: Digital signature
