Fixed elapsed time and added critical sections.

svn path=/trunk/boinc/; revision=23518
This commit is contained in:
Daniel Lombraña González 2011-05-10 10:50:03 +00:00
parent 9958851129
commit b41590f9ef
1 changed files with 31 additions and 38 deletions

View File

@ -20,7 +20,6 @@
// //
// Handles: // Handles:
// - suspend/resume/quit/abort virtual machine // - suspend/resume/quit/abort virtual machine
// - reporting CPU time through trickle massages
// //
// Contributor: Jie Wu <jiewu AT cern DOT ch> // Contributor: Jie Wu <jiewu AT cern DOT ch>
// //
@ -351,6 +350,9 @@ void VM::create() {
void VM::start(bool vrde=false, bool headless=false) { void VM::start(bool vrde=false, bool headless=false) {
// Start the VM in headless mode // Start the VM in headless mode
boinc_begin_critical_section();
string arg_list=""; string arg_list="";
if (headless) arg_list=" startvm "+ virtual_machine_name + " --type headless"; if (headless) arg_list=" startvm "+ virtual_machine_name + " --type headless";
else arg_list = " startvm "+ virtual_machine_name; else arg_list = " startvm "+ virtual_machine_name;
@ -360,6 +362,7 @@ void VM::start(bool vrde=false, bool headless=false) {
fprintf(stderr,"ERROR: %s\n",arg_list.c_str()); fprintf(stderr,"ERROR: %s\n",arg_list.c_str());
fprintf(stderr,"INFO: Removing VM...\n"); fprintf(stderr,"INFO: Removing VM...\n");
remove(); remove();
boinc_end_critical_section();
boinc_finish(1); boinc_finish(1);
} }
// Enable or disable VRDP for the VM: (by default is disabled) // Enable or disable VRDP for the VM: (by default is disabled)
@ -383,15 +386,20 @@ void VM::start(bool vrde=false, bool headless=false) {
arg_list = " setextradata " + virtual_machine_name + " GUI/RestrictedCloseActions SaveState,Shutdown,PowerOff,Restore"; arg_list = " setextradata " + virtual_machine_name + " GUI/RestrictedCloseActions SaveState,Shutdown,PowerOff,Restore";
vbm_popen(arg_list); vbm_popen(arg_list);
} }
boinc_end_critical_section();
} }
void VM::kill() { void VM::kill() {
boinc_begin_critical_section();
string arg_list=""; string arg_list="";
arg_list="controlvm "+virtual_machine_name+" poweroff"; arg_list="controlvm "+virtual_machine_name+" poweroff";
vbm_popen(arg_list); vbm_popen(arg_list);
boinc_end_critical_section();
} }
void VM::pause() { void VM::pause() {
boinc_begin_critical_section();
time_t current_time; time_t current_time;
string arg_list=""; string arg_list="";
arg_list="controlvm "+virtual_machine_name+" pause"; arg_list="controlvm "+virtual_machine_name+" pause";
@ -400,10 +408,12 @@ void VM::pause() {
current_time=time(NULL); current_time=time(NULL);
current_period += difftime (current_time,last_poll_point); current_period += difftime (current_time,last_poll_point);
} }
boinc_end_critical_section();
} }
void VM::resume() { void VM::resume() {
boinc_begin_critical_section();
string arg_list=""; string arg_list="";
arg_list="controlvm "+virtual_machine_name+" resume"; arg_list="controlvm "+virtual_machine_name+" resume";
if(vbm_popen(arg_list)) { if(vbm_popen(arg_list)) {
@ -411,9 +421,11 @@ void VM::resume() {
last_poll_point=time(NULL); last_poll_point=time(NULL);
} }
boinc_end_critical_section();
} }
void VM::Check(){ void VM::Check(){
boinc_begin_critical_section();
string arg_list=""; string arg_list="";
if(suspended){ if(suspended){
arg_list="controlvm "+virtual_machine_name+" resume"; arg_list="controlvm "+virtual_machine_name+" resume";
@ -421,20 +433,24 @@ void VM::Check(){
} }
arg_list="controlvm "+virtual_machine_name+" savestate"; arg_list="controlvm "+virtual_machine_name+" savestate";
vbm_popen(arg_list); vbm_popen(arg_list);
boinc_end_critical_section();
} }
void VM::savestate() void VM::savestate()
{ {
boinc_begin_critical_section();
string arg_list = ""; string arg_list = "";
arg_list = "controlvm " + virtual_machine_name + " savestate"; arg_list = "controlvm " + virtual_machine_name + " savestate";
if (!vbm_popen(arg_list)) if (!vbm_popen(arg_list))
{ {
fprintf(stderr,"ERROR: The VM could not be saved.\n"); fprintf(stderr,"ERROR: The VM could not be saved.\n");
} }
boinc_end_critical_section();
} }
void VM::remove(){ void VM::remove(){
boinc_begin_critical_section();
string arg_list="",vminfo, vboxfolder, vboxXML, vboxXMLNew, vmfolder, vmdisk, line; string arg_list="",vminfo, vboxfolder, vboxXML, vboxXMLNew, vmfolder, vmdisk, line;
char * env; char * env;
char buffer[4096]; char buffer[4096];
@ -565,45 +581,15 @@ void VM::remove(){
fprintf(stderr,"INFO: System was clean, nothing to delete.\n"); fprintf(stderr,"INFO: System was clean, nothing to delete.\n");
} }
#endif #endif
// boinc_end_critical_section();
// arg_list="";
// //arg_list="unregistervm "+virtual_machine_name+" --delete";
//
// arg_list="unregistervm "+virtual_machine_name;
// if(!vbm_popen(arg_list))
// {
// fprintf(stderr,"INFO: CernVM does not exist, so it is not necessary to unregister.\n");
// fprintf(stderr,"INFO: Please, check that cernvm.vmdk virtual hard disk is not registered.\n");
// }
// else
// {
// fprintf(stderr,"INFO: Successfully unregistered the CernVM\n");
//
// }
//
// arg_list = "";
// arg_list = "closemedium disk \"" + vmdisk + "\"";
// if(!vbm_popen(arg_list))
// {
// fprintf(stderr,"INFO: Please, check that cernvm.vmdk virtual hard disk is not registered.\n");
// }
// else
// {
// fprintf(stderr,"INFO: Successfully removed the CernVM disk\n");
//
// }
//
//
// // Remove file VM_NAME to delete the name of the VM
// boinc_delete_file(name_path.c_str());
//
} }
void VM::release(){ void VM::release(){
boinc_begin_critical_section();
string arg_list=""; string arg_list="";
arg_list="closemedium disk "+disk_path; arg_list="closemedium disk "+disk_path;
vbm_popen(arg_list); vbm_popen(arg_list);
boinc_end_critical_section();
} }
int VM::send_cputime_message() { int VM::send_cputime_message() {
@ -618,6 +604,7 @@ int VM::send_cputime_message() {
} }
void VM::poll() { void VM::poll() {
boinc_begin_critical_section();
FILE* fp; FILE* fp;
string arg_list, status; string arg_list, status;
char buffer[1024]; char buffer[1024];
@ -628,6 +615,7 @@ void VM::poll() {
if (!vbm_popen(arg_list,buffer,sizeof(buffer))){ if (!vbm_popen(arg_list,buffer,sizeof(buffer))){
fprintf(stderr,"ERROR: Get status from VM failed!\n"); fprintf(stderr,"ERROR: Get status from VM failed!\n");
fprintf(stderr,"Aborting\n"); fprintf(stderr,"Aborting\n");
boinc_end_critical_section();
boinc_finish(1); boinc_finish(1);
} }
@ -643,6 +631,7 @@ void VM::poll() {
last_poll_point=current_time; last_poll_point=current_time;
fprintf(stderr,"INFO: VM poll is running\n"); fprintf(stderr,"INFO: VM poll is running\n");
} }
boinc_end_critical_section();
return; return;
fprintf(stderr,"INFO: VM is running!\n"); //testing fprintf(stderr,"INFO: VM is running!\n"); //testing
} }
@ -654,6 +643,7 @@ void VM::poll() {
current_period += difftime (current_time,last_poll_point); current_period += difftime (current_time,last_poll_point);
} }
fprintf(stderr,"INFO: VM is paused!\n"); //testing fprintf(stderr,"INFO: VM is paused!\n"); //testing
boinc_end_critical_section();
return; return;
} }
//if(status.find("VMState=\"poweroff\"") != string::npos //if(status.find("VMState=\"poweroff\"") != string::npos
@ -665,12 +655,14 @@ void VM::poll() {
{ {
fprintf(stderr, "INFO: VM is powered off and it shouldn't\n"); fprintf(stderr, "INFO: VM is powered off and it shouldn't\n");
fprintf(stderr, "INFO: Cancelling WU...\n"); fprintf(stderr, "INFO: Cancelling WU...\n");
boinc_end_critical_section();
boinc_finish(1); boinc_finish(1);
exit(1); exit(1);
} }
fprintf(stderr,"ERROR: Get cernvm status error!\n"); fprintf(stderr,"ERROR: Get cernvm status error!\n");
fprintf(stderr,"Aborting\n"); fprintf(stderr,"Aborting\n");
remove(); remove();
boinc_end_critical_section();
boinc_finish(1); boinc_finish(1);
} }
@ -759,7 +751,7 @@ time_t update_progress(time_t secs) {
int main(int argc, char** argv) { int main(int argc, char** argv) {
BOINC_OPTIONS options; BOINC_OPTIONS options;
BOINC_STATUS status; BOINC_STATUS status;
double cpu_time=0; double cpu_time=0, cpu_chkpt_time=0;
FILE*fp; FILE*fp;
char buffer[2048]; // Enough size for the VBoxManage list vms output char buffer[2048]; // Enough size for the VBoxManage list vms output
unsigned int i; unsigned int i;
@ -806,7 +798,7 @@ int main(int argc, char** argv) {
options.main_program = true; options.main_program = true;
options.check_heartbeat = true; options.check_heartbeat = true;
options.handle_process_control = true; options.handle_process_control = true;
//options.handle_trickle_ups = true;
if (graphics) { if (graphics) {
options.backwards_compatible_graphics = true; options.backwards_compatible_graphics = true;
} }
@ -998,6 +990,7 @@ int main(int argc, char** argv) {
double frac_done = 0; double frac_done = 0;
read_cputime(cpu_time); read_cputime(cpu_time);
cpu_chkpt_time = cpu_time;
vm.current_period=cpu_time; vm.current_period=cpu_time;
vm.start(vrde,headless); vm.start(vrde,headless);
vm.last_poll_point = time(NULL); vm.last_poll_point = time(NULL);
@ -1024,8 +1017,8 @@ int main(int argc, char** argv) {
// Convert it for Windows machines: // Convert it for Windows machines:
t = static_cast<int>(dif_secs); t = static_cast<int>(dif_secs);
fprintf(stderr,"INFO: Running seconds %ld\n",dif_secs); fprintf(stderr,"INFO: Running seconds %ld\n",dif_secs);
// For 12 hours: // For 24 hours:
frac_done = floor((t/43200.0)*100.0)/100.0; frac_done = floor((t/86400.0)*100.0)/100.0;
fprintf(stderr,"INFO: Fraction done %f\n",frac_done); fprintf(stderr,"INFO: Fraction done %f\n",frac_done);
// Report total CPU time, which is dif_secs (task CPU running time), and checkpoint time (which is also dif_secs, // Report total CPU time, which is dif_secs (task CPU running time), and checkpoint time (which is also dif_secs,