Author: arkurth
Date: Fri Jan 30 17:51:14 2009
New Revision: 739350
URL: http://svn.apache.org/viewvc?rev=739350&view=rev
Log:
VCL-73
Added a sanity check to new.pm::computer_not_being_used if a neighbor process
was in the maintenance state. If it finds this, it returns 0 immediately. This
state will occur if an imaging reservation failed. The computer cannot be
reloaded until the imaging problem is fixed.
If new.pm::computer_not_being_used attempted to kill a process but the exit
status returned was not 0, it could hang if the process was actually killed.
There is a bug with Perl 5.8.0 which causes exit statuses to be reported
incorrectly. I removed the loop continuation if kill looks like it failed. This
is safer than the possibility of in infinite loop because it will only get to
that point if the reservation process being killed isn't another user's process.
Modified:
incubator/vcl/trunk/managementnode/lib/VCL/new.pm
Modified: incubator/vcl/trunk/managementnode/lib/VCL/new.pm
URL:
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/new.pm?rev=739350&r1=739349&r2=739350&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/new.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/new.pm Fri Jan 30 17:51:14 2009
@@ -764,6 +764,8 @@
# reserved
# vmhostinuse
+ notify($ERRORS{'DEBUG'}, 0, "$computer_short_name state is
$computer_state_name");
+
# Return 0 if computer state is maintenance or deleted
if ($computer_state_name =~ /^(deleted|maintenance)$/) {
notify($ERRORS{'WARNING'}, 0, "$computer_short_name is NOT
available, its state is $computer_state_name");
@@ -833,7 +835,7 @@
# Check for overlapping reservations which user is
involved or image is being created
# Don't check for state = new, it could be a future
reservation
- if ($neighbor_state_name =~ /^(reserved|inuse|image)$/)
{
+ if ($neighbor_state_name =~
/^(maintenance|reserved|inuse|image)$/) {
notify($ERRORS{'WARNING'}, 0, "detected
overlapping reservation on $computer_short_name: req=$neighbor_request_id,
res=$neighbor_reservation_id, request state=$neighbor_state_name,
laststate=$neighbor_laststate_name, computer state=$computer_state_name");
return 0;
}
@@ -900,22 +902,18 @@
}
else {
notify($ERRORS{'WARNING'}, 0,
"failed to kill competing process for reservation $neighbor_reservation_id");
- # Wait then try again
- next INUSE_LOOP;
}
} ## end if
(checkonprocess($neighbor_laststate_name...
# Either neighbor process was not found or
competing process was just killed
# Set neighbor request to complete
- if (update_request_state($neighbor_request_id,
"complete", $neighbor_laststate_name)) {
- notify($ERRORS{'OK'}, 0, "neighbor
request $neighbor_request_id state set to 'complete'");
+ if (update_request_state($neighbor_request_id,
"deleted", $neighbor_laststate_name)) {
+ notify($ERRORS{'OK'}, 0, "neighbor
request $neighbor_request_id state set to 'deleted'");
# Check other neighbor requests
next NEIGHBOR_REQUESTS;
}
else {
- notify($ERRORS{'WARNING'}, 0, "failed
to set neighbor request $neighbor_request_id state to 'complete'");
- # Wait then try again
- next INUSE_LOOP;
+ notify($ERRORS{'WARNING'}, 0, "failed
to set neighbor request $neighbor_request_id state to 'deleted'");
}
} ## end elsif ($neighbor_state_name eq "pending") [
if ($neighbor_state_name =~ /^(reserved|inuse|image)$/)