commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mladen Turk (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DAEMON-288) Hang while stopping procrun service
Date Wed, 20 Mar 2013 12:21:15 GMT

    [ https://issues.apache.org/jira/browse/DAEMON-288?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13607542#comment-13607542
] 

Mladen Turk commented on DAEMON-288:
------------------------------------

Thanks.
Looks OK, but I have to verify how that behaves with various start/stop method combinations.
Suppose you were only checking JNI methods.
                
> Hang while stopping procrun service
> -----------------------------------
>
>                 Key: DAEMON-288
>                 URL: https://issues.apache.org/jira/browse/DAEMON-288
>             Project: Commons Daemon
>          Issue Type: Bug
>          Components: Procrun
>    Affects Versions: 1.0.13
>         Environment: Windows 7 64 bit
>            Reporter: Mike Miller
>         Attachments: prunsrv.c.patch
>
>
> There is a hang of the procrun service while it is attempting to stop.  It is not easy
to reproduce ( 30%-5% depending on pc ).  Using a debugging to analyze the hang, both the
serviceMain() and serviceStop() threads appear to have run and exited.  I can tell this from
the state of the global variables like gSargs and gShutdownEvents.  Looking at the code, both
are calling reportServiceStatus( SERVICE_STOPPED...).  Typically when either one reports SERVICE_STOPPED,
the main thread unblocks and the process terminates.  This often occurs without both threads
running to completion.  I think this is a race condition caused by the reportServiceStatus()
usage.  The MSDN documentation for SetServiceStatus() states to only call SetServiceStatus()
with SERVICE_STOPPED after all cleanup has occurred and to only call it once.  It appears
that procrun has a race condition where 2 threads will both attempt to report SERVICE_STOPPED
and will likely report this while the other thread is still running.  I believe this is the
root cause of why the Service Control Manager sometimes is unable to stop the service.   
>  
> As a potential solution, I modified serviceStop() to not call reportServiceStatus(SERVICE_STOPPED...)
and to move the SetEvent( gShutdownEvent) to the end of the method.  This change allows the
thread running the  serviceStop() to complete.  Now the only method reporting stopped is when
serviceMain() exits.  With this refactoring to only report SERVICE_STOPPED once (per MSDN)
the hang has not been reproducible.  

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message