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/04/08 06:11:28 UTC

svn commit: r762851 - in /incubator/vcl/trunk/managementnode/lib/VCL: DataStructure.pm Module/State.pm

Author: arkurth
Date: Tue Apr  7 17:01:07 2009
New Revision: 762851

URL: http://svn.apache.org/viewvc?rev=762851&view=rev
Log:
Added new subs to State.pm which will replace existing subs in utils.pm. The new subs use the DataStructure object. They are:
-update_request_state_new
-update_computer_state_new
-insert_computerloadlog
-update_log_ending_new

Fixed some notify() messages in State.pm. There were several "OK" messages which should be "DEBUG", and a few warning messages weren't set to "WARNING".

Removed DataStructure.pm::update_log_ending_DataStructure() which was added yesterday. It now resides in State.pm because only state objects (new, image...) should be able to access it.

Modified:
    incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm
    incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm

Modified: incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm?rev=762851&r1=762850&r2=762851&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm Tue Apr  7 17:01:07 2009
@@ -141,7 +141,6 @@
 $SUBROUTINE_MAPPINGS{request_state_name}     = '$self->request_data->{state}{name}';
 $SUBROUTINE_MAPPINGS{request_laststate_name} = '$self->request_data->{laststate}{name}';
 
-$SUBROUTINE_MAPPINGS{log_id} = '$self->request_data->{log}{id}';
 $SUBROUTINE_MAPPINGS{log_userid} = '$self->request_data->{log}{userid}';
 $SUBROUTINE_MAPPINGS{log_nowfuture} = '$self->request_data->{log}{nowfuture}';
 $SUBROUTINE_MAPPINGS{log_start} = '$self->request_data->{log}{start}';
