extern "C" void log_except (const char *msg) { check_execute_event(); // log shadow exception event ShadowExceptionEvent event; sprintf(event.message, msg); // we want to log the events from the perspective of the // user job, so if the shadow *sent* the bytes, then that // means the user job *received* the bytes event.recvd_bytes = BytesSent; event.sent_bytes = BytesRecvd; if (syscall_sock) { event.recvd_bytes += syscall_sock->get_bytes_sent(); event.sent_bytes += syscall_sock->get_bytes_recvd(); } for(std::vector<WriteUserLog*>::iterator p = ULog.begin(); p != ULog.end(); ++p) { if (!(*p)->writeEvent (&event)) { dprintf (D_ALWAYS, "Unable to log ULOG_SHADOW_EXCEPTION event\n"); } } }
extern "C" void log_except (const char *msg) { check_execute_event(); // log shadow exception event ShadowExceptionEvent event; if(!msg) msg = ""; snprintf(event.message, sizeof(event.message), "%s", msg); event.message[sizeof(event.message)-1] = '\0'; // we want to log the events from the perspective of the // user job, so if the shadow *sent* the bytes, then that // means the user job *received* the bytes event.recvd_bytes = BytesSent; event.sent_bytes = BytesRecvd; if (syscall_sock) { event.recvd_bytes += syscall_sock->get_bytes_sent(); event.sent_bytes += syscall_sock->get_bytes_recvd(); } if (!ULog.writeEvent (&event)) { dprintf (D_ALWAYS, "Unable to log ULOG_SHADOW_EXCEPTION event\n"); } }
extern "C" void log_image_size (int size) { check_execute_event(); // log the event JobImageSizeEvent event; event.image_size_kb = size; if (!ULog.writeEvent (&event)) { dprintf (D_ALWAYS, "Unable to log ULOG_IMAGE_SIZE event\n"); } }
extern "C" void log_checkpoint (struct rusage *localr, struct rusage *remoter) { check_execute_event(); CheckpointedEvent event; event.run_local_rusage = *localr; event.run_remote_rusage = *remoter; if (!ULog.writeEvent (&event)) { dprintf (D_ALWAYS, "Could not log ULOG_CHECKPOINTED event\n"); } }
extern "C" void log_image_size (int size) { check_execute_event(); // log the event JobImageSizeEvent event; event.image_size_kb = size; for(std::vector<WriteUserLog*>::iterator p = ULog.begin(); p != ULog.end(); ++p) { if (!(*p)->writeEvent (&event)) { dprintf (D_ALWAYS, "Unable to log ULOG_IMAGE_SIZE event\n"); } } }
extern "C" void log_checkpoint (struct rusage *localr, struct rusage *remoter) { check_execute_event(); CheckpointedEvent event; event.run_local_rusage = *localr; event.run_remote_rusage = *remoter; for(std::vector<WriteUserLog*>::iterator p = ULog.begin(); p != ULog.end(); ++p) { if (!(*p)->writeEvent (&event)) { dprintf (D_ALWAYS, "Could not log ULOG_CHECKPOINTED event\n"); } } }
extern "C" void log_termination (struct rusage *localr, struct rusage *remoter) { check_execute_event(); switch (WTERMSIG(JobStatus)) { case 0: case -1: // if core, bad exectuable --- otherwise, a normal exit if (WCOREDUMP(JobStatus) && WEXITSTATUS(JobStatus) == ENOEXEC) { // log the ULOG_EXECUTABLE_ERROR event ExecutableErrorEvent event; event.errType = CONDOR_EVENT_NOT_EXECUTABLE; if (!ULog.writeEvent (&event)) { dprintf (D_ALWAYS, "Unable to log NOT_EXECUTABLE event\n"); } } else if (WCOREDUMP(JobStatus) && WEXITSTATUS(JobStatus) == 0) { // log the ULOG_EXECUTABLE_ERROR event ExecutableErrorEvent event; event.errType = CONDOR_EVENT_BAD_LINK; if (!ULog.writeEvent (&event)) { dprintf (D_ALWAYS, "Unable to log BAD_LINK event\n"); } } else { // log the ULOG_JOB_TERMINATED event JobTerminatedEvent event; event.normal = true; // normal termination event.returnValue = WEXITSTATUS(JobStatus); event.total_local_rusage = Proc->local_usage; event.total_remote_rusage = Proc->remote_usage[0]; event.run_local_rusage = *localr; event.run_remote_rusage = *remoter; // we want to log the events from the perspective of the // user job, so if the shadow *sent* the bytes, then that // means the user job *received* the bytes event.recvd_bytes = BytesSent; event.sent_bytes = BytesRecvd; if (syscall_sock) { event.recvd_bytes += syscall_sock->get_bytes_sent(); event.sent_bytes += syscall_sock->get_bytes_recvd(); } event.total_recvd_bytes = TotalBytesSent + event.recvd_bytes; event.total_sent_bytes = TotalBytesRecvd + event.sent_bytes; if (!ULog.writeEvent (&event)) { dprintf (D_ALWAYS,"Unable to log ULOG_JOB_TERMINATED event\n"); } } break; case SIGKILL: // evicted without a checkpoint { JobEvictedEvent event; event.checkpointed = false; event.run_local_rusage = *localr; event.run_remote_rusage = *remoter; // we want to log the events from the perspective of the // user job, so if the shadow *sent* the bytes, then that // means the user job *received* the bytes event.recvd_bytes = BytesSent; event.sent_bytes = BytesRecvd; if (syscall_sock) { event.recvd_bytes += syscall_sock->get_bytes_sent(); event.sent_bytes += syscall_sock->get_bytes_recvd(); } if (!ULog.writeEvent (&event)) { dprintf (D_ALWAYS, "Unable to log ULOG_JOB_EVICTED event\n"); } } break; case SIGQUIT: // evicted, but *with* a checkpoint { JobEvictedEvent event; event.checkpointed = true; event.run_local_rusage = *localr; event.run_remote_rusage = *remoter; // we want to log the events from the perspective of the // user job, so if the shadow *sent* the bytes, then that // means the user job *received* the bytes event.recvd_bytes = BytesSent; event.sent_bytes = BytesRecvd; if (syscall_sock) { event.recvd_bytes += syscall_sock->get_bytes_sent(); event.sent_bytes += syscall_sock->get_bytes_recvd(); } if (!ULog.writeEvent (&event)) { dprintf (D_ALWAYS, "Unable to log ULOG_JOB_EVICTED event\n"); } } break; default: // abnormal termination { MyString coredir; MyString coreFile; JobTerminatedEvent event; event.normal = false; event.signalNumber = WTERMSIG(JobStatus); if (WCOREDUMP(JobStatus)) { /* look up the corefile name in the job ad if one exists... */ if (!JobAd->LookupString(ATTR_JOB_CORE_FILENAME, coreFile)) { /* if it didn't exist in the job ad, then construct what it should be. */ ASSERT( condor_getcwd(coredir) ); if (strcmp (Proc->rootdir, "/") == 0) { coreFile.formatstr( "%s/core.%d.%d", coredir.Value(), Proc->id.cluster, Proc->id.proc ); } else { coreFile.formatstr( "%s%s/core.%d.%d", Proc->rootdir, coredir.Value(), Proc->id.cluster, Proc->id.proc ); } } event.setCoreFile( coreFile.Value() ); } event.run_local_rusage = *localr; event.run_remote_rusage = *remoter; event.total_local_rusage = Proc->local_usage; event.total_remote_rusage = Proc->remote_usage[0]; // we want to log the events from the perspective of the // user job, so if the shadow *sent* the bytes, then that // means the user job *received* the bytes event.recvd_bytes = BytesSent; event.sent_bytes = BytesRecvd; if (syscall_sock) { event.recvd_bytes += syscall_sock->get_bytes_sent(); event.sent_bytes += syscall_sock->get_bytes_recvd(); } if (!ULog.writeEvent (&event)) { dprintf (D_ALWAYS,"Unable to log ULOG_JOB_TERMINATED event\n"); } } } }