Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-7325

make lf_hash_delete(), lf_hash_search(), and lf_hash_iterator() never to return OOM

    Details

    • Type: Task
    • Status: Closed
    • Priority: Critical
    • Resolution: Fixed
    • Fix Version/s: 10.1.3
    • Component/s: OTHER
    • 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.

        Gliffy Diagrams

          Attachments

            Activity

            Hide
            serg Sergei Golubchik added a comment - - edited
            Show
            serg Sergei Golubchik added a comment - - edited Sergey Vojtovich , please, take a look at the patch. https://github.com/MariaDB/server/tree/bb-lf-no-oom
            Hide
            svoj Sergey Vojtovich added a comment -

            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.

            Show
            svoj Sergey Vojtovich added a comment - 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.

              People

              • Assignee:
                serg Sergei Golubchik
                Reporter:
                serg Sergei Golubchik
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:

                  Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0 minutes
                  0m
                  Logged:
                  Time Spent - 30 minutes
                  30m