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

albertel lon-capa-cvs@mail.lon-capa.org
Fri, 23 Sep 2005 21:39:11 -0000


albertel		Fri Sep 23 17:39:11 2005 EDT

  Modified files:              
    /rat	lonuserstate.pm 
  Log:
  - reverting back to deleting the DB files on init
  
  
Index: rat/lonuserstate.pm
diff -u rat/lonuserstate.pm:1.95 rat/lonuserstate.pm:1.96
--- rat/lonuserstate.pm:1.95	Fri Jul 15 08:29:07 2005
+++ rat/lonuserstate.pm	Fri Sep 23 17:39:09 2005
@@ -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.95 2005/07/15 12:29:07 www Exp $
+# $Id: lonuserstate.pm,v 1.96 2005/09/23 21:39:09 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -41,6 +41,7 @@
 use Safe::Hole;
 use Opcode;
 use Apache::lonenc;
+use Fcntl qw(:flock);
 
 # ---------------------------------------------------- Globals for this package
 
@@ -549,15 +550,21 @@
 	return 'No course data available.';
     }
     @cond=('true:normal');
-    #unlink($fn.'.db');
-    #unlink($fn.'_symb.db');
-    unlink($fn.'.state');
-    unlink($fn.'parms.db');
+
+    open(LOCKFILE,">$fn.db.lock");
+    my $lock=0;
+    if (flock(LOCKFILE,LOCK_EX|LOCK_NB)) {
+	$lock=1;
+	unlink($fn.'.db');
+	unlink($fn.'_symb.db');
+	unlink($fn.'.state');
+	unlink($fn.'parms.db');
+    }
     undef %randompick;
     undef %hiddenurl;
     undef %encurl;
     $retfurl='';
-    if ((tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT(),0640)) &&
+    if ($lock && (tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT(),0640)) &&
 	(tie(%parmhash,'GDBM_File',$fn.'_parms.db',&GDBM_WRCREAT(),0640))) {
 	%hash=();
 	%parmhash=();
@@ -605,13 +612,19 @@
 		&Apache::lonnet::logthis("<font color=blue>WARNING: ".
 					 "Could not write statemap $fn for $uri.</font>"); 
 	    }
-	}  
+	}
+	flock(LOCKFILE,LOCK_UN);
+	close(LOCKFILE);
     } else {
 	# 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 
 	# them on to navmaps, if we fail, throw up the Could not init 
 	# course screen
+	if ($lock) {
+	    # Got the lock but not the DB files
+	    flock(LOCKFILE,LOCK_UN);
+	}
 	untie(%hash);
 	untie(%parmhash);
 	&Apache::lonnet::logthis("<font color=blue>WARNING: ".
@@ -620,7 +633,8 @@
 	while($i<90) {
 	    $i++;
 	    sleep(1);
-	    if ((tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640))) {
+	    if (flock(LOCKFILE,LOCK_EX|LOCK_NB) &&
+		(tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640))) {
 		if (tie(%parmhash,'GDBM_File',$fn.'_parms.db',&GDBM_READER(),0640)) {
 		    $retfurl='/adm/navmaps';
 		    &Apache::lonnet::appenv("request.course.id"  => $short,
@@ -634,6 +648,8 @@
 	    untie(%hash);
 	    untie(%parmhash);
 	}
+	flock(LOCKFILE,LOCK_UN);
+	close(LOCKFILE);
     }
     &Apache::lonmsg::author_res_msg($env{'request.course.uri'},$errtext);
 # ------------------------------------------------- Check for critical messages