NOTE: If you are a developer, please use a private wiki based on foswiki/trunk on a daily base ...or use trunk.foswiki.org to view this page for some minimal testing.
Use Item9693 for docu changes for 1.2 and 2.0.

Item10257: Caching broken in Solaris 10

Priority: CurrentState: AppliesTo: Component: WaitingFor:
Normal New Engine PageCaching  
I just tried out the PageCaching feature for the first time, and found it was broken on my Solaris 10 server:

| 2011-01-14T08:39:21Z warning | can't lock cache db: Bad file number at /data/www/wiki/lib/Foswiki/Cache/DB_File.pm line 167.
 at /usr/local/lib/perl5/5.8.8/CGI/Carp.pm line 356
        CGI::Carp::realdie('can\'t lock cache db: Bad file number at /data/www/wiki/lib/F...') called at /usr/local/lib/perl5/5.8.8/CGI/Carp.pm line 437
        CGI::Carp::die('can\'t lock cache db: Bad file number') called at /data/www/wiki/lib/Foswiki/Cache/DB_File.pm line 167
        Foswiki::Cache::DB_File::_tie('Foswiki::Cache::DB_File=HASH(0xaf59b8)', 'ro') called at /data/www/wiki/lib/Foswiki/Cache/DB_File.pm line 40
        Foswiki::Cache::DB_File::init('Foswiki::Cache::DB_File=HASH(0xaf59b8)', 'Foswiki=HASH(0x9a8b18)') called at /data/www/wiki/lib/Foswiki/Cache.pm line 31
        Foswiki::Cache::new('Foswiki::Cache::DB_File', 'Foswiki=HASH(0x9a8b18)') called at /data/www/wiki/lib/Foswiki/Cache/DB_File.pm line 29
        Foswiki::Cache::DB_File::new('Foswiki::Cache::DB_File', 'Foswiki=HASH(0x9a8b18)') called at /data/www/wiki/lib/Foswiki/PageCache.pm line 62
        Foswiki::PageCache::new('Foswiki::PageCache', 'Foswiki=HASH(0x9a8b18)') called at /data/www/wiki/lib/Foswiki.pm line 1665
        Foswiki::new('Foswiki', 'undef', 'Foswiki::Request=HASH(0x98fd3c)', 'HASH(0x97f178)') called at /data/www/wiki/lib/Foswiki/UI.pm line 309
        Foswiki::UI::__ANON__() called at /usr/local/lib/perl5/site_perl/5.8.8/Error.pm line 415
        eval {...} called at /usr/local/lib/perl5/site_perl/5.8.8/Error.pm line 407
        Error::subs::try('CODE(0x98f994)', 'HASH(0x9a88c0)') called at /data/www/wiki/lib/Foswiki/UI.pm line 435
        Foswiki::UI::_execute('Foswiki::Request=HASH(0x98fd3c)', 'CODE(0x98fa0c)', 'view', 1) called at /data/www/wiki/lib/Foswiki/UI.pm line 277
        Foswiki::UI::handleRequest('Foswiki::Request=HASH(0x98fd3c)') called at /data/www/wiki/lib/Foswiki/Engine/CGI.pm line 37
        Foswiki::Engine::CGI::run('Foswiki::Engine::CGI=HASH(0x6846b8)') called at /data/www/wiki/bin/view line 24
        ModPerl::ROOT::ModPerl::Registry::data_www_wiki_bin_view::handler('Apache2::RequestRec=SCALAR(0x418c4c)') called at /usr/local/lib/perl5/site_perl/5.8.8/sun4-solaris/ModPerl/RegistryCooker.pm line 204
        eval {...} called at /usr/local/lib/perl5/site_perl/5.8.8/sun4-solaris/ModPerl/RegistryCooker.pm line 204
        ModPerl::RegistryCooker::run('ModPerl::Registry=HASH(0x4748a8)') called at /usr/local/lib/perl5/site_perl/5.8.8/sun4-solaris/ModPerl/RegistryCooker.pm line 170
        ModPerl::RegistryCooker::default_handler('ModPerl::Registry=HASH(0x4748a8)') called at /usr/local/lib/perl5/site_perl/5.8.8/sun4-solaris/ModPerl/Registry.pm line 31
        ModPerl::Registry::handler('ModPerl::Registry', 'Apache2::RequestRec=SCALAR(0x418c4c)') called at /data/www/wiki/lib/Foswiki/PageCache.pm line 0
        eval {...} called at /data/www/wiki/lib/Foswiki/PageCache.pm line 0.
 |

Looking into this further, it appears to be due to Foswiki::Cache::DB_File::_tie opening the lock file for writing and then requesting a shared lock. The error raised fits with the documented behaviour:

EBADF The fildes argument is not a valid open file descriptor; or the cmd argument is F_SETLK, F_SETLK64, F_SETLKW, or F_SETLKW64, the type of lock, l_type, is a shared lock (F_RDLCK), and fildes is not a valid file descriptor open for reading; or the type of lock l_type is an exclusive lock (F_WRLCK) and fildes is not a valid file descriptor open for writing.

I was able to fix this in my local codebase with the following, but not sure if this has ramifications to any intended functionality (everything appears to be working for me..):

--- DB_File.pm.orig     2010-11-10 11:29:12.000000000 +1100
+++ DB_File.pm  2011-01-14 19:27:36.409280000 +1100
@@ -154,15 +154,17 @@

     # aquire a file lock
     my $lockfile = "$this->{filename}.lock";
-    open( $this->{lock}, ">$lockfile" )
-      or die "can't create lockfile $lockfile";

     if ( $mode eq 'rw' ) {
+        open( $this->{lock}, ">$lockfile" )
+          or die "can't create lockfile $lockfile";
         $mode = O_CREAT | O_RDWR;
         flock( $this->{lock}, LOCK_EX )
           or die "can't lock cache db: $!";
     }
     elsif ( $mode eq 'ro' ) {
+        open( $this->{lock}, "<$lockfile" )
+          or die "can't create lockfile $lockfile";
         $mode = O_CREAT | O_RDONLY;
         flock( $this->{lock}, LOCK_SH )
           or die "can't lock cache db: $!";

-- MatthewFlint - 14 Jan 2011

 

ItemTemplate edit

Summary Caching broken in Solaris 10
ReportedBy MatthewFlint
Codebase 1.1.2
SVN Range
AppliesTo Engine
Component PageCaching
Priority Normal
CurrentState New
WaitingFor
Checkins
TargetRelease n/a
ReleasedIn n/a
Topic revision: r1 - 14 Jan 2011, MatthewFlint
 
The copyright of the content on this website is held by the contributing authors, except where stated elsewhere. see CopyrightStatement. Creative Commons LicenseGet Foswiki at sourceforge.net. Fast, secure and Free Open Source software downloads