I just found the following. Given there's a scheduled redirect. Then printing out the complete page to STDOUT will immediately send the page to the browser
and quit the cgi process without twiki having a chance to clean up using the
finish()
methods. You will observe that the called method in UI.pm will not return.
That obviously has got a series of consequences, e.g. this is a memory leak. In addition, the cgi session object is not flushed to disk. Not flushing the cgi session will result in session variables getting lost or session variables not being deleted.
Can anybody confirm this?
--
TWiki:Main/MichaelDaum
- 23 Jun 2008
I'm pretty sure you are right. I'm also reasonably sure that the TWiki Standalone work will eliminate this legacy.
--
TWiki:Main.SvenDowideit
- 24 Jun 2008
even nastier are the number of Plugins that take
return
die
or other shortcuts to exit. Too much assumption that its a single exec per request CGI.
--
TWiki:Main.SvenDowideit
- 25 Jun 2008
Honestly they could, if they just finished the session object regularly. For instance, the
RedDotPlugin is doing its own redirect stuff ... based on the content of session variables. Just before it redirects the cgi query, it clears the value of the session variable ... but that won't get flushed to disk as the official redirect will happen at a phase of the code where the session does
not get finished and thus never flushed to disk. So the only solution for
RedDot is to finish() the twiki object itself and
exit.
--
TWiki:Main.MichaelDaum
- 26 Jun 2008
Not sure I fully understand the problem here. A
CGI::redirect
does not of itself quit the calling process; it simply prints a redirect header on STDOUT. The print usually isn't flushed until the process is quit by a subsequent
exit
. So, if you perform a redirect and then immediately
exit
without an intervening
finish
then yes, there is a problem. A quick review of the TWiki core code suggests that all redirects have a
finish
call before the exit, however; unless you know of a specific counter-example?
Users of
TWiki::Func::redirectCgiQuery
will be caught by this, if they have not explicitly called
finish
. I was aware of this problem but didn't move the
finish
and
exit
into
TWiki::redirect
because that would have broken the pre-existing spec of
TWiki::Func::redirectCgiQuery
.
Note that plugins that
die
or
throw
are already in good shape because
TWiki::UI
handles the
finish
.
--
TWiki:Main.CrawfordCurrie
- 27 Jun 2008
The way I discovered this is that the session object was not flushed to disk on a redirect, which is a natural consequence of the
finish()
methods not being called. Poor-man's-debugging (adding print STDERR) showed that as soon as the
CGI::redirect
was print to STDOUT, the method called in
TWiki::UI
did not return and thus the
finish()
call at the end did not get called. Further debugging lent me to the conclusion that all of the process was gone already.
Can anybody reproduce this behavior?
--
TWiki:Main.MichaelDaum
- 30 Jun 2008
I changed UI.pm
63a64,65
> print STDERR "run starts for method $method\n";
>
199a202
> print STDERR "run finished for method $method\n";
in order to see the effect. I surfed some pages. But all messages (even in redirect cases) are paired in the sense
run starts for method CODE(0xb6fba0)
run finished for method CODE(0xb6fba0)
run starts for method CODE(0xb71070)
run finished for method CODE(0xb71070)
Can you describe in what redirect situation this happens? Are there special redirects where this happens? And what's a "scheduled" redirect?
--
TWiki:Main.ChristianLudwig
- 30 Jun 2008
Would a sleep work? Waiting 0.2 sec on a redirect is not noticeable by users
--
TWiki:Main.PeterThoeny
- 07 Jul 2008
TWiki:Codev.GeorgetownReleaseMeeting2008x07x21
decided to downgrade to normal with the comment that the conclusion in the report is probably not correct.
--
TWiki:Main.KennethLavrsen
- 22 Jul 2008