--- rat/lonuserstate.pm 2009/11/16 20:26:04 1.128.2.3 +++ rat/lonuserstate.pm 2009/11/15 14:08:53 1.132 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Construct and maintain state and binary representation of course for user # -# $Id: lonuserstate.pm,v 1.128.2.3 2009/11/16 20:26:04 raeburn Exp $ +# $Id: lonuserstate.pm,v 1.132 2009/11/15 14:08:53 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -645,17 +645,13 @@ sub readmap { my $uri; $short=~s/\//\_/g; unless ($uri=$cenv{'url'}) { - &Apache::lonnet::logthis('WARNING: '. + &Apache::lonnet::logthis("WARNING: ". "Could not load course $short."); return ('',&mt('No course data available.'));; } @cond=('true:normal'); - unless (open(LOCKFILE,">$fn.db.lock")) { - $errtext.='
'.&mt('Map not loaded - Lock file could not be opened when reading map:').' '.$fn.'.'; - $retfurl = ''; - return ($retfurl,$errtext); - } + open(LOCKFILE,">$fn.db.lock"); my $lock=0; my $gotstate=0; if (flock(LOCKFILE,LOCK_EX|LOCK_NB)) { @@ -688,9 +684,10 @@ sub readmap { 'Could not untie coursemap hash '.$fn.' for '.$uri.'.
'); } } - flock(LOCKFILE,LOCK_UN); + flock(LOCKFILE,LOCK_UN); + close(LOCKFILE); } - unless ($lock && $tiedhash && $tiedparmhash) { + unless ($lock && $tiedhash && $tiedparmhash) { # if we are here it is likely because we are already trying to # initialize the course in another child, busy wait trying to # tie the hashes for the next 90 seconds, if we succeed forward @@ -703,7 +700,7 @@ sub readmap { } if ($tiedhash) { unless($untiedhash) { - untie(%hash); + untie(%hash); } } if ($tiedparmhash) { @@ -711,8 +708,8 @@ sub readmap { untie(%parmhash); } } - &Apache::lonnet::logthis('WARNING: '. - "Could not tie coursemap $fn for $uri."); + &Apache::lonnet::logthis("WARNING: ". + "Could not tie coursemap $fn for $uri."); $tiedhash = ''; $tiedparmhash = ''; my $i=0; @@ -728,22 +725,21 @@ sub readmap { if (-e "$fn.state") { $retfurl='/adm/navmaps'; &Apache::lonnet::appenv({"request.course.id" => $short, - "request.course.fn" => $fn, + "request.course.fn" => $fn, "request.course.uri" => $uri}); - $untiedhash = untie(%hash); - $untiedparmhash = untie(%parmhash); + $untiedhash = untie(%hash); + $untiedparmhash = untie(%parmhash); $gotstate = 1; last; - } + } $untiedparmhash = untie(%parmhash); - } - $untiedhash = untie(%hash); - } - } + } + $untiedhash = untie(%hash); + } + } } if ($lock) { flock(LOCKFILE,LOCK_UN); - $lock = 0; if ($tiedparmhash) { unless ($untiedparmhash) { &Apache::lonnet::logthis('WARNING: '. @@ -759,49 +755,52 @@ sub readmap { } } unless ($gotstate) { - $lock = 0; &Apache::lonnet::logthis('WARNING: '. 'Could not read statemap '.$fn.' for '.$uri.'.'); &unlink_tmpfiles($fn); - if (flock(LOCKFILE,LOCK_EX|LOCK_NB)) { - $lock=1; - } - undef %randompick; - undef %hiddenurl; - undef %encurl; - $retfrid=''; - if ($lock) { - if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT(),0640)) { - if (tie(%parmhash,'GDBM_File',$fn.'_parms.db',&GDBM_WRCREAT(),0640)) { - $gotstate = &build_tmp_hashes($uri,$fn,$short,\%cenv); - unless ($gotstate) { + if (open(LOCKFILE,">$fn.db.lock")) { + my $lock=0; + if (flock(LOCKFILE,LOCK_EX|LOCK_NB)) { + $lock=1; + &unlink_tmpfiles($fn); + } + undef %randompick; + undef %hiddenurl; + undef %encurl; + $retfrid=''; + if ($lock) { + if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT(),0640)) { + if (tie(%parmhash,'GDBM_File',$fn.'_parms.db',&GDBM_WRCREAT(),0640)) { + $gotstate = &build_tmp_hashes($uri,$fn,$short,\%cenv); + unless ($gotstate) { + &Apache::lonnet::logthis('WARNING: '. + 'Failed to write statemap at second attempt '.$fn.' for '.$uri.'.'); + } + unless (untie(%parmhash)) { + &Apache::lonnet::logthis('WARNING: '. + 'Could not untie coursemap parmhash '.$fn.'.db for '.$uri.'.'); + } + } else { &Apache::lonnet::logthis('WARNING: '. - 'Failed to write statemap at second attempt '.$fn.' for '.$uri.'.'); + 'Could not tie coursemap '.$fn.'__parms.db for '.$uri.'.'); } - unless (untie(%parmhash)) { + unless (untie(%hash)) { &Apache::lonnet::logthis('WARNING: '. - 'Could not untie coursemap parmhash '.$fn.'.db for '.$uri.'.'); + 'Could not untie coursemap hash '.$fn.'.db for '.$uri.'.'); } - } else { - &Apache::lonnet::logthis('WARNING: '. - 'Could not tie coursemap '.$fn.'__parms.db for '.$uri.'.'); - } - unless (untie(%hash)) { - &Apache::lonnet::logthis('WARNING: '. - 'Could not untie coursemap hash '.$fn.'.db for '.$uri.'.'); - } + } else { + &Apache::lonnet::logthis('WARNING: '. + 'Could not tie coursemap '.$fn.'.db for '.$uri.'.'); + } + flock(LOCKFILE,LOCK_UN); + close(LOCKFILE); } else { - &Apache::lonnet::logthis('WARNING: '. - 'Could not tie coursemap '.$fn.'.db for '.$uri.'.'); + &Apache::lonnet::logthis('WARNING: '. + 'Could not obtain lock to tie coursemap hash '.$fn.'.db for '.$uri.'.'); } - flock(LOCKFILE,LOCK_UN); - $lock = 0; - } else { - &Apache::lonnet::logthis('WARNING: '. - 'Could not obtain lock to tie coursemap hash '.$fn.'.db for '.$uri.'.'); + close(LOCKFILE); } } - close(LOCKFILE); unless (($errtext eq '') || ($env{'request.course.uri'} =~ m{^/uploaded/})) { &Apache::lonmsg::author_res_msg($env{'request.course.uri'}, $errtext); @@ -1002,37 +1001,33 @@ of course for user. This is part of the LearningOnline Network with CAPA project described at http://www.lon-capa.org. -=head1 HANDLER SUBROUTINE - -There is no handler subroutine. - -=head1 OTHER SUBROUTINES +=head1 SUBROUTINES -=over 4 +=over -=item * +=item loadmap() -loadmap() : Loads map from disk +Loads map from disk -=item * +=item simplify() -simplify() : Simplify expression +Simplify expression -=item * +=item traceroute() -traceroute() : Build condition hash +Build condition hash -=item * +=item accinit() -accinit() : Cascading conditions, quick access, parameters +Cascading conditions, quick access, parameters -=item * +=item readmap() -readmap() : Read map and all submaps +Read map and all submaps -=item * +=item evalstate() -evalstate() : Evaluate state string +Evaluate state string =back