[Catalyst] Re: Have exceeded the maximum number of attempts (1000)
to open temp file/dir
neil.lunn
neil at mylunn.id.au
Tue Nov 5 00:20:36 GMT 2013
On 5/11/2013 1:24 AM, Bill Moseley wrote:
>
> On Fri, Oct 25, 2013 at 6:51 AM, Bill Moseley <moseley at hank.org =
> <mailto:moseley at hank.org>> wrote:
>
>
> [ERROR] "Caught exception in engine "Error in tempfile() using
> /tmp/XXXXXXXXXX: Have exceeded the maximum number of attempts
> (1000) to open temp file/dir
>
>
>
> I don't really see how this can be a Catalyst issue, but I can't =
> reproduce it outside of Catalyst -- and outside of our production =
> environment.
>
> Can anyone think of anything else that might be going on here?
I'd be thinking along the lines of mod_perl is evil. From a quick google =
of "mod_perl srand" there seem to be some similar cases. And a where to =
call srand in this post: =
http://blogs.perl.org/users/brian_phillips/2010/06/when-rand-isnt-random.ht=
ml
Give it a try.
>
>
> The template has 10 "X" that are replaced by I think 63 random ascii =
> characters. 63^10 is a huge number of random strings. File::Temp =
> only loops when sysopen returns EEXISTS -- that is, when sysopen fails =
> AND the error is that the file already exists.
>
> Sure, there's 50 web processes but the odds of them all being in exact =
> lock-step with calling rand() is unlikely. And even if they started =
> out that way if two processes opened the exact same name at the same =
> time one process would just try the next random name and be done.
>
> I have something like 26K files in /tmp, so nothing compared to 63^10. =
> And each web server is only seeing about 10 request/sec.
>
> It's just not making sense.
>
>
> Again, I'm unable to replicate the problem with a simple test script =
> that is designed to clash.
>
> I fork 50 (or more) child processes to replicate the web server =
> processes and then in each one I do this:
>
>
> # Wait until top of the second so each child procss starts =
> about the same time.
>
> my $t =3D time(); # Time::HiRes
> sleep( int( $t ) + 1 - $t );
>
>
> for ( 1 .. 500 ) {
>
> my $fh =3D File::Temp->new(
> TEMPLATE =3D> 'bill_XXXXX',
> DIR =3D> '/tmp',
> );
>
> }
>
>
> And never see any contention.
>
>
> The File::Temp docs say:
>
> If you are forking many processes in parallel that are all
> creating
> temporary files, you may need to reset the random number seed
> using
> srand(EXPR) in each child else all the children will attempt
> to walk
> through the same set of random file names and may well cause
> themselves to give up if they exceed the number of retry attempts.
>
>
> We are running under mod_perl. Could it be as simple as the
> procs all were in sync? I'm just surprised this has not happened
> before. Is there another explanation?
>
> Where would you suggest to call srand()?
>
>
> Another problem, and one I've commented
> <https://rt.cpan.org/Public/Bug/Display.html?id=3D84004> on before,
> is that HTTP::Body doesn't use File::Temp's unlink feature and
> depends on Catalyst cleaning up. This results in orphaned files
> left on temp disk.
>
>
>
>
>
> -- =
> Bill Moseley
> moseley at hank.org <mailto:moseley at hank.org>
>
>
>
>
> -- =
> Bill Moseley
> moseley at hank.org <mailto:moseley at hank.org>
>
>
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.u=
k/
> Dev site: http://dev.catalyst.perl.org/
---
This email is free from viruses and malware because avast! Antivirus protec=
tion is active.
http://www.avast.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/catalyst/attachments/20131105/b4add=
fe5/attachment.htm
More information about the Catalyst
mailing list