perl5-porters, any thoughts on this? Any fix needs to be within the debugger. Making the debugger close all handles that weren't open when the process started seems 'most correct' as it would make the 'restarted' execution closer to the original execution.
Tim. On Thu, Jul 08, 2004 at 03:42:43PM -0400, Andrew Pimlott wrote: > I often use the 'R' command of the perl debugger in order to restart my > program. This works by re-exec-ing the debugger. The problem is that > any database connections I have open remain open, keeping transactions > alive, and thus blocking subsequent activity. I observe this problem > with DBD::Pg and DBD::Sybase (with FreeTDS) in Perl 5.8.3. > > I can think of several potential solutions, but I'm not sure which is > the most promising: > > - Have the database drivers set the close-on-exec flag of the fd used to > connect to the database. This makes sense to me, because after an > exec, there is usually no way to recover the connection (does any > database library allow this?). It would seem that this should be done > by the native (C) client library, rather than the DBD wrapper, but it > could be done in the DBD as a work-around. On the other hand, Perl > likes to set close-on-exec on fds opened within perl, so maybe DBDs > should do the same. Can anyone think of a reason not to set > close-on-exec, and do you have an opinion of where it should be done? > > - Have the debugger close all open filehandles, other than the standard > ones and internal ones, before re-exec-ing. This might be the > simplest. Does anyone depend on filehandles remaining open across > debugger restarts? > > - Have the debugger run all destructors before re-exec-ing, which will > cause all connections to be closed cleanly. I don't know this is even > possible within perl, and it carries the usual issues with global > destruction, but if it can be done it should work. > > Opinions? > > Andrew
