Github user scw00 commented on the issue:

    https://github.com/apache/trafficserver/issues/1531
  
    There are reasons for this creash:
    1、ATS try to connect the origin server, but receive RST package. So ATS 
try again until retry_times == 0. It will clean the server_entry (mark the VC 
as closed, remove this VC from write_ready_list and read_ready_list, then close 
it) in every times except the last one(It is easy to re-product), so it will 
call both read sm and write sm in the last times, and the write sm causes crash.
    2、Epoll trigger EPOLLERR without EVENTIO_READ(hard to re-product).
    
    In my opinion, the EPOLLERR always with read.enabled or 
write.enabled(otherwise, there is no sm could handle this event, we just 
ignore). So when EPOLLERR happens, we could push the vc into read_ready_list if 
the read.enabled == 1, otherwise push it into write_ready_list.
    
    By the way, there is my program to re-product this crash:
    ```
    package main
    
    import (
        "net"
        "os"
        "fmt"
    )
    
    func main()  {
    
        ls, err := net.Listen("tcp", os.Args[1])
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
    
        for {
                conn, err := ls.Accept()
                if err != nil {
                        fmt.Println(err)
                        os.Exit(1)
                }
                go handleConnection(conn)
        }
    }
    
    func handleConnection(con net.Conn)  {
        con.Close()
    }
    ```


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

Reply via email to