[LON-CAPA-cvs] cvs: rat / lonuserstate.pm

raeburn raeburn@source.lon-capa.org
Sun, 15 Nov 2009 21:31:23 -0000


raeburn		Sun Nov 15 21:31:23 2009 EDT

  Modified files:              
    /rat	lonuserstate.pm 
  Log:
  - Early out if $fn.db.lock (filehandle: LOCKFILE) cannot be opened.
  - close file pointed to by LOCKFILE filehandle when all readmap actions complete.
  
  
Index: rat/lonuserstate.pm
diff -u rat/lonuserstate.pm:1.132 rat/lonuserstate.pm:1.133
--- rat/lonuserstate.pm:1.132	Sun Nov 15 14:08:53 2009
+++ rat/lonuserstate.pm	Sun Nov 15 21:31:23 2009
@@ -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.132 2009/11/15 14:08:53 raeburn Exp $
+# $Id: lonuserstate.pm,v 1.133 2009/11/15 21:31:23 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -645,13 +645,17 @@
     my $uri;
     $short=~s/\//\_/g;
     unless ($uri=$cenv{'url'}) { 
-	&Apache::lonnet::logthis("<font color=blue>WARNING: ".
+	&Apache::lonnet::logthis('<font color="blue">WARNING: '.
 				 "Could not load course $short.</font>"); 
 	return ('',&mt('No course data available.'));;
     }
     @cond=('true:normal');
 
-    open(LOCKFILE,">$fn.db.lock");
+    unless (open(LOCKFILE,">$fn.db.lock")) {
+        $errtext.='<br />'.&mt('Map not loaded - Lock file could not be opened when reading map:').' <tt>'.$fn.'</tt>.';
+        $retfurl = '';
+        return ($retfurl,$errtext);
+    }
     my $lock=0;
     my $gotstate=0;
     if (flock(LOCKFILE,LOCK_EX|LOCK_NB)) {
@@ -685,7 +689,6 @@
             }
         }
 	flock(LOCKFILE,LOCK_UN);
-	close(LOCKFILE);
     }
     unless ($lock && $tiedhash && $tiedparmhash) { 
 	# if we are here it is likely because we are already trying to 
@@ -708,7 +711,7 @@
                 untie(%parmhash);
             }
         }
-	&Apache::lonnet::logthis("<font color=blue>WARNING: ".
+	&Apache::lonnet::logthis('<font color="blue">WARNING: '.
 				 "Could not tie coursemap $fn for $uri.</font>");
         $tiedhash = '';
         $tiedparmhash = '';
@@ -740,6 +743,7 @@
 	}
         if ($lock) {
             flock(LOCKFILE,LOCK_UN);
+            $lock = 0;
             if ($tiedparmhash) {
                 unless ($untiedparmhash) {
                     &Apache::lonnet::logthis('<font color="blue">WARNING: '.
@@ -755,52 +759,49 @@
         }
     }
     unless ($gotstate) {
+        $lock = 0;
         &Apache::lonnet::logthis('<font color="blue">WARNING: '.
                      'Could not read statemap '.$fn.' for '.$uri.'.</font>');
         &unlink_tmpfiles($fn);
-        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('<font color="blue">WARNING: '.
-                                'Failed to write statemap at second attempt '.$fn.' for '.$uri.'.</font>');
-                        }
-                        unless (untie(%parmhash)) {
-                            &Apache::lonnet::logthis('<font color="blue">WARNING: '.
-                                'Could not untie coursemap parmhash '.$fn.'.db for '.$uri.'.</font>');
-                        }
-                    } else {
+        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) {
                         &Apache::lonnet::logthis('<font color="blue">WARNING: '.
-                            'Could not tie coursemap '.$fn.'__parms.db for '.$uri.'.</font>');
+                            'Failed to write statemap at second attempt '.$fn.' for '.$uri.'.</font>');
                     }
-                    unless (untie(%hash)) {
+                    unless (untie(%parmhash)) {
                         &Apache::lonnet::logthis('<font color="blue">WARNING: '.
-                            'Could not untie coursemap hash '.$fn.'.db for '.$uri.'.</font>');
+                            'Could not untie coursemap parmhash '.$fn.'.db for '.$uri.'.</font>');
                     }
-               } else {
-                   &Apache::lonnet::logthis('<font color="blue">WARNING: '.
-                       'Could not tie coursemap '.$fn.'.db for '.$uri.'.</font>');
-               }
-               flock(LOCKFILE,LOCK_UN);
-               close(LOCKFILE);
+                } else {
+                    &Apache::lonnet::logthis('<font color="blue">WARNING: '.
+                        'Could not tie coursemap '.$fn.'__parms.db for '.$uri.'.</font>');
+                }
+                unless (untie(%hash)) {
+                    &Apache::lonnet::logthis('<font color="blue">WARNING: '.
+                        'Could not untie coursemap hash '.$fn.'.db for '.$uri.'.</font>');
+                }
             } else {
-                &Apache::lonnet::logthis('<font color="blue">WARNING: '.
-                'Could not obtain lock to tie coursemap hash '.$fn.'.db for '.$uri.'.</font>');
+               &Apache::lonnet::logthis('<font color="blue">WARNING: '.
+                   'Could not tie coursemap '.$fn.'.db for '.$uri.'.</font>');
             }
-	    close(LOCKFILE);
+            flock(LOCKFILE,LOCK_UN);
+            $lock = 0;
+        } else {
+            &Apache::lonnet::logthis('<font color="blue">WARNING: '.
+            'Could not obtain lock to tie coursemap hash '.$fn.'.db for '.$uri.'.</font>');
         }
     }
+    close(LOCKFILE);
     unless (($errtext eq '') || ($env{'request.course.uri'} =~ m{^/uploaded/})) {
         &Apache::lonmsg::author_res_msg($env{'request.course.uri'},
                                         $errtext);