--- loncom/homework/bridgetask.pm 2005/12/21 19:07:53 1.92
+++ loncom/homework/bridgetask.pm 2006/01/21 08:03:27 1.96
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
-# $Id: bridgetask.pm,v 1.92 2005/12/21 19:07:53 albertel Exp $
+# $Id: bridgetask.pm,v 1.96 2006/01/21 08:03:27 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -80,19 +80,25 @@ sub proctor_check_auth {
}
}
if ($authenticated && $type eq 'Task') {
+ # increment version
my $version=
$Apache::lonhomework::history{'resource.0.version'};
$version++;
- $Apache::lonhomework::results{'resource.0.version'}=$version;
- $Apache::lonhomework::results{"resource.$version.0.checkedin"}=
- $user.'@'.$domain;
- $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=
- $slot_name;
+
+ #clean out all current results
foreach my $key (keys(%Apache::lonhomework::history)) {
if ($key=~/^resource\.0\./) {
$Apache::lonhomework::results{$key}='';
}
}
+
+ #setup new version and who did it
+ $Apache::lonhomework::results{'resource.0.version'}=$version;
+ $Apache::lonhomework::results{"resource.$version.0.checkedin"}=
+ $user.'@'.$domain;
+ $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=
+ $slot_name;
+
return 1;
} elsif ($authenticated && $type eq 'problem') {
&Apache::lonxml::debug("authed $slot_name");
@@ -548,6 +554,8 @@ DONESCREEN
$result.=&show_queue($env{'form.queue'},1);
} elsif ($status_code eq 'select_user') {
$result.=&select_user();
+ } elsif ($status_code eq 'unable') {
+ $result.=''.&mt("Unable to aqcuire a user to grade.").''.$back;
} else {
$result.=''.&mt("No user to be graded.").''.$back;
}
@@ -683,6 +691,17 @@ sub get_key_todo {
}
return (undef,undef)
}
+
+sub minimize_storage {
+ foreach my $key (keys(%Apache::lonhomework::results)) {
+ if ($key =~ /regrader$/) { next; }
+ if ($Apache::lonhomework::results{$key} eq
+ $Apache::lonhomework::history{$key}) {
+ delete($Apache::lonhomework::results{$key});
+ }
+ }
+}
+
sub end_Task {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $result='';
@@ -891,6 +910,7 @@ DONEBUTTON
$Apache::lonhomework::results{"resource.0.solved"}=
$Apache::lonhomework::results{"resource.$version.0.solved"};
}
+ &minimize_storage();
&Apache::structuretags::finalize_storage();
}
} elsif ($target eq 'webgrade') {
@@ -1160,6 +1180,7 @@ sub get_queue_counts {
return (0,0,0);
}
my ($entries,$ready_to_grade,$locks)=(0,0,0);
+ my %slot_cache;
foreach my $key (sort(keys(%queue))) {
if ($key=~/locked$/) {
$locks++;
@@ -1169,8 +1190,11 @@ sub get_queue_counts {
my ($symb,$uname,$udom) = &decode_queue_key($key);
$entries++;
my $slot=$queue{$key}->[0];
- my %slot_data=&Apache::lonnet::get_slot($slot);
- if (time > $slot_data{'endtime'}) {
+ if (!exists($slot_cache{$slot})) {
+ my %slot_data=&Apache::lonnet::get_slot($slot);
+ $slot_cache{$slot} = \%slot_data;
+ }
+ if (time > $slot_cache{$slot}{'endtime'}) {
$ready_to_grade++;
}
}
@@ -1299,7 +1323,12 @@ sub get_from_queue {
my $todo=&find_mid_grade($queue,$symb,$cdom,$cnum);
&Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo)));
if ($todo) { return $todo; }
+ my $attempts=0;
while (1) {
+ if ($attempts > 2) {
+ # tried twice to get a queue entry, giving up
+ return (undef,'unable');
+ }
my $starttime=time;
&Apache::lonnet::cput($queue,{"$symb\0timestamp"=>$starttime},
$cdom,$cnum);
@@ -1326,7 +1355,10 @@ sub get_from_queue {
&Apache::lonxml::debug("got $todo");
# otherwise found someone so lets try to lock them
# unless someone else already picked them
- if (!&lock_key($queue,$todo)) { next; }
+ if (!&lock_key($queue,$todo)) {
+ $attempts++;
+ next;
+ }
my (undef,$endtime)=
&Apache::lonnet::get($queue,["$symb\0timestamp"],
$cdom,$cnum);
@@ -1345,6 +1377,7 @@ sub get_from_queue {
&Apache::lonnet::del($queue,["$todo\0locked"],
$cdom,$cnum);
&Apache::lonxml::debug("del");
+ $attempts++;
next;
}
}