/* * roll up data in the storage * IN: sent_start (option time to do a re-roll or start from this point) * IN: sent_end (option time to do a re-roll or end at this point) * IN: archive_data (if 0 old data is not archived in a monthly rollup) * RET: SLURM_SUCCESS on success SLURM_ERROR else */ extern int slurmdb_usage_roll(void *db_conn, time_t sent_start, time_t sent_end, uint16_t archive_data) { return acct_storage_g_roll_usage(db_conn, sent_start, sent_end, archive_data); }
/* _rollup_handler - Process rollup duties */ static void *_rollup_handler(void *db_conn) { time_t start_time = time(NULL); time_t next_time; /* int sigarray[] = {SIGUSR1, 0}; */ struct tm tm; (void) pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); (void) pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); if (!localtime_r(&start_time, &tm)) { fatal("Couldn't get localtime for rollup handler %ld", (long)start_time); return NULL; } while (1) { if (!db_conn) break; /* run the roll up */ slurm_mutex_lock(&rollup_lock); running_rollup = 1; debug2("running rollup at %s", slurm_ctime(&start_time)); acct_storage_g_roll_usage(db_conn, 0, 0, 1); acct_storage_g_commit(db_conn, 1); running_rollup = 0; slurm_mutex_unlock(&rollup_lock); /* sleep for an hour */ tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour++; tm.tm_isdst = -1; next_time = mktime(&tm); /* get the time now we have rolled usage */ start_time = time(NULL); sleep((next_time-start_time)); start_time = time(NULL); if (!localtime_r(&start_time, &tm)) { fatal("Couldn't get localtime for rollup handler %ld", (long)start_time); return NULL; } /* Just in case some new uids were added to the system pick them up here. */ assoc_mgr_set_missing_uids(); /* repeat ;) */ } return NULL; }
/* * _process_command - process the user's command * IN argc - count of arguments * IN argv - the arguments * RET 0 or errno (only for errors fatal to sacctmgr) */ static int _process_command (int argc, char **argv) { int command_len = 0, rc; if (argc < 1) { exit_code = 1; if (quiet_flag == -1) fprintf(stderr, "no input"); return 0; } command_len = strlen(argv[0]); if (strncasecmp (argv[0], "associations", MAX(command_len, 3)) == 0) { with_assoc_flag = 1; } else if (strncasecmp (argv[0], "dump", MAX(command_len, 3)) == 0) { sacctmgr_dump_cluster((argc - 1), &argv[1]); } else if (strncasecmp (argv[0], "help", MAX(command_len, 2)) == 0) { if (argc > 1) { exit_code = 1; fprintf (stderr, "too many arguments for keyword:%s\n", argv[0]); } _usage (); } else if (strncasecmp (argv[0], "load", MAX(command_len, 2)) == 0) { load_sacctmgr_cfg_file((argc - 1), &argv[1]); } else if (strncasecmp (argv[0], "oneliner", MAX(command_len, 1)) == 0) { if (argc > 1) { exit_code = 1; fprintf (stderr, "too many arguments for keyword:%s\n", argv[0]); } one_liner = 1; } else if (strncasecmp (argv[0], "quiet", MAX(command_len, 4)) == 0) { if (argc > 1) { exit_code = 1; fprintf (stderr, "too many arguments for keyword:%s\n", argv[0]); } quiet_flag = 1; } else if ((strncasecmp (argv[0], "exit", MAX(command_len, 4)) == 0) || (strncasecmp (argv[0], "\\q", MAX(command_len, 2)) == 0) || (strncasecmp (argv[0], "quit", MAX(command_len, 4)) == 0)) { if (argc > 1) { exit_code = 1; fprintf (stderr, "too many arguments for keyword:%s\n", argv[0]); } exit_flag = 1; } else if ((strncasecmp (argv[0], "add", MAX(command_len, 3)) == 0) || (strncasecmp (argv[0], "create", MAX(command_len, 3)) == 0)) { _add_it((argc - 1), &argv[1]); } else if ((strncasecmp (argv[0], "archive", MAX(command_len, 3)) == 0)) { _archive_it((argc - 1), &argv[1]); } else if (strncasecmp (argv[0], "clear", MAX(command_len, 3)) == 0) { _clear_it((argc - 1), &argv[1]); } else if ((strncasecmp (argv[0], "show", MAX(command_len, 3)) == 0) || (strncasecmp (argv[0], "list", MAX(command_len, 3)) == 0)) { _show_it((argc - 1), &argv[1]); } else if (!strncasecmp (argv[0], "modify", MAX(command_len, 1)) || !strncasecmp (argv[0], "update", MAX(command_len, 1))) { _modify_it((argc - 1), &argv[1]); } else if ((strncasecmp (argv[0], "delete", MAX(command_len, 3)) == 0) || (strncasecmp (argv[0], "remove", MAX(command_len, 3)) == 0)) { _delete_it((argc - 1), &argv[1]); } else if (strncasecmp (argv[0], "verbose", MAX(command_len, 4)) == 0) { if (argc > 1) { exit_code = 1; fprintf (stderr, "too many arguments for %s keyword\n", argv[0]); } quiet_flag = -1; } else if (strncasecmp (argv[0], "readonly", MAX(command_len, 4)) == 0) { if (argc > 1) { exit_code = 1; fprintf (stderr, "too many arguments for %s keyword\n", argv[0]); } readonly_flag = 1; } else if (strncasecmp (argv[0], "reconfigure", MAX(command_len, 4)) == 0) { if (argc > 1) { exit_code = 1; fprintf (stderr, "too many arguments for %s keyword\n", argv[0]); } slurmdb_reconfig(db_conn); } else if (strncasecmp (argv[0], "rollup", MAX(command_len, 2)) == 0) { time_t my_start = 0; time_t my_end = 0; uint16_t archive_data = 0; if (argc > 4) { exit_code = 1; fprintf (stderr, "too many arguments for %s keyword\n", argv[0]); } if (argc > 1) my_start = parse_time(argv[1], 1); if (argc > 2) my_end = parse_time(argv[2], 1); if (argc > 3) archive_data = atoi(argv[3]); if (acct_storage_g_roll_usage(db_conn, my_start, my_end, archive_data, NULL) == SLURM_SUCCESS) { if (commit_check("Would you like to commit rollup?")) { acct_storage_g_commit(db_conn, 1); } else { printf(" Rollup Discarded\n"); acct_storage_g_commit(db_conn, 0); } } } else if (strncasecmp (argv[0], "shutdown", MAX(command_len, 4)) == 0) { if (argc > 1) { exit_code = 1; fprintf (stderr, "too many arguments for %s keyword\n", argv[0]); } rc = slurmdb_shutdown(db_conn); if (rc != SLURM_SUCCESS) { fprintf(stderr, " Problem shutting down server: %s\n", slurm_strerror(rc)); exit_code = 1; } } else if (strncasecmp (argv[0], "version", MAX(command_len, 4)) == 0) { if (argc > 1) { exit_code = 1; fprintf (stderr, "too many arguments for %s keyword\n", argv[0]); } _print_version(); } else { exit_code = 1; fprintf (stderr, "invalid keyword: %s\n", argv[0]); } return 0; }
/* _rollup_handler - Process rollup duties */ static void *_rollup_handler(void *db_conn) { time_t start_time = time(NULL); time_t next_time; /* int sigarray[] = {SIGUSR1, 0}; */ struct tm tm; rollup_stats_t rollup_stats; int i; (void) pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); (void) pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); if (!slurm_localtime_r(&start_time, &tm)) { fatal("Couldn't get localtime for rollup handler %ld", (long)start_time); return NULL; } while (1) { if (!db_conn) break; /* run the roll up */ memset(&rollup_stats, 0, sizeof(rollup_stats_t)); slurm_mutex_lock(&rollup_lock); running_rollup = 1; debug2("running rollup at %s", slurm_ctime2(&start_time)); acct_storage_g_roll_usage(db_conn, 0, 0, 1, &rollup_stats); acct_storage_g_commit(db_conn, 1); running_rollup = 0; slurm_mutex_unlock(&rollup_lock); slurm_mutex_lock(&rpc_mutex); for (i = 0; i < ROLLUP_COUNT; i++) { if (rollup_stats.rollup_time[i] == 0) continue; rpc_stats.rollup_count[i]++; rpc_stats.rollup_time[i] += rollup_stats.rollup_time[i]; rpc_stats.rollup_max_time[i] = MAX(rpc_stats.rollup_max_time[i], rollup_stats.rollup_time[i]); } slurm_mutex_unlock(&rpc_mutex); /* get the time now we have rolled usage */ start_time = time(NULL); if (!slurm_localtime_r(&start_time, &tm)) { fatal("Couldn't get localtime for rollup handler %ld", (long)start_time); return NULL; } /* sleep until the next hour */ tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour++; tm.tm_isdst = -1; next_time = slurm_mktime(&tm); sleep((next_time - start_time)); start_time = next_time; /* Just in case some new uids were added to the system pick them up here. */ assoc_mgr_set_missing_uids(); /* repeat ;) */ } return NULL; }