@@ -1378,178 +1377,6 @@
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 update_log_ending_DataStructure
-
- Parameters  : string containing the log ending value
- Returns     : true if successful, false if failed
- Description : Updates the log.ending value in the database for the log ID
-               set for this reservation. Returns false if log ID is not
-					set. A string argument must be passed containing the new
-					log.ending value.
-					
-=cut
-
-sub update_log_ending_DataStructure {
-	my $self = shift;
-	my $request_log_ending = shift;
-	
-	# Check if subroutine was called as an object method
-	if (!ref($self) =~ /DataStructure/) {
-		notify($ERRORS{'WARNING'}, 0, "subroutine must be called as an object method");
-		return;
-	}
-	
-	# Make sure log ending value was passed
-	if (!$request_log_ending) {
-		notify($ERRORS{'WARNING'}, 0, "log ending value argument was not passed");
-		return;
-	}
-	
-	# Get the log id
-	my $request_log_id = $self->get_request_log_id();
-	if (!$request_log_id) {
-		notify($ERRORS{'WARNING'}, 0, "request log id could not be retrieved");
-		return;
-	}
-	
-	# Get the request state name
-	my $request_state_name = $self->get_request_state_name();
-	if (!$request_state_name) {
-		notify($ERRORS{'WARNING'}, 0, "request state name could not be retrieved");
-		return;
-	}
-	
-	# Get the image id
-	my $image_id = $self->get_image_id();
-	if (!$image_id) {
-		notify($ERRORS{'WARNING'}, 0, "image id could not be retrieved");
-		return;
-	}
-	
-	# Get the image name
-	my $image_name = $self->get_image_name();
-	if (!$image_name) {
-		notify($ERRORS{'WARNING'}, 0, "image name could not be retrieved");
-		return;
-	}
-	
-	# Get the imagerevision production flag
-	my $imagerevision_production = $self->get_imagerevision_production();
-	if ($imagerevision_production !~ /^(0|1)$/) {
-		notify($ERRORS{'WARNING'}, 0, "imagerevision production flag could not be retrieved");
-		return;
-	}
-	
-	# Construct a select statement to retrieve the resource group names this image belongs to
-	my $select_image_groups_statement = "
-	SELECT DISTINCT
-	resourcegroup.name
-	FROM
-	image,
-	resource,
-	resourcetype,
-	resourcegroup,
-	resourcegroupmembers
-	WHERE
-	image.id = $image_id AND
-	resource.subid = image.id AND resource.resourcetypeid = 13 AND
-	resourcegroupmembers.resourceid = resource.id AND
-	resourcegroup.id = resourcegroupmembers.resourcegroupid
-	";
-	
-	# Call database_select() to execute the select statement
-	my @image_group_rows = VCL::utils::database_select($select_image_groups_statement);
-	if (!scalar @image_group_rows == 1) {
-		notify($ERRORS{'WARNING'}, 0, "unable to retrieve image group names for image $image_name");
-		return;
-	}
-	
-	# Assemble an array from the select return array
-	my @image_group_names;
-	for my $image_group_row (@image_group_rows) {
-		my $image_group_name = $image_group_row->{name};
-		push @image_group_names, $image_group_name;
-	}
-	notify($ERRORS{'DEBUG'}, 0, "retrieved groups image $image_name belongs to:\n" . join("\n", @image_group_names));
-	
-	
-	# Make sure the requested log ending makes sense
-	
-	# Don't set ending to 'failed' if image only belongs to newimages-* group
-	if ($request_log_ending eq 'failed' && scalar @image_group_names == 1 && $image_group_names[0] =~ /^newimages-.*/i) {
-		notify($ERRORS{'WARNING'}, 0, "log ending should not be set to '$request_log_ending' because image only belongs to $image_group_names[0] group, changing to 'failedtest'");
-		$request_log_ending = 'failedtest';
-	}
-	
-	# Don't set ending to 'failed' if not a state the end user sees
-	if ($request_log_ending eq 'failed' && $request_state_name =~ /^(reload|to.*|makeproduction|.*hpc.*|image)$/) {
-		notify($ERRORS{'WARNING'}, 0, "log ending should not be set to '$request_log_ending' because request state is $request_state_name, changing to 'failedtest'");
-		$request_log_ending = 'failedtest';
-	}
-	
-	# Don't set ending to 'failed' if imagerevision.production = 0
-	if ($request_log_ending eq 'failed' && !$imagerevision_production) {
-		notify($ERRORS{'WARNING'}, 0, "log ending should not be set to '$request_log_ending' because imagerevision.production = 0, changing to 'failedtest'");
-		$request_log_ending = 'failedtest';
-	}
-	
-	
-	# Construct the update statement 
-	my $sql_update_statement = "
-	UPDATE
-	log
-	SET
-	log.ending = \'$request_log_ending\',
-	log.finalend = NOW()
-	WHERE
-	log.id = $request_log_id
-	";
-	
-	# Execute the update statement
-	if (database_execute($sql_update_statement)) {
-		notify($ERRORS{'OK'}, 0, "executed update statement to set log ending to $request_log_ending for log id: $request_log_id");
-	}
-	else {
-		notify($ERRORS{'WARNING'}, 0, "failed to execute update statement to set log ending to $request_log_ending for log id: $request_log_id");
-		return;
-	}
-	
-	# Check the actual ending value in the database, SQL update returns 1 even if 0 rows were affected
-	# Construct a select statement 
-	my $sql_select_statement = "
-	SELECT
-	log.ending,
-	log.finalend
-	FROM
-	log
-	WHERE
-	log.id = $request_log_id
-	";
-	
-	# Call database_select() to execute the select statement and make sure 1 row was returned
-	my @select_rows = VCL::utils::database_select($sql_select_statement);
-	if (!scalar @select_rows == 1) {
-		notify($ERRORS{'WARNING'}, 0, "unable to verify log ending value, select statement returned " . scalar @select_rows . " rows:\n" . join("\n", $sql_select_statement));
-		return;
-	}
-	
-	# $select_rows[0] is a hash reference, the keys are the column names
-	my $log_ending = $select_rows[0]->{ending};
-	
-	# Compare the ending value in the database to the argument
-	if ($log_ending && $log_ending eq $request_log_ending) {
-		notify($ERRORS{'DEBUG'}, 0, "verified log ending was set to '$request_log_ending' for log id: $request_log_id");
-	}
-	else {
-		notify($ERRORS{'WARNING'}, 0, "log ending in database ('$log_ending') does not match requested value ('$request_log_ending') for log id: $request_log_id");
-		return;
-	}
-
-	return 1;
-}
-
-#/////////////////////////////////////////////////////////////////////////////
-
 1;
 __END__
 

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm?rev=762851&r1=762850&r2=762851&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm Tue Apr  7 17:01:07 2009
@@ -339,6 +339,455 @@
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 update_request_state_new
+
+ Parameters  : 
+ Returns     : 1 if successful
+               0 if the state was not updated because the state is already maintenance
+					undefined if an error occurred
+ Description : 
+
+=cut
+
+sub update_request_state_new {
+	my $self = shift;
+	if (ref($self) !~ /VCL::/) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was NOT called as a class method, process exiting");
+		exit;
+	}
+	
+	# Get and check the argument
+	my $request_state_name_argument = shift;
+	if (!$request_state_name_argument) {
+		notify($ERRORS{'CRITICAL'}, 0, "new request state name argument was not passed");
+		return;
+	}
+	
+	# Get the necessary data from the DataStructure object
+	my $request_id = $self->data->get_request_id();
+	
+	# Retrieve the current states directly from the database
+	my $select_state_names_statement = "
+	SELECT
+	state.name AS state_name,
+	laststate.name AS laststate_name
+	FROM
+	request,
+	state state,
+	state laststate
+	WHERE
+	request.id = $request_id
+	AND state.id = request.stateid
+	AND laststate.id = request.laststateid
+	";
+	
+	# Execute the select statement
+	my @selected_rows = database_select($select_state_names_statement);
+	
+	# Check if row was returned
+	if ((scalar @selected_rows) == 0) {
+		notify($ERRORS{'WARNING'}, 0, "0 rows returned from request state select statement, request was probably deleted, returning 0");
+		return 0;
+	}
+	
+	# Get the state names from the row
+	my $request_state_name_old = $selected_rows[0]{state_name};
+	my $request_laststate_name_old = $selected_rows[0]{laststate_name};
+	
+	# Check if request state is maintenance
+	if ($request_state_name_old =~ /^(maintenance)$/ || ($request_state_name_old eq 'pending' && $request_laststate_name_old =~ /^(maintenance)$/)) {
+		notify($ERRORS{'WARNING'}, 0, "request state not updated because it is already set to $request_state_name_old/$request_laststate_name_old, returning 0");
+		return 0;
+	}
+	
+	# Figure out the new states based on what was requested and the current values in the database
+	my $request_state_name_new;
+	my $request_laststate_name_new;
+	
+	# If request state name argument is 'pending':
+	#   state --> 'pending'
+	#   laststate --> previous state
+	# If current state is already 'pending', leave states alone
+	# Request laststate should never be set to 'pending' (that's useless data)
+	if ($request_state_name_argument eq 'pending') {
+		if ($request_state_name_old eq 'pending') {
+			notify($ERRORS{'WARNING'}, 0, "request state not updated to $request_state_name_argument, it is already set to $request_state_name_old/$request_laststate_name_old, returning 1");
+			return 1;
+		}
+		else {
+			$request_state_name_new = $request_state_name_argument;
+			$request_laststate_name_new = $request_state_name_old;
+		}
+	}
+	else {
+		if ($request_state_name_old eq 'pending') {
+			# Request is currently: pending/yyy
+			# Update to:            argument/yyy
+			$request_state_name_new = $request_state_name_argument;
+			$request_laststate_name_new = $request_laststate_name_old;
+		}
+		else {
+			# Request is currently: xxx/yyy
+			# Update to:            argument/xxx
+			$request_state_name_new = $request_state_name_argument;
+			$request_laststate_name_new = $request_laststate_name_old;
+		}
+	}
+	
+
+	# Construct the SQL update statement
+	my $update_statement = "
+	UPDATE
+	request,
+	state state,
+	state laststate
+	SET
+	request.stateid = state.id,
+	request.laststateid = laststate.id
+	WHERE
+	state.name = \'$request_state_name_new\'
+	AND laststate.name = \'$request_laststate_name_new\'
+	AND request.id = $request_id
+	";
+	
+	# Call the database execute subroutine
+	if (database_execute($update_statement)) {
+		notify($ERRORS{'OK'}, 0, "database request state updated: $request_state_name_old/$request_laststate_name_old --> $request_state_name_new/$request_laststate_name_new");
+		$self->insert_computerloadlog("info", "request state updated: $request_state_name_old/$request_laststate_name_old --> $request_state_name_new/$request_laststate_name_new");
+		
+		# Update the DataStructure object
+		# Never update the request state or laststate in the DataStructure object to 'pending'
+		if ($request_state_name_new eq 'pending') {
+			# If the new request state is 'pending', update it to what was previously in the database
+			$self->data->set_request_state_name($request_state_name_old);
+			$self->data->set_request_laststate_name($request_laststate_name_old);
+		}
+		else {
+			# If the new request state isn't 'pending', update it to what was just set in the database
+			$self->data->set_request_state_name($request_state_name_new);
+			$self->data->set_request_laststate_name($request_laststate_name_new);
+		}
+		notify($ERRORS{'DEBUG'}, 0, "DataStructure object request state updated: " . $self->data->get_request_state_name() . "/" . $self->data->get_request_laststate_name());
+	}
+	else {
+		notify($ERRORS{'WARNING'}, 0, "failed to update request state: $request_state_name_old/$request_laststate_name_old --> $request_state_name_new/$request_laststate_name_new");
+		$self->insert_computerloadlog("info", "failed to update request state: $request_state_name_old/$request_laststate_name_old --> $request_state_name_new/$request_laststate_name_new");
+		return;
+	}
+	
+	return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 update_computer_state_new
+
+ Parameters  : 
+ Returns     : 
+ Description : 
+
+=cut
+
+sub update_computer_state_new {
+	my $self = shift;
+	if (ref($self) !~ /VCL::/) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was NOT called as a class method, process exiting");
+		exit;
+	}
+	
+	# Get and check the argument
+	my $computer_state_name_argument = shift;
+	if (!$computer_state_name_argument) {
+		notify($ERRORS{'CRITICAL'}, 0, "new computer state name argument was not passed");
+		return;
+	}
+	
+	# Get the necessary data from the DataStructure object
+	my $computer_id = $self->data->get_computer_id();
+	my $computer_state_name_old = $self->data->get_computer_state_name();
+	
+	# Construct the SQL update statement
+	my $update_statement = "
+	UPDATE
+	computer,
+	state
+	SET
+	computer.stateid = state.id
+	WHERE
+	state.name = \'$computer_state_name_argument\'
+	AND computer.id = $computer_id
+	";
+
+	# Call the database execute subroutine
+	if (database_execute($update_statement)) {
+		notify($ERRORS{'OK'}, 0, "computer state updated: $computer_state_name_old --> $computer_state_name_argument");
+		$self->insert_computerloadlog("info", "computer state updated: $computer_state_name_old --> $computer_state_name_argument");
+		$self->data->set_computer_state_name($computer_state_name_argument);
+	}
+	else {
+		notify($ERRORS{'WARNING'}, 0, "failed to update computer state: $computer_state_name_old --> $computer_state_name_argument");
+		$self->insert_computerloadlog("info", "failed to update computer state: $computer_state_name_old --> $computer_state_name_argument");
+		return;
+	}
+	
+	return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 insert_computerloadlog
+
+ Parameters  : 
+ Returns     : 
+ Description : 
+
+=cut
+
+sub insert_computerloadlog {
+	my $self = shift;
+	if (ref($self) !~ /VCL::/) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was NOT called as a class method, process exiting");
+		exit;
+	}
+	
+	# Get and check the arguments
+	my $loadstate_name = shift;
+	my $additional_info = shift;
+	if (!$loadstate_name || !$additional_info) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was not called with necessary arguments");
+		return;
+	}
+	
+	# Escape any single quotes in the additional info message
+	$additional_info =~ s/\'/\\\'/g;
+	
+	# Get the reservation id
+	my $reservation_id = $self->data->get_reservation_id();
+	if (!$reservation_id) {
+		notify($ERRORS{'WARNING'}, 0, "reservation id could not be retrieved");
+		return;
+	}
+	
+	# Get the computer id
+	my $computer_id = $self->data->get_computer_id();
+	if (!$computer_id) {
+		notify($ERRORS{'WARNING'}, 0, "computer id could not be retrieved");
+		return;
+	}
+	
+
+	# Check to make sure the passed loadstatename exists in the computerloadstate table
+	my $select_statement = "
+	SELECT DISTINCT
+	computerloadstate.id
+	FROM
+	computerloadstate
+	WHERE
+	computerloadstate.loadstatename = '$loadstate_name'
+	";
+
+	my $loadstate_id;
+	my @selected_rows = database_select($select_statement);
+	
+	# Check if loadstate name was found
+	if ((scalar @selected_rows) == 0) {
+		notify($ERRORS{'CRITICAL'}, 0, "computerloadstate name does not exist: $loadstate_name, using NULL");
+		$loadstate_id   = 'NULL';
+		$loadstate_name = 'NULL';
+	}
+	else {
+		$loadstate_id = $selected_rows[0]{id};
+	}
+
+	# Assemble the SQL statement
+	my $insert_loadlog_statement = "
+   INSERT INTO
+   computerloadlog
+   (
+      reservationid,
+      computerid,
+      loadstateid,
+      timestamp,
+      additionalinfo
+   )
+   VALUES
+   (
+      '$reservation_id',
+      '$computer_id',
+      '$loadstate_id',
+      NOW(),
+      '$additional_info'
+   )
+   ";
+
+	# Execute the insert statement, the return value should be the id of the computerloadlog row that was inserted
+	my $loadlog_id = database_execute($insert_loadlog_statement);
+	if ($loadlog_id) {
+		notify($ERRORS{'DEBUG'}, 0, "inserted row into computerloadlog table: id=$loadlog_id, loadstate=$loadstate_name, additional info: '$additional_info'");
+	}
+	else {
+		notify($ERRORS{'WARNING'}, 0, "failed to insert row into computerloadlog table: loadstate=$loadstate_name, additional info: '$additional_info'");
+	}
+
+	return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 update_log_ending_new
+
+ Parameters  : string containing the log ending value
+ Returns     : true if successful, false if failed
+ Description : Updates the log.ending value in the database for the log ID
+               set for this reservation. Returns false if log ID is not
+					set. A string argument must be passed containing the new
+					log.ending value.
+					
+=cut
+
+sub update_log_ending_new {
+	# Check if subroutine was called as an object method
+	my $self = shift;
+	if (!ref($self) =~ /VCL::/) {
+		notify($ERRORS{'WARNING'}, 0, "subroutine must be called as an object method");
+		return;
+	}
+	
+	# Make sure log ending value was passed
+	my $request_log_ending = shift;
+	if (!$request_log_ending) {
+		notify($ERRORS{'WARNING'}, 0, "log ending value argument was not passed");
+		return;
+	}
+	
+	# Get the log id, make sure it is configured
+	my $request_log_id = $self->data->get_request_log_id();
+	if (!$request_log_id) {
+		notify($ERRORS{'WARNING'}, 0, "request log id could not be retrieved");
+		return;
+	}
+	
+	# Get the other necessary data
+	my $request_state_name = $self->data->get_request_state_name();
+	my $image_id = $self->data->get_image_id();
+	my $image_name = $self->data->get_image_name();
+	my $imagerevision_production = $self->data->get_imagerevision_production();
+		
+	
+	# Make sure the requested log ending makes sense
+	if ($request_log_ending eq 'failed') {		
+		
+		# Don't set ending to 'failed' if imagerevision.production = 0
+		if (!$imagerevision_production) {
+			notify($ERRORS{'WARNING'}, 0, "log ending should not be set to '$request_log_ending' because imagerevision.production = 0, changing to 'failedtest'");
+			$request_log_ending = 'failedtest';
+		}
+		
+		else {
+			# Construct a select statement to retrieve the resource group names this image belongs to
+			my $select_image_groups_statement = "
+			SELECT DISTINCT
+			resourcegroup.name
+			FROM
+			image,
+			resource,
+			resourcetype,
+			resourcegroup,
+			resourcegroupmembers
+			WHERE
+			image.id = $image_id AND
+			resource.subid = image.id AND resource.resourcetypeid = 13 AND
+			resourcegroupmembers.resourceid = resource.id AND
+			resourcegroup.id = resourcegroupmembers.resourcegroupid
+			";
+			
+			# Call database_select() to execute the select statement
+			my @image_group_rows = VCL::utils::database_select($select_image_groups_statement);
+			if (!scalar @image_group_rows == 1) {
+				notify($ERRORS{'WARNING'}, 0, "unable to retrieve image group names for image $image_name");
+				return;
+			}
+			
+			# Assemble an array from the select return array
+			my @image_group_names;
+			for my $image_group_row (@image_group_rows) {
+				my $image_group_name = $image_group_row->{name};
+				push @image_group_names, $image_group_name;
+			}
+			notify($ERRORS{'DEBUG'}, 0, "retrieved groups image $image_name belongs to:\n" . join("\n", @image_group_names));
+			
+			# Don't set ending to 'failed' if image only belongs to newimages-* group
+			if ($request_log_ending eq 'failed' && scalar @image_group_names == 1 && $image_group_names[0] =~ /^newimages-.*/i) {
+				notify($ERRORS{'WARNING'}, 0, "log ending should not be set to '$request_log_ending' because image only belongs to $image_group_names[0] group, changing to 'failedtest'");
+				$request_log_ending = 'failedtest';
+			}
+		}
+	}
+	
+	# Always set ending to 'none' if not a state the end user sees
+	if ($request_log_ending ne 'none' && $request_state_name =~ /^(reload|to.*|.*hpc.*|image)$/) {
+		notify($ERRORS{'WARNING'}, 0, "log ending should NOT be set to '$request_log_ending' because request state is $request_state_name, changing to 'none'");
+		$request_log_ending = 'none';
+	}
+	
+	# Construct the update statement 
+	my $sql_update_statement = "
+	UPDATE
+	log
+	SET
+	log.ending = \'$request_log_ending\',
+	log.finalend = NOW()
+	WHERE
+	log.id = $request_log_id
+	";
+	
+	# Execute the update statement
+	if (database_execute($sql_update_statement)) {
+		notify($ERRORS{'DEBUG'}, 0, "executed update statement to set log ending to $request_log_ending for log id: $request_log_id");
+	}
+	else {
+		notify($ERRORS{'WARNING'}, 0, "failed to execute update statement to set log ending to $request_log_ending for log id: $request_log_id");
+		return;
+	}
+	
+	# Check the actual ending value in the database, SQL update returns 1 even if 0 rows were affected
+	# Construct a select statement 
+	my $sql_select_statement = "
+	SELECT
+	log.ending,
+	log.finalend
+	FROM
+	log
+	WHERE
+	log.id = $request_log_id
+	";
+	
+	# Call database_select() to execute the select statement and make sure 1 row was returned
+	my @select_rows = VCL::utils::database_select($sql_select_statement);
+	if (!scalar @select_rows == 1) {
+		notify($ERRORS{'WARNING'}, 0, "unable to verify log ending value, select statement returned " . scalar @select_rows . " rows:\n" . join("\n", $sql_select_statement));
+		return;
+	}
+	
+	# $select_rows[0] is a hash reference, the keys are the column names
+	my $log_ending = $select_rows[0]->{ending};
+	
+	# Compare the ending value in the database to the argument
+	if ($log_ending && $log_ending eq $request_log_ending) {
+		notify($ERRORS{'OK'}, 0, "log ending was set to '$request_log_ending' for log id: $request_log_id");
+		$self->insert_computerloadlog("info", "log ending was set to '$request_log_ending' for log id: $request_log_id");
+	}
+	else {
+		notify($ERRORS{'WARNING'}, 0, "log ending in database ('$log_ending') does not match requested value ('$request_log_ending') for log id: $request_log_id");
+		$self->insert_computerloadlog("info", "log ending in database ('$log_ending') does not match requested value ('$request_log_ending') for log id: $request_log_id");
+		return;
+	}
+
+	return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 check_image_os
 
  Parameters  :
@@ -358,7 +807,7 @@
 
 	# Only make corrections if state is image
 	if ($request_state_name ne 'image') {
-		notify($ERRORS{'OK'}, 0, "no corrections need to be made, not an imaging request, returning 1");
+		notify($ERRORS{'DEBUG'}, 0, "no corrections need to be made, not an imaging request, returning 1");
 		return 1;
 	}
 
@@ -372,7 +821,7 @@
 		$image_os_name_new = "$1$2image";
 	}
 	else {
-		notify($ERRORS{'OK'}, 0, "no corrections need to be made to image OS: $image_os_name");
+		notify($ERRORS{'DEBUG'}, 0, "no corrections need to be made to image OS: $image_os_name");
 		return 1;
 	}
 
