in managementnode/lib/VCL/Module/State.pm [84:234]
sub initialize {
my $self = shift;
notify($ERRORS{'DEBUG'}, 0, "initializing VCL::Module::State object");
$self->{start_time} = time;
my $request_id = $self->data->get_request_id();
my $reservation_id = $self->data->get_reservation_id();
my $request_state_name = $self->data->get_request_state_name();
my $computer_id = $self->data->get_computer_id();
my $is_vm = $self->data->get_computer_vmhost_id(0);
my $is_parent_reservation = $self->data->is_parent_reservation();
my $reservation_count = $self->data->get_reservation_count();
my $nathost_id = $self->data->get_nathost_id(0);
# Initialize the database handle count
$ENV->{dbh_count} = 0;
# Attempt to get a database handle
if ($ENV->{dbh} = getnewdbh()) {
notify($ERRORS{'DEBUG'}, 0, "obtained a database handle for this state process, stored as \$ENV->{dbh}");
}
else {
notify($ERRORS{'CRITICAL'}, 0, "unable to obtain a database handle for this state process");
return;
}
# Update reservation lastcheck value to prevent processes from being forked over and over if a problem occurs
my $reservation_lastcheck = update_reservation_lastcheck($reservation_id);
if ($reservation_lastcheck) {
$self->data->set_reservation_lastcheck_time($reservation_lastcheck);
}
# If this is a cluster request, wait for all reservations to begin before proceeding
if ($reservation_count > 1) {
if (!$self->wait_for_all_reservations_to_begin('begin', 300, 5)) {
$self->reservation_failed("failed to detect start of processing for all reservation processes", 'available');
}
}
# Parent reservation needs to update the request state to pending
if ($is_parent_reservation) {
if ($reservation_count > 1) {
# Check if any reservations have failed
if (my @failed_reservation_ids = $self->does_loadstate_exist_any_reservation('failed')) {
notify($ERRORS{'WARNING'}, 0, "reservations failed: " . join(', ', @failed_reservation_ids));
$self->state_exit('failed');
}
}
# Update the request state to pending for this reservation
if (!update_request_state($request_id, "pending", $request_state_name)) {
# Check if request was deleted
if (is_request_deleted($request_id)) {
exit;
}
# Check the current state
my ($current_request_state, $current_request_laststate) = get_request_current_state_name($request_id);
if (!$current_request_state) {
# Request probably complete and already removed
notify($ERRORS{'DEBUG'}, 0, "current request state could not be retrieved, it was probably completed by another vcld process");
exit;
}
if ($current_request_state =~ /^(deleted|complete)$/ || $current_request_laststate =~ /^(deleted)$/) {
notify($ERRORS{'DEBUG'}, 0, "current request state: $current_request_state/$current_request_laststate, exiting");
exit;
}
$self->reservation_failed("failed to update request state to pending");
}
}
else {
notify($ERRORS{'DEBUG'}, 0, "child reservation, not updating request state to 'pending'");
}
# Set the PID and PPID in the DataStructure
# These will be wrong if set in get_request_info before the state process is forked
$self->data->set_process_pid($PID);
$self->data->set_process_ppid(getppid() || '<unknown>');
# Create an OS object
if (my $os = $self->create_os_object()) {
$self->set_os($os);
}
else {
$self->reservation_failed("failed to create OS object");
}
# Set the os under mn_os to the OS object for the computer being loaded
# This allows the $self->mn_os object to call $self->os to retrieve the OS object for the computer being loaded
# This is useful because the DataStructure object changes when mn_os is created and it would otherwise not have access to the original data
if ($self->mn_os()) {
$self->mn_os->set_os($self->os);
}
# Create a VM host OS object if vmhostid is set for the computer
my $vmhost_os;
if ($is_vm) {
$vmhost_os = $self->create_vmhost_os_object();
if (!$vmhost_os) {
$self->reservation_failed("failed to create VM host OS object");
}
$self->set_vmhost_os($vmhost_os);
}
# Create a NAT host OS object if computer is mapped to a NAT host
my $nathost_os;
if ($nathost_id) {
$nathost_os = $self->create_nathost_os_object();
if (!$nathost_os) {
$self->reservation_failed("failed to create NAT host OS object");
}
$self->set_nathost_os($nathost_os);
# Allow the OS object to access the nathost_os object
# This is necessary to allow the OS code to call the subroutines to forward ports
$self->os->set_nathost_os($self->nathost_os());
# Allow the NAT host OS object to access the OS object
# This allows the NAT host OS object to retrieve info about the computer being loaded
$nathost_os->set_os($self->os());
}
# Create a provisioning object
if (my $provisioner = $self->create_provisioning_object()) {
$self->set_provisioner($provisioner);
# Allow the provisioning object to access the OS object
$self->provisioner->set_os($self->os());
# Allow the OS object to access the provisioning object
# This is necessary to allow the OS code to be able to call the provisioning power* subroutines if the OS reboot or shutdown fails
$self->os->set_provisioner($self->provisioner());
}
else {
$self->reservation_failed("failed to create provisioning object");
}
# Create a VM host OS object if vmhostid is set for the computer
if ($is_vm) {
# Check if provisioning object already has a VM host OS object
my $provisioner_vmhost_os = $self->provisioner->vmhost_os(0);
if (ref($provisioner_vmhost_os) ne ref($vmhost_os)) {
$self->set_vmhost_os($provisioner_vmhost_os);
}
}
return 1;
} ## end sub initialize