Re: blead-156-g46807d8 on VMS failures
[email protected] (John Malmberg)
| Newsgroups | perl.perl5.porters,perl.vmsperl |
|---|---|
| Message-ID | <[email protected]> |
Craig A. Berry wrote:
>
> On Dec 31, 2008, at 7:04 PM, John Malmberg wrote:
>
>> With this build, I am seeing the following failures on VMS:
>>
>> lib/Thread/Queue/t/02_refs.t is failing on tests 18, 23, 24, and 26
>
> I haven't looked at that one yet.
I do not recall seeing anything in the changes that I could track this
to. There were over 100 commits since I last synced up.
>> The new test lib/autodie/truncate.t fails on test 3 and then hangs
>> until it is killed.
>>
>> EAGLE> mcr [-]ndbgperl.exe -d "-I../" lib/autodie/truncate.t
>>
>> Daughter DB session started...
>> 1..3
>> ok 1 - Truncating STDOUT should throw an exception isa autodie::exception
>> ok 2 - Truncating an unopened file is wrong. isa autodie::exception
>> not ok 3 - Truncating a normal file should be fine
>> # Failed test 'Truncating a normal file should be fine'
>> # at lib/autodie/truncate.t line 52.
>> # got: 'Can't truncate('VMS::Stdio=GLOB(0x1118210)', '0'):
>> invalid argument at (eval 47)[/PROJECT_ROOT/PERL-BLEAD/lib/Fatal
>> .pm:829] line 30
>> # '
>> # expected: ''
>
> I've noticed this too but haven't gotten to the bottom of it yet. The
> code where the hang occurs looks like this:
>
> eval {
> use autodie;
> truncate($tmpfh, 0);
> };
>
> is($@, "", "Truncating a normal file should be fine");
>
> The first clue as to what's wrong is that it isn't really a "normal"
> file that we are attempting to truncate -- it is a temp file with the
> delete-on-close bit set. It was opened by VMS::Stdio::vmssysopen from
> File::Temp.
>
>> The hang appears to be here:
>>
>> *PERLIO PerlIOUnix_close 80449 0000000000006B38 00000000000CB1B8
>> *PERLIO PerlIOBase_close 79879 00000000000053DC 00000000000C9A5C
>> *PERLIO PerlIOBuf_close 81783 000000000000984C 00000000000CDECC
>> *PERLIO PerlIO__close 79117 0000000000002B6C 00000000000C71EC
>> *PERLIO Perl_PerlIO_close 79130 0000000000002C14 00000000000C7294
>> *DOIO Perl_io_close 71328 0000000000003824 0000000000127274
>> *DOIO Perl_do_close 71289 00000000000034A0 0000000000126EF0
>> *PP_SYS Perl_pp_close 70940 00000000000021AC 0000000000236ABC
>> *DUMP Perl_runops_debug 81364 00000000000087C4 00000000001B9164
>> *PERL Perl_call_sv 73195 0000000000005B48 00000000000BD478
>> *PERL Perl_call_list 80754 000000000000BF78 00000000000C38A8
>> *PERL perl_destruct 71132 0000000000000F78 00000000000B88A8
>>
>
> What's hanging is when the END block in File::Temp tries to clean up by
> closing the file. There may be a pending write or something.
>
> I think there are really two problems. There is the hang in
> File::Temp's clean-up code. We should check to make sure the right
> flavor of flush is getting called for something opened from VMS::Stdio.
As I recall there are cases where the flush call on VMS is a noop
instead of an fsync() which is needed.
Also unless the fsync() is called, stat()/fstat() will not report the
correct file size if something is watching that.
> Upstream of that is the problem that we cannot call truncate on a
> filehandle opened with VMS::Stdio. The documentation for VMS::Stdio
> says VMS::Stdio ISA IO::File and you can treat its handles like any
> other Perl filehandles. So something in the class metadata appears to
> be getting mangled.
I have patched my local copy not to run that test until I get the rest
of the DECC$FILENAME_UNIX_REPORT mode straighted out.
Both of these are failing in the same way in the UNIX mode.
-John
[email protected]
Personal Opinion Only