[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. |
| 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. |