int writeRemoteErrorEvent() { RemoteErrorEvent remoteerror; remoteerror.setExecuteHost("<128.105.165.12:32779>"); remoteerror.setDaemonName("<write job log test>"); remoteerror.setErrorText("this is the write test error string"); remoteerror.setCriticalError(true); if ( !logFile.writeEvent(&remoteerror) ) { printf("Complain about bad remoteerror write\n"); exit(1); } return(0); }
bool LocalUserLog::logStarterError( const char* err_msg, bool critical ) { if( ! is_initialized ) { // This can happen if we hit an error talking to the shadow // before we get the job ad. Just ignore it. return false; } if( ! should_log ) { return true; } RemoteErrorEvent event; event.setErrorText( err_msg ); event.setDaemonName( "starter" ); event.setExecuteHost( daemonCore->InfoCommandSinfulString() ); event.setCriticalError( critical ); if( !u_log.writeEvent(&event) ) { dprintf( D_ALWAYS, "Unable to log ULOG_REMOTE_ERROR event\n" ); return false; } return true; }
int pseudo_ulog( ClassAd *ad ) { ULogEvent *event = instantiateEvent(ad); int result = 0; char const *critical_error = NULL; MyString CriticalErrorBuf; bool event_already_logged = false; bool put_job_on_hold = false; char const *hold_reason = NULL; char *hold_reason_buf = NULL; int hold_reason_code = 0; int hold_reason_sub_code = 0; if(!event) { MyString add_str; sPrintAd(add_str, *ad); dprintf( D_ALWAYS, "invalid event ClassAd in pseudo_ulog: %s\n", add_str.Value()); return -1; } if(ad->LookupInteger(ATTR_HOLD_REASON_CODE,hold_reason_code)) { put_job_on_hold = true; ad->LookupInteger(ATTR_HOLD_REASON_SUBCODE,hold_reason_sub_code); ad->LookupString(ATTR_HOLD_REASON,&hold_reason_buf); if(hold_reason_buf) { hold_reason = hold_reason_buf; } } if( event->eventNumber == ULOG_REMOTE_ERROR ) { RemoteErrorEvent *err = (RemoteErrorEvent *)event; if(!err->getExecuteHost() || !*err->getExecuteHost()) { //Insert remote host information. char *execute_host = NULL; thisRemoteResource->getMachineName(execute_host); err->setExecuteHost(execute_host); delete[] execute_host; } if(err->isCriticalError()) { CriticalErrorBuf.formatstr( "Error from %s: %s", err->getExecuteHost(), err->getErrorText()); critical_error = CriticalErrorBuf.Value(); if(!hold_reason) { hold_reason = critical_error; } //Temporary: the following causes critical remote errors //to be logged as ShadowExceptionEvents, rather than //RemoteErrorEvents. The result is ugly, but guaranteed to //be compatible with other user-log reading tools. BaseShadow::log_except(critical_error); event_already_logged = true; } } if( !event_already_logged && !Shadow->uLog.writeEvent( event, ad ) ) { MyString add_str; sPrintAd(add_str, *ad); dprintf( D_ALWAYS, "unable to log event in pseudo_ulog: %s\n", add_str.Value()); result = -1; } if(put_job_on_hold) { hold_reason = critical_error; if(!hold_reason) { hold_reason = "Job put on hold by remote host."; } Shadow->holdJobAndExit(hold_reason,hold_reason_code,hold_reason_sub_code); //should never get here, because holdJobAndExit() exits. } if( critical_error ) { //Suppress ugly "Shadow exception!" Shadow->exception_already_logged = true; //lame: at the time of this writing, EXCEPT does not want const: EXCEPT("%s", critical_error); } delete event; return result; }