--- loncom/homework/bridgetask.pm 2005/12/21 19:10:33 1.93 +++ loncom/homework/bridgetask.pm 2006/01/21 08:27:09 1.97 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.93 2005/12/21 19:10:33 albertel Exp $ +# $Id: bridgetask.pm,v 1.97 2006/01/21 08:27:09 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -554,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; } @@ -689,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=''; @@ -897,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') { @@ -1166,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++; @@ -1175,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++; } } @@ -1305,13 +1323,20 @@ 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); &Apache::lonxml::debug("$starttime"); my $regexp="^$symb\0queue\0"; - my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp); + my $range= ($attempts < 1 ) ? '0-100' : '0-400'; + + my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp,$range); #make a pass looking for a user _not_ in my section if ($env{'request.course.sec'}) { &Apache::lonxml::debug("sce"); @@ -1332,7 +1357,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); @@ -1351,6 +1379,7 @@ sub get_from_queue { &Apache::lonnet::del($queue,["$todo\0locked"], $cdom,$cnum); &Apache::lonxml::debug("del"); + $attempts++; next; } }