DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=29060>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=29060

synchronized block too small in method createSession class session/ManagerBase.java





------- Additional Comments From [EMAIL PROTECTED]  2004-05-18 13:48 -------
It's not speculation, I just read and understand what's in the code.

The code synchronizes on the HashMap "sessions" when creating a new session. One
of the reasons is to ensure that a newly generated sessionId is not used
already. The code says:

"// Guarantee uniqueness"

Now assume thread A generates a new sessionId X, and a parallely running thread
B creates the same sessionId X after A leaves the synchronized block but before
A calls setId. Then B will not find this session in the HashMap "sessions" and
use the same sessionId X as new.

If you move the call to setId() inside the synchronized block, then the
sessionId X is written into the HashMap before B is able to access the HashMap,
so B will find X as already existing sessionId and generate another one.

The proof is mathematically/logically. 

Of course this bug will only show up, if 
a) generateSessionId does not create unique sessionIDs
b) and one thread is thrown off the CPU exactly between the end of the
synchronized block and the next line or threads excuting in parallel on
multi-CPU systems.

Assumption b) is not under your control, so this might happen often, especially
under high load. Assumption a) seems to be true, because in the existing code
there is already the comment

"// Guarantee uniqueness"

and the author checks every newly generated sessionId for existence.

javadoc says the author is Craig R. McClanahan. Maybe you could pass the
information to him?

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to