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
wb8...@gmail.com
Personal Opinion Only

Reply via email to