Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Error deleting DBM::Deep file (ref count?)

by bobf (Monsignor)
on Jun 05, 2012 at 21:46 UTC ( #974578=perlquestion: print w/ replies, xml ) Need Help??
bobf has asked for the wisdom of the Perl Monks concerning the following question:

I stumbled across a bug in my code that I tracked down to something I am doing with a DBM::Deep file. When I assign the inner key of a DBM hash-of-hrefs to another variable and then try to delete the file, I get an error when the inner key is a href but not when it is a non-ref scalar.

use strict; use warnings; use DBM::Deep; my $db_file = 'href_nocopy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = {}; } print "\nDeleting $db_file\n"; unlink( $db_file ) || warn $!; # succeeds $db_file = 'href_copy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = {}; my $db2 = $db->{key}; } print "\nDeleting $db_file\n"; unlink( $db_file ) || warn $!; # fails (permission denied) $db_file = 'nonref_copy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = 1; my $db2 = $db->{key}; } print "\nDeleting $db_file\n"; unlink( $db_file ) || warn $!; # succeeds

Any ideas? I didn't find any documentation about this elsewhere.

Thanks

Comment on Error deleting DBM::Deep file (ref count?)
Download Code
Replies are listed 'Best First'.
Re: Error deleting DBM::Deep file (ref count?)
by Athanasius (Abbot) on Jun 06, 2012 at 03:32 UTC

    Hi bobf,

    I’ve not used this module before, but in playing around with your code I’ve made the following observations:

    (1) Your results are duplicated on my system, which is Strawberry Perl 5.14.2 running on Vista 32-bit.

    (2) If I add a call to Data::Dumper like so:

    use Data::Dumper; ... { my $db = DBM::Deep->new( $db_file ); $db->{key} = {}; print "Dump: ", Dumper($db); }

    then href_nocopy fails with the same permission denied error as for href_copy.

    (3) If I add $db->clear(); before the call to unlink, the permission denied errors go away:

    use strict; use warnings; use DBM::Deep; use Data::Dumper; use constant DUMP => 0; # 1 for debugging { my $db_file = 'href_nocopy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = {}; print "Dump: ", Dumper($db) if DUMP; $db->clear(); } print "\nDeleting $db_file\n"; unlink( $db_file ) or warn $!; # succeeds $db_file = 'href_copy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = {}; my $db2 = $db->{key}; print "\nDump: ", Dumper($db) if DUMP; print "Dump: ", Dumper($db2) if DUMP; $db->clear(); } print "\nDeleting $db_file\n"; unlink( $db_file ) or warn $!; # now succeeds! $db_file = 'nonref_copy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = 1; my $db2 = $db->{key}; print "\nDump: ", Dumper($db) if DUMP; print "Dump: ", Dumper($db2) if DUMP; $db->clear(); } print "\nDeleting $db_file\n"; unlink( $db_file ) or warn $!; # succeeds }

    I don’t know what is going on, but maybe the above observations will help?

    Regards,

    Athanasius <°(((><contra mundum

      Thanks very much for looking into this. Interesting observation re: Data::Dumper causing a similar error message. I didn't try to dump the structure so I didn't encounter that behavior.

      I confirmed that calling clear will avoid the error on my system. If it works in my production code as well, I'll declare (partial) victory. I wonder what the root cause is, though.

      Thanks for the idea.

      Update: I tried this in my production code but it did not work. I also tried calling the unlock method, but to no avail.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://974578]
Approved by stevieb
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (16)
As of 2015-07-30 16:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (273 votes), past polls