I am one of the log4php [1] hackers over at the ASF. We (thats Ivan
Habunek and myself) have now a nasty issue for which we would be glad
about input.

Use case:
Once the log file got a specific size, it will be rolled over. In
other terms, the big logfile gets closed and a new one is opened. This
is supposed to work in a multithreaded environment of course. The user
now claims about multiple creations of small logfiles.

Code [2]:

if(ftell($this->fp) > $this->getMaxFileSize()) {
        if(flock($this->fp, LOCK_EX)) {
                if(ftell($this->fp) > $this->getMaxFileSize()) {

This is the rollover code. We check with ftell, were the latest
position is and if it is to big, we try to get a lock. If it is to big
after we have the lock, we roll it over.

Here mulitiple threads can reach the flock position- then they all
wait until they get the lock of this file. If it has been rolled by a
previous thread, they should have got an updated reference to
$this->fp and skip the rolling.

So, Ivan found out that in the case, we do the second ftell we do not
get updated positions when another thread has written into the file.
The object itself is always the same, for all threads. Every thread
gets this "Appender" from a kind of a pool.

My guess is, every thread gets some kind of a copy of this object,
working at it. Once it reaches the method, its members states are not
reflected into the other stack call.

Docs don't tell me anything for my case. I would be really glad about
suggestions, help, links whatever.



[1] logging.apache.org/log4php

PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to