Skip to content
  • Misaki Shioi's avatar
    3be1baab
    Introduce a timeout to prevent `rb_thread_fd_select` from hanging with write(2) failure (#12457) · 3be1baab
    Misaki Shioi authored
    Rarely, there are cases where a write(2) call from a child thread
    to notify the main thread of the completion of name resolution fails.
    If this happens while the main thread is waiting in `rb_thread_fd_select`,
    rb_thread_fd_select may not notice that the name resolution has completed and end up hanging.
    
    This issue becomes a problem when there are no sockets currently being connected,
    no addresses ready for immediate connection attempts,
    and name resolution has already completed for one address family
    while the main thread is waiting for the name resolution of the other address family.
    (If name resolution is not completed for either address family,
    the chances of write(2) failing in both child threads are likely low.)
    
    To avoid this issue, a timeout is introduced to rb_thread_fd_select under the above conditions.
    This way, even if the issue occurs,
    the completion of name resolution should still be detected
    in the subsequent `if (!resolution_store.is_all_finished) ...` block.
    3be1baab
    Introduce a timeout to prevent `rb_thread_fd_select` from hanging with write(2) failure (#12457)
    Misaki Shioi authored
    Rarely, there are cases where a write(2) call from a child thread
    to notify the main thread of the completion of name resolution fails.
    If this happens while the main thread is waiting in `rb_thread_fd_select`,
    rb_thread_fd_select may not notice that the name resolution has completed and end up hanging.
    
    This issue becomes a problem when there are no sockets currently being connected,
    no addresses ready for immediate connection attempts,
    and name resolution has already completed for one address family
    while the main thread is waiting for the name resolution of the other address family.
    (If name resolution is not completed for either address family,
    the chances of write(2) failing in both child threads are likely low.)
    
    To avoid this issue, a timeout is introduced to rb_thread_fd_select under the above conditions.
    This way, even if the issue occurs,
    the completion of name resolution should still be detected
    in the subsequent `if (!resolution_store.is_all_finished) ...` block.
Loading