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
 
 #/////////////////////////////////////////////////////////////////////////////