Many thanks to you all. I am still trying to figure out the issue. Let me re-explain the problem I experienced with some details.
The environment is Ubuntu 22.04, Apache2, ModPerl. I run a Http::request with LWP::UserAgent, the server receives the request and starts to process it. But it takes much longer due to a stalled SFTP call to the remote server, the Apache server timeout and sends back failure, meanwhile,* the server actually is still trying to process this request*. On the calling side, after receiving the failure status, it initiates another http::request and the load balancer redirects this call to another server for processing. It turns out this same http::request is processed twice. On my production server the timeout happens at 300 seconds mark. On my QA and Dev server, the timeout happens at 600 seconds. I have not changed anything on my production server yet. But on my QA and DEV servers, I have tried to change Timeout in apache2.conf, have tried to add Timeout to the virtualhost config, also have tried to add SetPerlEnv MOD_PERL_TIMEOUT to the virtualhost config, none of them change the timeout behavior of my QA and DEV servers. So what exactly controls the Timeout? I am totally lost. Cheers, Joe On Wed, Apr 23, 2025 at 5:17 PM Mithun Bhattacharya <mit...@gmail.com> wrote: > Okay agreed that is a valid time out basically it is saying that a client > has established tcp/ip connection but has not put its request either a get > put or a post > > On Wed, Apr 23, 2025, 3:38 PM Joseph He <joseph.he.2...@gmail.com> wrote: > >> On Apache2 doc, I found this. How does this timeout work? It looks like >> it can only wait for 300 seconds before failing a request. >> >> https://httpd.apache.org/docs/2.0/mod/core.html#timeout >> Description: >> <https://httpd.apache.org/docs/2.0/mod/directive-dict.html#Description> >> Amount >> of time the server will wait for certain events before failing a request >> Syntax: >> <https://httpd.apache.org/docs/2.0/mod/directive-dict.html#Syntax> >> TimeOut seconds >> Default: >> <https://httpd.apache.org/docs/2.0/mod/directive-dict.html#Default> TimeOut >> 300 >> Context: >> <https://httpd.apache.org/docs/2.0/mod/directive-dict.html#Context> server >> config, virtual host >> Status: >> <https://httpd.apache.org/docs/2.0/mod/directive-dict.html#Status> Core >> Module: >> <https://httpd.apache.org/docs/2.0/mod/directive-dict.html#Module> core >> >> The TimeOut directive currently defines the amount of time Apache will >> wait for three things: >> >> 1. The total amount of time it takes to receive a GET request. >> 2. The amount of time between receipt of TCP packets on a POST or PUT >> request. >> 3. The amount of time between ACKs on transmissions of TCP packets in >> responses. >> >> We plan on making these separately configurable at some point down the >> road. The timer used to default to 1200 before 1.2, but has been lowered to >> 300 which is still far more than necessary in most situations. It is not >> set any lower by default because there may still be odd places in the code >> where the timer is not reset when a packet is sent. >> >> On Wed, Apr 23, 2025 at 3:07 PM Mithun Bhattacharya <mit...@gmail.com> >> wrote: >> >>> You configure timeout at the client side. Apache is at the server side. >>> Server doesn't have a concept of time it could take days to run and not >>> care. >>> >>> mod_perl code is where you are sending the http return status to make >>> sure the client doesn't timeout waiting for the server to respond. >>> >>> On Wed, Apr 23, 2025, 2:19 PM Joseph He <joseph.he.2...@gmail.com> >>> wrote: >>> >>>> Thanks, all. >>>> Is that Apache timeout controlled by its configuration "Timeout"? >>>> I don't think it has anything to do with modPerl. Am I missing >>>> something? >>>> Thanks. >>>> >>>> On Wed, Apr 23, 2025 at 1:41 PM Mithun Bhattacharya <mit...@gmail.com> >>>> wrote: >>>> >>>>> Timeout happens because of how we handle the request. Timeout is >>>>> basically no response came back. Why that happens is because we think we >>>>> want to have a correct response. Unfortunately for long running requests >>>>> the correct response shouldn't be via http response code or we face >>>>> situations like this. Instead reply with a 200 OK immediately and then >>>>> provide correct status in the message body. Once a response code/header >>>>> has >>>>> been sent timeout won't trigger and you could potentially hold the >>>>> connection for hours without a problem. >>>>> >>>>> On Wed, Apr 23, 2025, 9:32 AM Andreas Mock <andreas.m...@web.de> >>>>> wrote: >>>>> >>>>>> Hi Joseph, >>>>>> >>>>>> your description is very vague, so can only answer on some >>>>>> assumptions: >>>>>> >>>>>> It sounds like a timeout is fired somewhere. >>>>>> >>>>>> Best advice in these situations: Log as many steps as you can. Keep >>>>>> your >>>>>> eyes open on TCP/IP and higher level timeouts. >>>>>> >>>>>> Declare only ONE instance responsible for a retry: Either the app >>>>>> server >>>>>> calling the dispatcher with several tries or the dispatcher trying >>>>>> for >>>>>> himself. Not both. >>>>>> >>>>>> Best regards >>>>>> Andreas >>>>>> >>>>>> >>>>>> Am 23.04.2025 um 16:21 schrieb Joseph He: >>>>>> > All, good day. >>>>>> > >>>>>> > Here is the issue I have. >>>>>> > My entire application is running on ModPerl/Apache environment. >>>>>> > I send Http::Request with data load from my App server to a >>>>>> dispatch >>>>>> > server thru LWP::UserAgent, I set the timeout 600 seconds. >>>>>> > >>>>>> > The dispatch server is supposed to manipulate the data and send the >>>>>> > data to an external SFTP server. Because the SFTP can fail, it will >>>>>> > keep trying up to 4 times with 30 seconds sleep in case that SFTP >>>>>> > connection fails. >>>>>> > >>>>>> > Recently, I found that I uploaded the file twice sometimes. I >>>>>> figured >>>>>> > out the root cause is that my Dispatch server returns 'failure' at >>>>>> 6 >>>>>> > minutes while it keeps trying to do the SFTP. The App server >>>>>> > received HTTP::Response with error status so it issued another call >>>>>> to >>>>>> > send data. It turns out I uploaded the identified file twice. >>>>>> > >>>>>> > Anybody has this sort of experience? Why does the dispatch server >>>>>> > return 'error' while it still processes the data? >>>>>> > >>>>>> > Thanks a lot, >>>>>> > Joseph >>>>>> > >>>>>> >>>>>