--- 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