diff -urN source-trees/gram/jobmanager/source/globus_gram_job_manager.h source-trees/gram/jobmanager/source/globus_gram_job_manager.h --- source-trees/gt2-cvs/gram/jobmanager/source/globus_gram_job_manager.h Sun Jan 4 00:59:10 2004 +++ source-trees/gt2-cvs/gram/jobmanager/source/globus_gram_job_manager.h Sun Jan 4 02:09:39 2004 @@ -445,6 +445,12 @@ const char * format, ...); +int +globus_gram_job_manager_request_acct( + globus_gram_jobmanager_request_t * request, + const char * format, + ...); + /* globus_gram_job_manager_reporting_file.c */ int globus_gram_job_manager_reporting_file_set( diff -urN source-trees/gram/jobmanager/source/globus_gram_job_manager_request.c source-trees/gram/jobmanager/source/globus_gram_job_manager_request.c --- source-trees/gt2-cvs/gram/jobmanager/source/globus_gram_job_manager_request.c Sun Jan 4 00:59:10 2004 +++ source-trees/gt2-cvs/gram/jobmanager/source/globus_gram_job_manager_request.c Sun Jan 4 02:09:39 2004 @@ -342,3 +342,83 @@ return rc; } /* globus_gram_job_manager_request_log() */ + +/** + * Write data to the job manager accounting file. + * + * This function writes data to the passed file descriptor, if any, + * using a printf format string. + * Data is prefixed with a timestamp when written. + * + * @param format + * Printf-style format string to be written. + * @param ... + * Parameters substituted into the format string, if needed. + * + * @return This function returns the value returned by write(). + */ +int +globus_gram_job_manager_request_acct( + globus_gram_jobmanager_request_t * request, + const char * format, + ... ) +{ + struct tm *curr_tm; + time_t curr_time; + va_list ap; + int rc = -1; + int fd; + const char * gk_acct_fd_var = "GATEKEEPER_ACCT_FD"; + const char * gk_acct_fd; + int n; + int t; + char buf[1024 * 128]; + + if (!(gk_acct_fd = globus_libc_getenv( gk_acct_fd_var ))) + { + return -1; + } + + if (sscanf( gk_acct_fd, "%d", &fd ) != 1) + { + globus_gram_job_manager_request_log( request, + "ERROR: %s has bad value: '%s'\n", gk_acct_fd_var, gk_acct_fd ); + return -1; + } + + if (fcntl( fd, F_SETFD, FD_CLOEXEC ) < 0) + { + globus_gram_job_manager_request_log( request, + "ERROR: cannot set FD_CLOEXEC on %s '%s': %s\n", + gk_acct_fd_var, gk_acct_fd, strerror( errno ) ); + } + + time( &curr_time ); + curr_tm = localtime( &curr_time ); + + n = t = sprintf( buf, "JMA %04d/%02d/%02d %02d:%02d:%02d ", + curr_tm->tm_year + 1900, + curr_tm->tm_mon + 1, curr_tm->tm_mday, + curr_tm->tm_hour, curr_tm->tm_min, + curr_tm->tm_sec ); + + va_start( ap, format ); + + /* + * FIXME: we should use vsnprintf() here... + */ + + n += vsprintf( buf + t, format, ap ); + + if ((rc = write( fd, buf, n )) != n) + { + globus_gram_job_manager_request_log( request, + "ERROR: only wrote %d bytes to %s '%s': %s\n%s\n", + rc, gk_acct_fd_var, gk_acct_fd, strerror( errno ), buf + t ); + + rc = -1; + } + + return rc; +} +/* globus_gram_job_manager_request_acct() */ diff -urN source-trees/gram/jobmanager/source/globus_gram_job_manager_script.c source-trees/gram/jobmanager/source/globus_gram_job_manager_script.c --- source-trees/gt2-cvs/gram/jobmanager/source/globus_gram_job_manager_script.c Sun Jan 4 00:59:10 2004 +++ source-trees/gt2-cvs/gram/jobmanager/source/globus_gram_job_manager_script.c Sun Jan 4 02:09:39 2004 @@ -299,6 +299,29 @@ "JMI: while return_buf = %s = %s\n", script_variable, script_value); + /* + * We need to log the batch job ID to the accounting file. + */ + + if(strcmp(script_variable, "GRAM_SCRIPT_JOB_ID") == 0) + { + const char * gk_jm_id_var = "GATEKEEPER_JM_ID"; + const char * gk_jm_id = globus_libc_getenv(gk_jm_id_var); + const char * gk_peer = globus_libc_getenv("GATEKEEPER_PEER"); + const char * globus_id = globus_libc_getenv("GLOBUS_ID"); + + globus_gram_job_manager_request_acct( + request, "%s %s for %s on %s\n", gk_jm_id_var, + gk_jm_id ? gk_jm_id : "none", + globus_id ? globus_id : "unknown", + gk_peer ? gk_peer : "unknown"); + + globus_gram_job_manager_request_acct( + request, "%s %s has %s %s manager type %s\n", gk_jm_id_var, + gk_jm_id ? gk_jm_id : "none", + script_variable, script_value, request->jobmanager_type); + } + nbytes -= (p + 1 - ((char *)&script_context->return_buf[0])); if(nbytes > 0) { @@ -1649,6 +1681,29 @@ request->job_id = globus_libc_strdup(value); } } + else if(strcmp(variable, "GRAM_SCRIPT_JOB_ACCT_INFO") == 0) + { + if(value != NULL && strlen(value) > 0) + { + const char *gk_jm_id_var = "GATEKEEPER_JM_ID"; + const char *gk_jm_id = globus_libc_getenv(gk_jm_id_var); + const char *v = value; + char *buf = globus_libc_malloc(strlen(value) + 1); + char *b = buf; + char c; + + while ((*b++ = ((c = *v++) != '\\') ? c : + ((c = *v++) != 'n' ) ? c : '\n')) + { + } + + globus_gram_job_manager_request_acct( + request, "%s %s summary:\n%s\nJMA -- end of summary\n", gk_jm_id_var, + gk_jm_id ? gk_jm_id : "none", buf); + + globus_libc_free(buf); + } + } else if(strcmp(variable, "GRAM_SCRIPT_SCRATCH_DIR") == 0) { request->scratchdir = globus_libc_strdup(value); diff -urN source-trees/gram/jobmanager/source/globus_gram_job_manager_state.c source-trees/gram/jobmanager/source/globus_gram_job_manager_state.c --- source-trees/gt2-cvs/gram/jobmanager/source/globus_gram_job_manager_state.c Sun Jan 4 01:50:46 2004 +++ source-trees/gt2-cvs/gram/jobmanager/source/globus_gram_job_manager_state.c Sun Jan 4 02:09:39 2004 @@ -60,6 +60,11 @@ globus_gram_jobmanager_request_t * request); static +int +globus_l_gram_job_manager_add_cache_info( + globus_gram_jobmanager_request_t * request); + +static void globus_l_gram_job_manager_state_log_rsl( globus_gram_jobmanager_request_t * request, @@ -1560,6 +1386,11 @@ globus_gram_job_manager_request_set_status(request, GLOBUS_GRAM_PROTOCOL_JOB_STATE_FAILED); request->unsent_status_change = GLOBUS_TRUE; } + else + { + globus_l_gram_job_manager_add_cache_info(request); + } + globus_gram_job_manager_reporting_file_create(request); globus_gram_job_manager_history_file_create(request); request->job_history_status = request->status; @@ -2988,3 +2900,75 @@ return rc; } /* globus_l_gram_job_manager_validate_username() */ + +static +int +globus_l_gram_job_manager_add_cache_info( + globus_gram_jobmanager_request_t * request) +{ + char hostname[MAXHOSTNAMELEN]; + char * out_file; + char * fname; + unsigned long timestamp; + FILE * file; + char * gk_id; + int rc; + + globus_libc_gethostname(hostname, sizeof(hostname)); + + out_file = globus_libc_malloc( + strlen("x-gass-cache://%s/%s/cache-info") + + strlen(hostname) + + strlen(request->uniq_id)); + + + sprintf(out_file, + "x-gass-cache://%s/%s/cache-info", + hostname, + request->uniq_id); + + rc = globus_gass_cache_add( + request->cache_handle, + out_file, + request->cache_tag, + GLOBUS_TRUE, + ×tamp, + &fname); + if(rc != GLOBUS_GASS_CACHE_ADD_NEW && + rc != GLOBUS_GASS_CACHE_ADD_EXISTS) + { + globus_gram_job_manager_request_log( + request, + "Adding cache-info to gass cache failed, " + "globus_gram_cache_add() returned %d\n", rc); + return 1; + } + + file = fopen(fname,"w"); + if (file != NULL) + { + gk_id = globus_l_gram_job_manager_getenv("GATEKEEPER_JM_ID","-"); + fprintf(file,"%s\n%s\n%s\n%s\n",request->uniq_id,request->job_id, + request->jobmanager_type,gk_id); + globus_libc_free(gk_id); + fclose(file); + time((time_t *)×tamp); + globus_gass_cache_add_done( + request->cache_handle, + out_file, + request->cache_tag, + timestamp); + } + else + { + globus_gass_cache_delete( + request->cache_handle, + out_file, + request->cache_tag, + timestamp, + GLOBUS_TRUE); + } + + globus_libc_free(out_file); + return 0; +} +/*globus_l_gram_job_manager_add_cache_info()*/ diff -urN source-trees/gram/jobmanager/source/main.c source-trees/gram/jobmanager/source/main.c --- source-trees/gt2-cvs/gram/jobmanager/source/main.c Wed Mar 12 02:51:01 2003 +++ source-trees/gt2-cvs/gram/jobmanager/source/main.c Sun Jan 4 02:09:39 2004 @@ -474,6 +474,16 @@ exit(1); } + { + const char * gk_jm_id_var = "GATEKEEPER_JM_ID"; + const char * gk_jm_id = globus_libc_getenv(gk_jm_id_var); + + globus_gram_job_manager_request_acct( + request, + "%s %s JM exiting\n", + gk_jm_id_var, gk_jm_id ? gk_jm_id : "none"); + } + globus_gram_job_manager_request_log( request, "JM: exiting globus_gram_job_manager.\n");