[MDEV-7325] make lf_hash_delete(), lf_hash_search(), and lf_hash_iterator() never to return OOM Created: 2014-12-15  Updated: 2015-01-28  Resolved: 2015-01-28

Status: Closed
Project: MariaDB Server
Component/s: OTHER
Fix Version/s: 10.1.3

Type: Task Priority: Critical
Reporter: Sergei Golubchik Assignee: Sergei Golubchik
Resolution: Fixed Votes: 0
Labels: None


 Description   

When lf_delete() — for example — searches in the hash it may need to allocate and insert a new dummy node, the latter may fail with OOM. The caller normally doesn't expect OOM from searches or deletes and it's not always easy to handle OOM there.

Instead lf_delete() and lf_search() can be changed never to return OOM. Indeed, when a search cannot insert a new dummy node, it simply needs to start searching from the previous dummy node, which is guaranteed to exist.

It's even easier in lf_hash_iterate() — it only ever looks for the very first bucket, dummy node 0. If that node does not exists, the hash is most certainly empty.



 Comments   
Comment by Sergei Golubchik [ 2015-01-07 ]

svoj, please, take a look at the patch.

https://github.com/MariaDB/server/tree/bb-lf-no-oom

Comment by Sergey Vojtovich [ 2015-01-12 ]

It looks very good, thanks for implementing!

I just have one more wish (better to be implemented separately): make lf_hash_get_pins() never to return OOM.

One way to solve this is to allow to preallocate max possible number of pins (e.g. table cache doesn't need more pins than max_connections?).

Another way is to have static pins protected by mutex. They will be returned on OOM only.

Generated at Thu Feb 08 07:18:43 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.