[squid-users] FATAL: assertion failed: mem/PageStack.cc:159: "StoredNode().is_lock_free()"
Nishant Sharma
codemarauder at gmail.com
Thu Jul 4 08:57:51 UTC 2024
On 03/07/24 21:27, Alex Rousskov wrote:
> On 2024-07-03 09:27, Nishant Sharma wrote:
>> I was able to compile by replacing `uint64_t` to `uint32_t` and squid
>> worked with workers > 1.
>
> Where did you replace uint64_t with uint32_t? In IdSet::Node typedef?
> Any other changes? AFAICT, changing just IdSet::Node badly breaks the
> corresponding binary tree code because we hard-code the number of bits
> per leaf node (at least!) to be 64. I did not audit code for other
> dependencies.
In the code for squid-6.10, in ipc/mem/PageStack.h there is just one
occurrence of `uint64_t` at line 79 inside class IdSet. I had changed
that. But now I understand that I don't have to, rolled it back.
class IdSet
{
public:
using size_type = IdSetMeasurement::size_type;
using Position = IdSetPosition;
...
...
...
private:
typedef uint64_t Node; ///< either leaf or intermediate node
typedef std::atomic<Node> StoredNode; ///< a Node stored in shared
memory
...
...
// No more data members should follow! See FlexibleArray<> for details.
};
>> Further discussion on Openwrt issue tracker suggested [1] the following:
>>
>
> It is possible that the above comment was negatively influenced by the
> previous misleading statement about Squid v4 having no uint64_t: "In
> code for version 4.x, there is no mention of uint64_t. It was introduced
> with 5.x." In reality, Squid has been using 64-bit integers since before
> Squid v3. It is neither practical nor necessary to remove uint64_t from
> Squid so there will be no corresponding conditionals in ./configure.
That was due to my comment there. I actually meant to convey that I
couldn't find a reference to `uint64_t` in the PageStack.cc file as I
simply knew that the assert error message is being generated from the
code in this file.
> The shared binary tree (that contains the assertion) did not exist in
> v4, as we discussed earlier.
Ack. This is the correct statement that I should have used while
replying on Openwrt issue tracker.
>> Is there any change that we need to do in the configure script to
>> check for the availability of 64 bit atomic lock and use 32 bit lock
>> if not available?
>
> It is technically possible (perhaps even without ./configure checks),
> but it would require adjusting complex shared tree code in the abcense
> of comprehensive ready-to-use tests. It is trivial to break that code.
> It is difficult to detect bugs. IMO, we should not expose ourselves to
> such risks in this case, especially since Squid uses 64-bit atomics in
> many other places: Supporting 32 bits in shared binary tree nodes is not
> going to remove the last frequently used 64-bit lock.
Just being curious here, if a certain platform (mips32 in this case) is
unable to guarantee a 64 bit atomic lock, other functions except SMP
mode might get affected as well?
>> Or may be document the fact that it is not advisable / possible to run
>> squid in SMP mode on such platforms that are not able to provide 64
>> bit lock ID.
>
> I believe your experiments with removing the assertion point in a rather
> different direction: If your tests do not suggest otherwise, we should
> downgrade that assertion to a startup warning. Let folks run Squid on
> platforms without 64-bit atomic locks (if they wish to do so), but warn
> them about an uncertain impact. Perhaps we can even convince ourselves
> that the impact can only be on performance (i.e., there can be no
> deadlocks due to mutexes).
>
> Disclaimer: I do not know what "lock ID" is in this context.
I am not a programmer and not very well versed with a lot of these
terms, so I have mixed / messed up while passing messages between the
two forums.
"lock ID" term was used on Openwrt issue tracker where it was suggested
that "The assertion assumes 64bit lock id.". [1]
Let me experiment with squid-6.x on these devices and also use them in
the live environment.
The only change being commenting out the following line from
ipc/mem/PageStack.c:
`assertion(StoredNode().is_lock_free());`
I will report back with success or any failures encountered.
Regards,
Nishant
[1]
"https://github.com/openwrt/packages/issues/24469#issuecomment-2202322703"
More information about the squid-users
mailing list