VBOX: Move detection of errors reported by VirtualBox to a little later in the start up process. It may take the VM process a few moments to figure out if it will be able to run.

TODO: Remove some duplicated code.
This commit is contained in:
Rom Walton 2015-10-16 10:32:58 -04:00
parent fe5e959593
commit 0d7ecc6a16
1 changed files with 93 additions and 39 deletions

View File

@ -771,35 +771,6 @@ int main(int argc, char** argv) {
" This might be a temporary problem and so this job will be rescheduled for another time.\n";
unrecoverable_error = false;
temp_reason = "VM environment needed to be cleaned up.";
} else if (pVM->is_logged_failure_vm_extensions_disabled()) {
error_reason =
" NOTE: BOINC has detected that your computer's processor supports hardware acceleration for\n"
" virtual machines but the hypervisor failed to successfully launch with this feature enabled.\n"
" This means that the hardware acceleration feature has been disabled in the computer's BIOS.\n"
" Please enable this feature in your computer's BIOS.\n"
" Intel calls it 'VT-x'\n"
" AMD calls it 'AMD-V'\n"
" More information can be found here: http://en.wikipedia.org/wiki/X86_virtualization\n"
" Error Code: ERR_CPU_VM_EXTENSIONS_DISABLED\n";
retval = ERR_EXEC;
} else if (pVM->is_logged_failure_vm_extensions_not_supported()) {
error_reason =
" NOTE: VirtualBox has reported an improperly configured virtual machine. It was configured to require\n"
" hardware acceleration for virtual machines, but your processor does not support the required feature.\n"
" Please report this issue to the project so that it can be addresssed.\n";
} else if (pVM->is_logged_failure_vm_extensions_in_use()) {
error_reason =
" NOTE: VirtualBox hypervisor reports that another hypervisor has locked the hardware acceleration\n"
" for virtual machines feature in exclusive mode.\n";
unrecoverable_error = false;
temp_reason = "Forign VM Hypervisor locked hardware acceleration features.";
temp_delay = 86400;
} else if (pVM->is_logged_failure_host_out_of_memory()) {
error_reason =
" NOTE: VirtualBox has failed to allocate enough memory to start the configured virtual machine.\n"
" This might be a temporary problem and so this job will be rescheduled for another time.\n";
unrecoverable_error = false;
temp_reason = "VM Hypervisor was unable to allocate enough memory to start VM.";
} else {
do_dump_hypervisor_logs = true;
}
@ -882,18 +853,101 @@ int main(int argc, char** argv) {
// Log our current state
pVM->poll(true);
// Did we timeout?
if (!pVM->online && (timeout <= dtime())) {
vboxlog_msg("NOTE: VM failed to enter an online state within the timeout period.");
vboxlog_msg(" This might be a temporary problem and so this job will be rescheduled for another time.");
pVM->reset_vm_process_priority();
pVM->poweroff();
// Is the VM still running? If not, why not?
//
if (!pVM->online) {
// All 'failure to start' errors are unrecoverable by default
bool unrecoverable_error = true;
bool skip_cleanup = false;
bool do_dump_hypervisor_logs = false;
string error_reason;
const char* temp_reason = "";
if (pVM->is_logged_failure_vm_extensions_disabled()) {
error_reason =
" NOTE: BOINC has detected that your computer's processor supports hardware acceleration for\n"
" virtual machines but the hypervisor failed to successfully launch with this feature enabled.\n"
" This means that the hardware acceleration feature has been disabled in the computer's BIOS.\n"
" Please enable this feature in your computer's BIOS.\n"
" Intel calls it 'VT-x'\n"
" AMD calls it 'AMD-V'\n"
" More information can be found here: http://en.wikipedia.org/wiki/X86_virtualization\n"
" Error Code: ERR_CPU_VM_EXTENSIONS_DISABLED\n";
retval = ERR_EXEC;
} else if (pVM->is_logged_failure_vm_extensions_not_supported()) {
error_reason =
" NOTE: VirtualBox has reported an improperly configured virtual machine. It was configured to require\n"
" hardware acceleration for virtual machines, but your processor does not support the required feature.\n"
" Please report this issue to the project so that it can be addresssed.\n";
} else if (pVM->is_logged_failure_vm_extensions_in_use()) {
error_reason =
" NOTE: VirtualBox hypervisor reports that another hypervisor has locked the hardware acceleration\n"
" for virtual machines feature in exclusive mode.\n";
unrecoverable_error = false;
temp_reason = "Forign VM Hypervisor locked hardware acceleration features.";
temp_delay = 86400;
} else if (pVM->is_logged_failure_host_out_of_memory()) {
error_reason =
" NOTE: VirtualBox has failed to allocate enough memory to start the configured virtual machine.\n"
" This might be a temporary problem and so this job will be rescheduled for another time.\n";
unrecoverable_error = false;
temp_reason = "VM Hypervisor was unable to allocate enough memory to start VM.";
} else if (timeout <= dtime()) {
error_reason =
" NOTE: VM failed to enter an online state within the timeout period.\n"
" This might be a temporary problem and so this job will be rescheduled for another time.\n";
unrecoverable_error = false;
do_dump_hypervisor_logs = true;
temp_reason = "VM Hypervisor failed to enter an online state in a timely fashion.";
temp_delay = 86400;
}
if (unrecoverable_error) {
// Attempt to cleanup the VM and exit.
if (!skip_cleanup) {
pVM->cleanup();
}
checkpoint.update(elapsed_time, current_cpu_time);
if (error_reason.size()) {
vboxlog_msg("\n%s", error_reason.c_str());
}
if (do_dump_hypervisor_logs) {
pVM->dump_hypervisor_logs(true);
boinc_temporary_exit(86400,
"VM Hypervisor failed to enter an online state in a timely fashion."
}
boinc_finish(retval);
} else {
// if the VM is already running notify BOINC about the process ID so it can
// clean up the environment. We should be safe to run after that.
//
if (pVM->vm_pid) {
retval = boinc_report_app_status_aux(
current_cpu_time,
last_checkpoint_cpu_time,
fraction_done,
pVM->vm_pid,
bytes_sent,
bytes_received
);
}
// Give the BOINC API time to report the pid to BOINC.
//
boinc_sleep(5.0);
if (error_reason.size()) {
vboxlog_msg("\n%s", error_reason.c_str());
}
// Exit and let BOINC clean up the rest.
//
boinc_temporary_exit(temp_delay, temp_reason);
}
}
set_floppy_image(aid, *pVM);
report_web_graphics_url(*pVM);
report_remote_desktop_info(*pVM);