[prev in list] [next in list] [prev in thread] [next in thread] 

List:       rampart-c-dev
Subject:    [jira] Updated: (AXIS2C-1537) HTTP server crashes during shutdown
From:       "Thomas Gentsch (JIRA)" <jira () apache ! org>
Date:       2011-02-20 14:16:38
Message-ID: 528242956.4492.1298211398428.JavaMail.tomcat () hel ! zones ! apache ! org
[Download RAW message or body]


     [ https://issues.apache.org/jira/browse/AXIS2C-1537?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel \
]

Thomas Gentsch updated AXIS2C-1537:
-----------------------------------

    Attachment: http_server_main.c.patch
                http_svr_thread.c.patch

Patches for problem

> HTTP server crashes during shutdown
> -----------------------------------
> 
> Key: AXIS2C-1537
> URL: https://issues.apache.org/jira/browse/AXIS2C-1537
> Project: Axis2-C
> Issue Type: Bug
> Components: transport/http
> Affects Versions: 1.6.0
> Environment: Linux + Windows
> Reporter: Thomas Gentsch
> Attachments: http_server_main.c.patch, http_svr_thread.c.patch
> 
> 
> I experience some infrequent crashes at stopping an Axis server using
> axis2_http_server_stop(...);
> axis2_transport_receiver_free(...);
> Now it looks to me as if
> - axis2_http_server_stop() just closes the listening socket of the 
> listener thread and sets "stopped" to true
> - then, the listener thread (in axis2_http_svr_thread_run) returns 
> from axutil_network_handler_svr_socket_accept()
> and checks the worker:
> if (!svr_thread->worker) ...
> But:
> - axis2_transport_receiver_free() indirectly calls 
> axis2_http_server_free() which in turn destroys and frees 
> server_impl->svr_thread
> I'm not sure yet whether I understand this completely, but it looks as
> if then (depending on which thread is faster) the listener accessed
> memory now already freed.
> In a first approach I moved in my own server prog the
> axis2_transport_receiver_free() after starting the HTTP server, i.e.:
> if(axis2_transport_receiver_start(srv, env) == AXIS2_FAILURE)
> {
> // err handling
> }
> printf("Listener returned\n");
> axis2_transport_receiver_free(...);
> This changes things a bit, now the crash comes later in
> axis2_http_svr_thread_run
> axutil_thread_pool_get_thread(..., axis2_svr_thread_worker_func
> ...
> axutil_stream_free
> But the question is: Is it right that the listener continues at all
> after the accept() returns a failure?
> I have inserted another test for "stopped" and, if so, break the
> listener loop and, so far, it seems to be ok.
> axis2_http_svr_thread_run(...)
> {
> ...
> socket = (int)axutil_network_handler_svr_socket_accept(env,
> svr_thread-> listen_socket);
> if(svr_thread->stopped)
> {
> break;
> }
> Does that ring any bells? Could somebody more experienced please think
> about that scenario (while having a look into the code)?
> I'll do more testing and, hoping that all keeps working, create a defect
> +patch.

-- 
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: c-dev-unsubscribe@axis.apache.org
For additional commands, e-mail: c-dev-help@axis.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic