Skip to content
Snippets Groups Projects
  • yonghong-song's avatar
    introduce map.lookup_or_try_init() (#2577) · 82f4302a
    yonghong-song authored
    Previously, map.lookup_or_init() may cause unexpected
    return from the function when lookup finds no element and
    init failed e.g. due to unlikely racy update or
    sometimes hash table full.
    This has caught surprise from many users. So, the commit
      https://github.com/iovisor/bcc/commit/ba64f031f2435aad5a85f8f37dbbe2a982cbbe6b
    attempts to remove the early return in map.lookup_or_init().
    But then since NULL pointer could be returned,
    user will need to change their bpf program to check return value,
    otherwise, verifier will reject the program.
    
    As described in the above, such an API behavior change may cause
    verifier failure and reject previously loadable bpf programs.
    bcc should try to maintain API stability, esp. to avoid subtle
    API behavior change.
    
    This patch propose to restore the behavior of map.lookup_or_init()
    and introduce a new one map.lookup_or_try_init(), which will
    avoid unexpected return. The name is suggested by Alexei
    to reflect that init may fail. map.lookup_or_try_init() will be formally
    documented and used in bcc. A warning will be generated if
    map.lookup_or_init() is used. Documentation will make it clear
    that map.lookup_or_try_init() is preferred over map.lookup_or_init().
    
    ```
    -bash-4.4$ sudo ./syscount.py
    /virtual/main.c:71:11: warning: lookup_or_init() may return from the function, use loopup_or_try_init() instead.
        val = data.lookup_or_init(&key, &zero);
              ^
    1 warning generated.
    Tracing syscalls, printing top 10... Ctrl+C to quit.
    ...
    ```
    
    All uses in examples and tools are converted to use
    lookup_or_try_init(). Most tests are converted to use
    lookup_or_try_init() too except test_trace_maxactive.py
    and test_tracepoint.py to test lookup_or_init()
    functionality.
    Unverified
    82f4302a