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 2014/10/17 21:16:10 UTC

svn commit: r1632652 - in /vcl/trunk/managementnode/lib/VCL/Module: Provisioning/VMware/VIM_SSH.pm Provisioning/VMware/vSphere_SDK.pm State.pm

Author: arkurth
Date: Fri Oct 17 19:16:09 2014
New Revision: 1632652

URL: http://svn.apache.org/r1632652
Log:
VCL-793
Updated State.pm::reservation_failed to catch a case where a 'deleted' process failed. The code was just checking for is_request_deleted, then setting the computer to available and leaving the request state intact. This caused vcld to attempt to spawn deleted processes indefinitely if there was a problem with the host.

VCL-685
Added DESTROY subroutine to vSphere_SDK.pm with an explicit call to Util::disconnect. The call is wrapped in an eval block and the die handler is overridden. Hoping to fix intermittent condition where die is called automatically when a process exits.

Modified:
    vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm
    vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm
    vcl/trunk/managementnode/lib/VCL/Module/State.pm

Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm?rev=1632652&r1=1632651&r2=1632652&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm Fri Oct 17 19:16:09 2014
@@ -168,6 +168,7 @@ sub _run_vim_cmd {
 	
 	my $timeout_seconds = shift || 60;
 	
+	my $request_state_name = $self->data->get_request_state_name();
 	my $vmhost_computer_name = $self->vmhost_os->data->get_computer_short_name();
 	
 	my $command = "$self->{vim_cmd} $vim_arguments";
@@ -242,14 +243,13 @@ sub _run_vim_cmd {
 			# Problem probably won't correct itself
 			# If request state is 'inuse', set the reservation.lastcheck value to 20 minutes before request.end
 			# This avoids 'inuse' processes from being created over and over again which will fail
-			my $request_state_name = $self->data->get_request_state_name();
-			#if ($request_state_name eq 'inuse') {
+			if ($request_state_name eq 'inuse') {
 				my $reservation_id = $self->data->get_reservation_id();
 				my $request_end_time_epoch = convert_to_epoch_seconds($self->data->get_request_end_time());
 				my $current_time_epoch = time;
 				my $reservation_lastcheck_epoch = ($request_end_time_epoch-(20*60));
 				set_reservation_lastcheck($reservation_id, $reservation_lastcheck_epoch);
-			#}
+			}
 			return;
 		}
 		else {

Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm?rev=1632652&r1=1632651&r2=1632652&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm Fri Oct 17 19:16:09 2014
@@ -4203,6 +4203,29 @@ sub is_multiextent_disabled {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 DESTROY
+
+ Parameters  : none
+ Returns     : nothing
+ Description : Calls Util::disconnect to attempt to exit gracefully.
+
+=cut
+
+sub DESTROY {
+	local $SIG{__DIE__} = sub{};
+	eval {
+		Util::disconnect();
+	};
+	if ($EVAL_ERROR) {
+		notify($ERRORS{'WARNING'}, 0, "error generated calling Util::disconnect:\n$EVAL_ERROR");
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "called Util::disconnect");
+	}
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 1;
 __END__
 

Modified: vcl/trunk/managementnode/lib/VCL/Module/State.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/State.pm?rev=1632652&r1=1632651&r2=1632652&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/State.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/State.pm Fri Oct 17 19:16:09 2014
@@ -260,7 +260,9 @@ sub reservation_failed {
 	my $computer_state_name         = $self->data->get_computer_state_name();
 	
 	# Check if the request has been deleted
-	if (is_request_deleted($request_id)) {
+	# Ignore if this process's state is deleted
+	# If a 'deleted' request fails during initialization and before the request state was changed to 'pending', vcld will try to process over and over again
+	if ($request_state_name ne 'deleted' && is_request_deleted($request_id)) {
 		notify($ERRORS{'OK'}, 0, "request has been deleted, setting computer state to available and exiting");
 		
 		# Update the computer state to available
@@ -294,6 +296,10 @@ sub reservation_failed {
 		$new_request_state_name = 'maintenance';
 		$new_computer_state_name = 'maintenance';
 	}
+	elsif ($request_state_name eq 'deleted') {
+		$new_request_state_name = 'complete';
+		$new_computer_state_name = 'failed';
+	}
 	elsif ($computer_input_state) {
 	   $new_request_state_name = 'failed';
 	   $new_computer_state_name = $computer_input_state;
@@ -627,13 +633,13 @@ sub state_exit {
 		# If parent of a cluster request, wait for child processes to exit before switching the state
 		if ($reservation_count > 1) {
 			$self->wait_for_child_reservations_to_exit();
-		}
-		
-		# Check if any reservations failed
-		if (!$request_state_name_new || $request_state_name_new ne 'failed') {
-			if ($self->does_loadstate_exist_any_reservation('failed')) {
-				notify($ERRORS{'OK'}, 0, "another reservation failed, request state will be updated to 'failed'");
-				$request_state_name_new = 'failed';
+			
+			# Check if any reservations failed
+			if (!$request_state_name_new || $request_state_name_new ne 'failed') {
+				if ($self->does_loadstate_exist_any_reservation('failed')) {
+					notify($ERRORS{'OK'}, 0, "another reservation failed, request state will be updated to 'failed'");
+					$request_state_name_new = 'failed';
+				}
 			}
 		}