tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Caldarale, Charles R" <Chuck.Caldar...@unisys.com>
Subject RE: Tomcat Acceptor Thread goes into wait() to never come back - Tomcat 6.0
Date Tue, 02 Mar 2010 03:42:27 GMT
> From: Harshad Kamat [mailto:hnkamat@gmail.com]
> Subject: Tomcat Acceptor Thread goes into wait() to never come back -
> Tomcat 6.0
> 
> I believe I've found a race condition in Tomcat that causes the http
> port to be non-responsive.

I believe you are correct.  To close the timing window, the lock needs to remain up across
the call to createWorkerThread() and the test for null.  Something like this would work:

    protected Worker getWorkerThread() {
        Worker workerThread;
        // Allocate a new worker thread
        synchronized (workers) {
            while ((workerThread = createWorkerThread()) == null) {
                try {
                    workers.wait();
                } catch (InterruptedException e) {
                    // Ignore
                }
            }
        }
        return workerThread;
    }

While we're at it, the synchronized clause in createWorkerThread() can now be eliminated,
and the method simplified (and a lot of useless and confusing parentheses removed):

    protected Worker createWorkerThread() {
        if (workers.size() > 0) {
            curThreadsBusy++;
            return workers.pop();
        }
        if (maxThreads < 0 || curThreads < maxThreads) {
            curThreadsBusy++;
            if (curThreadsBusy == maxThreads) {
                log.info(sm.getString("endpoint.info.maxThreads",
                         Integer.toString(maxThreads), address,
                         Integer.toString(port)));
            }
            return newWorkerThread();
        }
        return null;
    }

The two methods could be combined, but it would probably be uglier.  One could also fix the
symptom by putting a time limit on the wait() call, but that offends the sensibilities.

 - Chuck


THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY MATERIAL and is thus
for use only by the intended recipient. If you received this in error, please contact the
sender and delete the e-mail and its attachments from all computers.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Mime
View raw message