• sundb's avatar
    Fix the timing of read and write events under kqueue (#9416) · 306a5ccd
    sundb authored
    Normally we execute the read event first and then the write event.
    When the barrier is set, we will do it reverse.
    However, under `kqueue`, if an `fd` has both read and write events,
    reading the event using `kevent` will generate two events, which will
    result in uncontrolled read and write timing.
    
    This also means that the guarantees of AOF `appendfsync` = `always` are
    not met on MacOS without this fix.
    
    The main change to this pr is to cache the events already obtained when reading
    them, so that if the same `fd` occurs again, only the mask in the cache is updated,
    rather than a new event is generated.
    
    This was exposed by the following test failure on MacOS:
    ```
    *** [err]: AOF fsync always barrier issue in tests/integration/aof.tcl
    Expected 544 != 544 (context: type eval line 26 cmd {assert {$size1 != $size2}} proc ::test)
    ```
    306a5ccd
ae_kqueue.c 6.64 KB