@@ -403,19 +852,19 @@
 		notify($ERRORS{'OK'}, 0, "image and imagerevision tables updated: $image_name -> $image_name_new");
 	}
 	else {
-		notify($ERRORS{'OK'}, 0, "failed to update image and imagerevision tables: $image_name -> $image_name_new, returning 0");
+		notify($ERRORS{'WARNING'}, 0, "failed to update image and imagerevision tables: $image_name -> $image_name_new, returning 0");
 		return 0;
 	}
 
 	if ($self->data->refresh()) {
-		notify($ERRORS{'OK'}, 0, "DataStructure refreshed after correcting image OS");
+		notify($ERRORS{'DEBUG'}, 0, "DataStructure refreshed after correcting image OS");
 	}
 	else {
 		notify($ERRORS{'WARNING'}, 0, "failed to update DataStructure updated correcting image OS, returning 0");
 		return 0;
 	}
 
-	notify($ERRORS{'OK'}, 0, "returning 1");
+	notify($ERRORS{'DEBUG'}, 0, "returning 1");
 	return 1;
 } ## end sub check_image_os
 
@@ -443,7 +892,7 @@
 	
 	# Delete all computerloadlog rows with loadstatename = 'begin' for thie reservation
 	if (delete_computerloadlog_reservation($reservation_id, 'begin')) {
-		notify($ERRORS{'OK'}, 0, "removed computerloadlog rows with loadstate=begin for reservation");
+		notify($ERRORS{'DEBUG'}, 0, "removed computerloadlog rows with loadstate=begin for reservation");
 	}
 	else {
 		notify($ERRORS{'WARNING'}, 0, "failed to remove computerloadlog rows with loadstate=begin for reservation");
@@ -462,18 +911,20 @@
 		notify($ERRORS{'DEBUG'}, 0, "process has a database handle stored in \$ENV{dbh}, attempting disconnect");
 
 		if ($ENV{dbh}->disconnect) {
-			notify($ERRORS{'OK'}, 0, "\$ENV{dbh}: database disconnect successful");
+			notify($ERRORS{'DEBUG'}, 0, "\$ENV{dbh}: database disconnect successful");
 		}
 		else {
 			notify($ERRORS{'WARNING'}, 0, "\$ENV{dbh}: database disconnect failed, " . DBI::errstr());
 		}
 	} ## end if (defined $ENV{dbh})
 	else {
-		notify($ERRORS{'OK'}, 0, "process does not have a database handle stored in \$ENV{dbh}");
+		notify($ERRORS{'DEBUG'}, 0, "process does not have a database handle stored in \$ENV{dbh}");
 	}
 
 	# Check for an overridden destructor
 	$self->SUPER::DESTROY if $self->can("SUPER::DESTROY");
+	
+	notify($ERRORS{'OK'}, 0, ref($self) . " process $PID exiting");
 } ## end sub DESTROY
 
 #/////////////////////////////////////////////////////////////////////////////