You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by ar...@apache.org on 2009/01/13 16:53:33 UTC
svn commit: r734163 - in /incubator/vcl/trunk/managementnode/lib/VCL:
image.pm inuse.pm utils.pm
Author: arkurth
Date: Tue Jan 13 07:53:15 2009
New Revision: 734163
URL: http://svn.apache.org/viewvc?rev=734163&view=rev
Log:
VCL-48
Fixed serious bug which could cause the computer on which a failed imaging reservation occurred to be reloaded. Added additional checks to inuse.pm to make sure a normal reservation hasn't been changed to imaging. If imaging has begun, the inuse process exits immediately. Created inuse.pm::_check_imaging_request to avoid redundant code.
Extended utils.pm::is_request_imaging to also check if the forimaging flag is set.
Fixed cosmetic problem in image.pm that only affects log file messages. If the OS capture_prepare or other modularized capture subroutines failed, it was displaying a log message saying it was attempting the next stage even though it wasn't.
Modified:
incubator/vcl/trunk/managementnode/lib/VCL/image.pm
incubator/vcl/trunk/managementnode/lib/VCL/inuse.pm
incubator/vcl/trunk/managementnode/lib/VCL/utils.pm
Modified: incubator/vcl/trunk/managementnode/lib/VCL/image.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/image.pm?rev=734163&r1=734162&r2=734163&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/image.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/image.pm Tue Jan 13 07:53:15 2009
@@ -158,26 +158,31 @@
$create_image_result = 1;
notify($ERRORS{'OK'}, 0, "OS modularization supported, beginning OS module capture prepare");
- if (!($create_image_result = $self->os->capture_prepare())) {
+ if (!$self->os->capture_prepare()) {
notify($ERRORS{'WARNING'}, 0, "OS module capture prepare failed");
+ $self->image_creation_failed();
}
notify($ERRORS{'OK'}, 0, "beginning provisioning module capture prepare");
- if ($create_image_result && !($create_image_result = $self->provisioner->capture_prepare())) {
+ if (!$self->provisioner->capture_prepare()) {
notify($ERRORS{'WARNING'}, 0, "provisioning module capture prepare failed");
+ $self->image_creation_failed();
}
-
+
notify($ERRORS{'OK'}, 0, "beginning OS module capture start");
- if ($create_image_result && !($create_image_result = $self->os->capture_start())) {
+ if (!$self->os->capture_start()) {
notify($ERRORS{'WARNING'}, 0, "OS module capture start failed");
+ $self->image_creation_failed();
}
notify($ERRORS{'OK'}, 0, "beginning provisioning module capture monitor");
- if ($create_image_result && !($create_image_result = $self->provisioner->capture_monitor())) {
+ if (!$self->provisioner->capture_monitor()) {
notify($ERRORS{'WARNING'}, 0, "provisioning module capture monitor failed");
+ $self->image_creation_failed();
}
} ## end if ($computer_type eq "blade" && $self->os)
+
elsif ($computer_type eq "blade") {
$create_image_result = $self->provisioner->capture_prepare();
Modified: incubator/vcl/trunk/managementnode/lib/VCL/inuse.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/inuse.pm?rev=734163&r1=734162&r2=734163&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/inuse.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/inuse.pm Tue Jan 13 07:53:15 2009
@@ -129,6 +129,10 @@
# Set the user connection timeout limit in minutes
my $connect_timeout_limit = 15;
+
+ # Check if request imaging status has changed
+ # Check if this is an imaging request, causes process to exit if state or laststate = image
+ $request_forimaging = $self->_check_imaging_request();
# Remove rows from computerloadlog for this reservation
if (delete_computerloadlog_reservation($reservation_id)) {
@@ -157,7 +161,7 @@
notify($ERRORS{'OK'}, 0, "confirmed firewall scope has been updated");
}
}
-
+
# Check the imagemeta checkuser flag, request forimaging flag, and if cluster request
if (!$imagemeta_checkuser || $request_forimaging || ($reservation_count > 1)) {
# Either imagemeta checkuser flag = 0, forimaging = 1, or cluster request
@@ -202,14 +206,9 @@
exit;
}
- # If forimage flag is set - check for state change to image creation mode and exit quietly
- if ($request_forimaging) {
- notify($ERRORS{'DEBUG'}, 0, "request has forimaging flag enabled, checking for image state");
- if (is_request_imaging($request_id)) {
- notify($ERRORS{'OK'}, 0, "request is now in image creation mode, quietly exiting");
- exit;
- }
- }
+ # Check if request imaging status has changed
+ # Check if this is an imaging request, causes process to exit if state or laststate = image
+ $request_forimaging = $self->_check_imaging_request();
# Put this request back into the inuse state
if ($is_parent_reservation && update_request_state($request_id, "inuse", "inuse")) {
@@ -273,9 +272,13 @@
#$check_connection = 'timeout';
# Proceed based on status of check_connection
- if ($check_connection eq "connected") {
+ if ($check_connection eq "connected" || $check_connection eq "conn_wrong_ip") {
notify($ERRORS{'OK'}, 0, "user connected");
+ # Check if request imaging status has changed
+ # Check if this is an imaging request, causes process to exit if state or laststate = image
+ $request_forimaging = $self->_check_imaging_request();
+
# Put this request back into the inuse state
if (update_request_state($request_id, "inuse", "inuse")) {
notify($ERRORS{'OK'}, 0, "request state set back to inuse");
@@ -296,33 +299,13 @@
exit;
} # Close check_connection is connected
- elsif ($check_connection eq "conn_wrong_ip") {
- notify($ERRORS{'OK'}, 0, "polling, user connected but wrong remote IP is used");
-
- # Update the lastcheck time for this reservation
- if (update_reservation_lastcheck($reservation_id)) {
- notify($ERRORS{'OK'}, 0, "updated lastcheck time for this reservation to now");
- }
- else {
- notify($ERRORS{'WARNING'}, 0, "unable to update lastcheck time for this reservation to now");
- }
-
- # Put this request back into the inuse state
- if (update_request_state($request_id, "inuse", "inuse")) {
- notify($ERRORS{'OK'}, 0, "request state set back to inuse");
- }
- else {
- notify($ERRORS{'WARNING'}, 0, "unable to set request state back to inuse");
- }
-
- notify($ERRORS{'OK'}, 0, "exiting");
- exit;
- } ## end elsif ($check_connection eq "conn_wrong_ip") [ if ($check_connection eq "connected")
-
-
- elsif ($check_connection eq "timeout") {
+ elsif (!$request_forimaging && $check_connection eq "timeout") {
notify($ERRORS{'OK'}, 0, "user did not reconnect within $connect_timeout_limit minute time limit");
+ # Check if request imaging status has changed
+ # Check if this is an imaging request, causes process to exit if state or laststate = image
+ $request_forimaging = $self->_check_imaging_request();
+
notify($ERRORS{'OK'}, 0, "notifying user that request timed out");
$self->_notify_user_timeout();
@@ -378,6 +361,10 @@
else {
notify($ERRORS{'CRITICAL'}, 0, "unexpected return value from check_connection: $check_connection, treating request as connected");
+ # Check if request imaging status has changed
+ # Check if this is an imaging request, causes process to exit if state or laststate = image
+ $request_forimaging = $self->_check_imaging_request();
+
# Put this request back into the inuse state
if (update_request_state($request_id, "inuse", "inuse")) {
notify($ERRORS{'OK'}, 0, "request state set back to inuse");
@@ -421,20 +408,14 @@
# Sleep one minute and decrement disconnect time by a minute
sleep 60;
$disconnect_time--;
-
+
# Check if the user deleted the request
if (is_request_deleted($request_id)) {
# User deleted request, exit queitly
notify($ERRORS{'OK'}, 0, "user has deleted the request, quietly exiting");
exit;
}
-
- # check for state change to image creation mode and exit quietly
- if (is_request_imaging($request_id)) {
- notify($ERRORS{'OK'}, 0, "request is now in image creation mode, quietly exiting");
- exit;
- }
-
+
# Perform some actions at 5 minutes until end of request
if ($disconnect_time == 5) {
# Check for connection
@@ -460,6 +441,10 @@
# Convert the current and new end times to epoch seconds
my $new_request_end_epoch = convert_to_epoch_seconds($new_request_end);
my $request_end_epoch = convert_to_epoch_seconds($request_end);
+
+ # Check if request imaging status has changed
+ # Check if this is an imaging request, causes process to exit if state or laststate = image
+ $request_forimaging = $self->_check_imaging_request();
# Check if request end is later than the original (user extended time)
if ($new_request_end_epoch > $request_end_epoch) {
@@ -482,16 +467,8 @@
} # Close while disconnect time is not 0
- # If forimage flag is set - check for state change to image creation mode and exit quietly
- # One last check - if forimaging lets sleep 1 min and check the state
- if ($request_forimaging) {
- sleep 60;
- notify($ERRORS{'OK'}, 0, "request has forimaging flag enabled checking for image state");
- if (is_request_imaging($request_id)) {
- notify($ERRORS{'OK'}, 0, "request is now in image creation mode, quietly exiting");
- exit;
- }
- }
+ # Check if this is an imaging request, causes process to exit if state or laststate = image
+ $request_forimaging = $self->_check_imaging_request();
# Insert an entry into the load log
insertloadlog($reservation_id, $computer_id, "timeout", "endtime reached moving to timeout");
@@ -560,6 +537,7 @@
notify($ERRORS{'OK'}, 0, "exiting");
exit;
} ## end sub process
+
#/////////////////////////////////////////////////////////////////////////////
=head2 _notify_user_endtime
@@ -842,6 +820,60 @@
return 1;
} ## end sub _notify_user_request_ended
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 _check_imaging_request
+
+ Parameters :
+ Returns : 1 if not an imaging request, undefined if an error occurred, exits otherwise
+ Description : The inuse process exits if the request state or laststate are set to image, or if the forimaging flag has been set.
+
+=cut
+
+sub _check_imaging_request {
+ my $self = shift;
+ my $request_id = $self->data->get_request_id();
+ my $reservation_id = $self->data->get_reservation_id();
+ my $request_forimaging = $self->data->get_request_forimaging();
+
+ notify($ERRORS{'DEBUG'}, 0, "checking if request is imaging or if forimaging flag has changed");
+
+ # Call is_request_imaging
+ # -returns 'image' if request state or laststate = image
+ # -returns 'forimaging' if request state and laststate != image, and forimaging = 1
+ # -returns 0 if request state and laststate != image, and forimaging = 0
+ # -returns undefined if an error occurred
+ my $imaging_result = is_request_imaging($request_id);
+
+ if ($imaging_result eq 'image') {
+ notify($ERRORS{'OK'}, 0, "image creation process has begun, exiting");
+ exit;
+ }
+ elsif ($imaging_result eq 'forimaging') {
+ if ($request_forimaging != 1) {
+ notify($ERRORS{'OK'}, 0, "request forimaging flag has changed to 1, updating data structure");
+ $self->data->set_request_forimaging(1);
+ }
+ return 1;
+ }
+ elsif ($imaging_result == 0) {
+ if ($request_forimaging != 0) {
+ notify($ERRORS{'OK'}, 0, "request forimaging flag has changed to 0, updating data structure");
+ $self->data->set_request_forimaging(0);
+ }
+ return 0;
+ }
+ elsif (!defined($imaging_result)) {
+ notify($ERRORS{'WARNING'}, 0, "failed to retrieve request imaging values from database");
+ return;
+ }
+ else {
+ notify($ERRORS{'WARNING'}, 0, "unexpected result returned from is_request_imaging: $imaging_result");
+ return;
+ }
+
+}
#/////////////////////////////////////////////////////////////////////////////
1;
Modified: incubator/vcl/trunk/managementnode/lib/VCL/utils.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=734163&r1=734162&r2=734163&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/utils.pm Tue Jan 13 07:53:15 2009
@@ -2482,26 +2482,28 @@
=head2 is_request_imaging
Parameters : $request_id
- Returns : return 1 if request state or laststate is set to image or if request does not exist
- return 0 if request exists and neither request state nor laststate is set to image success 0 failure
- Description : checks if request is in imaging mode
+ Returns : return 'image' if request state or laststate is set to image
+ return 'forimaging' if forimaging is set to 1, and neither request state nor laststate is set to image
+ return 0 if forimaging is set to 0, and neither request state nor laststate is set to image
+ return undefined if an error occurred
+ Description : checks if request is in imaging mode and if forimaging has been set
=cut
sub is_request_imaging {
my ($request_id) = @_;
- my ($package, $filename, $line, $sub) = caller(0);
-
+
# Check the passed parameter
if (!(defined($request_id))) {
notify($ERRORS{'WARNING'}, 0, "request ID was not specified");
- return 0;
+ return;
}
# Create the select statement
my $select_statement = "
SELECT
+ request.forimaging AS forimaging,
request.stateid AS currentstate_id,
request.laststateid AS laststate_id,
currentstate.name AS currentstate_name,
@@ -2519,24 +2521,29 @@
my @selected_rows = database_select($select_statement);
# Check to make sure 1 row was returned
- if (scalar @selected_rows == 0) {
- return 1;
- }
- elsif (scalar @selected_rows > 1) {
- notify($ERRORS{'WARNING'}, 0, "" . scalar @selected_rows . " rows were returned from database select");
- return 0;
+ if (scalar @selected_rows != 1) {
+ notify($ERRORS{'WARNING'}, 0, scalar @selected_rows . " rows were returned from database select");
+ return;
}
+ my $forimaging = $selected_rows[0]{forimaging};
my $state_name = $selected_rows[0]{currentstate_name};
my $laststate_name = $selected_rows[0]{laststate_name};
- notify($ERRORS{'DEBUG'}, 0, "is_request_imaging currentstate= $state_name laststate= $laststate_name");
+ notify($ERRORS{'DEBUG'}, 0, "forimaging=$forimaging, currentstate=$state_name, laststate=$laststate_name");
+ # If request state or laststate has been changed to image, return 1
+ # If forimaging is set, return 0
+ # If neither state is image and forimaging is not set, return undefined
if ($state_name eq 'image' || $laststate_name eq 'image') {
- return 1;
+ return 'image';
+ }
+ elsif ($forimaging) {
+ return 'forimaging';
+ }
+ else {
+ return 0;
}
-
- return 0;
} ## end sub is_request_imaging
#/////////////////////////////////////////////////////////////////////////////