From 2e117ff6c0e185f533bca10c38427d637e7d0dda Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Tue, 23 Mar 2010 19:12:55 +0000
Subject: [PATCH] added ability for a 0 time period with purging

---
 src/common/slurmdb_defs.c                     |  29 +-
 src/common/slurmdb_pack.c                     |  36 ++-
 .../mysql/as_mysql_archive.c                  | 274 ++++++------------
 .../mysql/as_mysql_rollup.c                   |   8 +
 src/sacctmgr/archive_functions.c              |  21 +-
 src/slurmdbd/read_config.c                    |  44 ++-
 6 files changed, 183 insertions(+), 229 deletions(-)

diff --git a/src/common/slurmdb_defs.c b/src/common/slurmdb_defs.c
index 97aea0b807d..a01066c206b 100644
--- a/src/common/slurmdb_defs.c
+++ b/src/common/slurmdb_defs.c
@@ -1483,31 +1483,32 @@ extern int slurmdb_report_set_start_end_time(time_t *start, time_t *end)
 extern uint32_t slurmdb_parse_purge(char *string)
 {
 	int i = 0;
-	uint32_t purge = 0;
+	uint32_t purge = NO_VAL;
 
 	xassert(string);
 
 	while(string[i]) {
 		if ((string[i] >= '0') && (string[i] <= '9')) {
+			if(purge == NO_VAL)
+				purge = 0;
                         purge = (purge * 10) + (string[i] - '0');
                 } else
 			break;
 		i++;
 	}
 
-	if (purge) {
-		switch(string[i]) {
-		case 'd':
-		case 'D':
-			purge = purge | SLURMDB_PURGE_DAYS;
-		        break;
-		case 'h':
-		case 'H':
-			purge = purge | SLURMDB_PURGE_HOURS;
-		        break;
-		default:
-			purge = purge | SLURMDB_PURGE_MONTHS;
-			break;
+	if (purge != NO_VAL) {
+		int len = strlen(string+i);
+		if(!len || !strncasecmp("months", string+i, MAX(len, 1))) {
+			purge |= SLURMDB_PURGE_MONTHS;
+		} else if(!strncasecmp("hours", string+i, MAX(len, 1))) {
+			purge |= SLURMDB_PURGE_HOURS;
+		} else if(!strncasecmp("days", string+i, MAX(len, 1))) {
+			purge |= SLURMDB_PURGE_DAYS;
+		} else {
+			error("Invalid purge unit '%s', valid options "
+			      "are hours, days, or months", string+i);
+			purge = NO_VAL;
 		}
 	} else
 		error("Invalid purge string '%s'", string);
diff --git a/src/common/slurmdb_pack.c b/src/common/slurmdb_pack.c
index 2c31c70fa56..593b6f39bb7 100644
--- a/src/common/slurmdb_pack.c
+++ b/src/common/slurmdb_pack.c
@@ -3556,10 +3556,10 @@ extern void slurmdb_pack_archive_cond(void *in, uint16_t rpc_version,
 			packnull(buffer);
 			packnull(buffer);
 			slurmdb_pack_job_cond(NULL, rpc_version, buffer);
-			pack32((uint16_t)0, buffer);
-			pack32((uint16_t)0, buffer);
-			pack32((uint16_t)0, buffer);
-			pack32((uint16_t)0, buffer);
+			pack32((uint16_t)NO_VAL, buffer);
+			pack32((uint16_t)NO_VAL, buffer);
+			pack32((uint16_t)NO_VAL, buffer);
+			pack32((uint16_t)NO_VAL, buffer);
 			return;
 		}
 
@@ -3579,19 +3579,23 @@ extern void slurmdb_pack_archive_cond(void *in, uint16_t rpc_version,
 			pack16((uint16_t)0, buffer);
 			pack16((uint16_t)0, buffer);
 			slurmdb_pack_job_cond(NULL, rpc_version, buffer);
-			pack16((uint16_t)0, buffer);
-			pack16((uint16_t)0, buffer);
-			pack16((uint16_t)0, buffer);
-			pack16((uint16_t)0, buffer);
+			pack16((uint16_t)NO_VAL, buffer);
+			pack16((uint16_t)NO_VAL, buffer);
+			pack16((uint16_t)NO_VAL, buffer);
+			pack16((uint16_t)NO_VAL, buffer);
 			return;
 		}
 
 		packstr(object->archive_dir, buffer);
-		pack16(0, buffer);
-		pack16(0, buffer);
+		pack16((uint16_t)SLURMDB_PURGE_ARCHIVE_SET(
+			       object->purge_event) ? 1 : 0, buffer);
+		pack16((uint16_t)SLURMDB_PURGE_ARCHIVE_SET(
+			       object->purge_job) ? 1 : 0, buffer);
 		packstr(object->archive_script, buffer);
-		pack16(0, buffer);
-		pack16(0, buffer);
+		pack16((uint16_t)SLURMDB_PURGE_ARCHIVE_SET(
+			       object->purge_step) ? 1 : 0, buffer);
+		pack16((uint16_t)SLURMDB_PURGE_ARCHIVE_SET(
+			       object->purge_suspend) ? 1 : 0, buffer);
 		slurmdb_pack_job_cond(object->job_cond, rpc_version, buffer);
 		pack16((uint16_t)object->purge_event, buffer);
 		pack16((uint16_t)object->purge_job, buffer);
@@ -3636,30 +3640,30 @@ extern int slurmdb_unpack_archive_cond(void **object, uint16_t rpc_version,
 					   rpc_version, buffer) == SLURM_ERROR)
 			goto unpack_error;
 		safe_unpack16(&tmp16, buffer);
+		object_ptr->purge_event = tmp16;
 		if(tmp16 != (uint16_t)NO_VAL) {
-			object_ptr->purge_event = tmp16;
 			object_ptr->purge_event |= SLURMDB_PURGE_MONTHS;
 			if(a_events)
 				object_ptr->purge_event |=
 					SLURMDB_PURGE_ARCHIVE;
 		}
 		safe_unpack16(&tmp16, buffer);
+		object_ptr->purge_job = tmp16;
 		if(tmp16 != (uint16_t)NO_VAL) {
-			object_ptr->purge_job = tmp16;
 			object_ptr->purge_job |= SLURMDB_PURGE_MONTHS;
 			if(a_jobs)
 				object_ptr->purge_job |= SLURMDB_PURGE_ARCHIVE;
 		}
 		safe_unpack16(&tmp16, buffer);
+		object_ptr->purge_step = tmp16;
 		if(tmp16 != (uint16_t)NO_VAL) {
-			object_ptr->purge_step = tmp16;
 			object_ptr->purge_step |= SLURMDB_PURGE_MONTHS;
 			if(a_steps)
 				object_ptr->purge_step |= SLURMDB_PURGE_ARCHIVE;
 		}
 		safe_unpack16(&tmp16, buffer);
+		object_ptr->purge_suspend = tmp16;
 		if(tmp16 != (uint16_t)NO_VAL) {
-			object_ptr->purge_suspend = tmp16;
 			object_ptr->purge_suspend |= SLURMDB_PURGE_MONTHS;
 			if(a_suspend)
 				object_ptr->purge_suspend |=
diff --git a/src/plugins/accounting_storage/mysql/as_mysql_archive.c b/src/plugins/accounting_storage/mysql/as_mysql_archive.c
index e8a3d6b3a85..f37acb49c0b 100644
--- a/src/plugins/accounting_storage/mysql/as_mysql_archive.c
+++ b/src/plugins/accounting_storage/mysql/as_mysql_archive.c
@@ -542,6 +542,53 @@ static int _unpack_local_suspend(local_suspend_t *object,
 	return SLURM_SUCCESS;
 }
 
+static time_t _setup_end_time(time_t last_submit, uint32_t purge)
+{
+	struct tm time_tm;
+	int16_t units;
+
+	if(purge == NO_VAL) {
+		error("Invalid purge set");
+		return 0;
+	}
+
+	units = SLURMDB_PURGE_GET_UNITS(purge);
+	if(units < 0) {
+		error("invalid units from purge '%d'", units);
+		return 0;
+	}
+
+	/* use localtime to avoid any daylight savings issues */
+	if(!localtime_r(&last_submit, &time_tm)) {
+		error("Couldn't get localtime from first "
+		      "suspend start %d",
+		      last_submit);
+		return 0;
+	}
+
+	time_tm.tm_sec = 0;
+	time_tm.tm_min = 0;
+
+	if(SLURMDB_PURGE_IN_HOURS(purge))
+		time_tm.tm_hour -= units;
+	else if(SLURMDB_PURGE_IN_DAYS(purge)) {
+		time_tm.tm_hour = 0;
+		time_tm.tm_mday -= units;
+	} else if(SLURMDB_PURGE_IN_MONTHS(purge)) {
+		time_tm.tm_hour = 0;
+		time_tm.tm_mday = 1;
+		time_tm.tm_mon -= units;
+	} else {
+		error("No known unit given for purge, "
+		      "we are guessing mistake and returning error");
+		return 0;
+	}
+
+	time_tm.tm_isdst = -1;
+	return (mktime(&time_tm) - 1);
+}
+
+
 static int _process_old_sql_line(const char *data_in, char **data_full_out)
 {
 	int start = 0, i = 0;
@@ -1770,9 +1817,7 @@ static int _archive_script(slurmdb_archive_cond_t *arch_cond,
 	const char *tmpdir;
 	struct stat st;
 	char **env = NULL;
-	struct tm time_tm;
 	time_t curr_end;
-	uint32_t units;
 
 #ifdef _PATH_TMP
 	tmpdir = _PATH_TMP;
@@ -1806,31 +1851,13 @@ static int _archive_script(slurmdb_archive_cond_t *arch_cond,
 	env_array_append_fmt(&env, "SLURM_ARCHIVE_CLUSTER", "%s",
 			     cluster_name);
 
-	if((units = SLURMDB_PURGE_GET_UNITS(arch_cond->purge_event))) {
-		/* use localtime to avoid any daylight savings issues */
-		if(!localtime_r(&last_submit, &time_tm)) {
-			error("Couldn't get localtime from "
-			      "first event start %d",
-			      last_submit);
+	if(arch_cond->purge_event != NO_VAL) {
+		if(!(curr_end = _setup_end_time(
+			     last_submit, arch_cond->purge_event))) {
+			error("Parsing purge events");
 			return SLURM_ERROR;
 		}
 
-		time_tm.tm_sec = 0;
-		time_tm.tm_min = 0;
-
-		if(SLURMDB_PURGE_IN_HOURS(arch_cond->purge_event))
- 			time_tm.tm_hour -= units;
- 		else if(SLURMDB_PURGE_IN_DAYS(arch_cond->purge_event)) {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday -= units;
-		} else {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday = 1;
-			time_tm.tm_mon -= units;
-		}
-
-		time_tm.tm_isdst = -1;
-		curr_end = mktime(&time_tm);
 		env_array_append_fmt(&env, "SLURM_ARCHIVE_EVENTS", "%u",
 				     SLURMDB_PURGE_ARCHIVE_SET(
 					     arch_cond->purge_event));
@@ -1838,31 +1865,13 @@ static int _archive_script(slurmdb_archive_cond_t *arch_cond,
 				     curr_end);
 	}
 
-	if((units = SLURMDB_PURGE_GET_UNITS(arch_cond->purge_job))) {
-		/* use localtime to avoid any daylight savings issues */
-		if(!localtime_r(&last_submit, &time_tm)) {
-			error("Couldn't get localtime from first start %d",
-			      last_submit);
+	if(arch_cond->purge_job != NO_VAL) {
+		if(!(curr_end = _setup_end_time(
+			     last_submit, arch_cond->purge_job))) {
+			error("Parsing purge job");
 			return SLURM_ERROR;
 		}
 
-		time_tm.tm_sec = 0;
-		time_tm.tm_min = 0;
-
- 		if(SLURMDB_PURGE_IN_HOURS(arch_cond->purge_job))
- 			time_tm.tm_hour -= units;
- 		else if(SLURMDB_PURGE_IN_DAYS(arch_cond->purge_job)) {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday -= units;
-		} else {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday = 1;
-			time_tm.tm_mon -= units;
-		}
-
-		time_tm.tm_isdst = -1;
-		curr_end = mktime(&time_tm);
-
 		env_array_append_fmt(&env, "SLURM_ARCHIVE_JOBS", "%u",
 				     SLURMDB_PURGE_ARCHIVE_SET(
 					     arch_cond->purge_job));
@@ -1870,30 +1879,13 @@ static int _archive_script(slurmdb_archive_cond_t *arch_cond,
 				      curr_end);
 	}
 
-	if((units = SLURMDB_PURGE_GET_UNITS(arch_cond->purge_step))) {
-		/* use localtime to avoid any daylight savings issues */
-		if(!localtime_r(&last_submit, &time_tm)) {
-			error("Couldn't get localtime from first step start %d",
-			      last_submit);
+	if(arch_cond->purge_step != NO_VAL) {
+		if(!(curr_end = _setup_end_time(
+			     last_submit, arch_cond->purge_step))) {
+			error("Parsing purge step");
 			return SLURM_ERROR;
 		}
 
-		time_tm.tm_sec = 0;
-		time_tm.tm_min = 0;
-
- 		if(SLURMDB_PURGE_IN_HOURS(arch_cond->purge_step))
- 			time_tm.tm_hour -= units;
- 		else if(SLURMDB_PURGE_IN_DAYS(arch_cond->purge_step)) {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday -= units;
-		} else {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday = 1;
-			time_tm.tm_mon -= units;
-		}
-
-		time_tm.tm_isdst = -1;
-		curr_end = mktime(&time_tm);
 		env_array_append_fmt(&env, "SLURM_ARCHIVE_STEPS", "%u",
 				     SLURMDB_PURGE_ARCHIVE_SET(
 					     arch_cond->purge_step));
@@ -1901,31 +1893,13 @@ static int _archive_script(slurmdb_archive_cond_t *arch_cond,
 				     curr_end);
 	}
 
-	if((units = SLURMDB_PURGE_GET_UNITS(arch_cond->purge_suspend))) {
-		/* use localtime to avoid any daylight savings issues */
-		if(!localtime_r(&last_submit, &time_tm)) {
-			error("Couldn't get localtime from first "
-			      "suspend start %d",
-			      last_submit);
+	if(arch_cond->purge_suspend != NO_VAL) {
+		if(!(curr_end = _setup_end_time(
+			     last_submit, arch_cond->purge_suspend))) {
+			error("Parsing purge suspend");
 			return SLURM_ERROR;
 		}
 
-		time_tm.tm_sec = 0;
-		time_tm.tm_min = 0;
-
- 		if(SLURMDB_PURGE_IN_HOURS(arch_cond->purge_suspend))
- 			time_tm.tm_hour -= units;
- 		else if(SLURMDB_PURGE_IN_DAYS(arch_cond->purge_suspend)) {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday -= units;
-		} else {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday = 1;
-			time_tm.tm_mon -= units;
-		}
-
-		time_tm.tm_isdst = -1;
-		curr_end = mktime(&time_tm);
 		env_array_append_fmt(&env, "SLURM_ARCHIVE_SUSPEND", "%u",
 				     SLURMDB_PURGE_ARCHIVE_SET(
 					     arch_cond->purge_suspend));
@@ -1952,8 +1926,6 @@ static int _execute_archive(mysql_conn_t *mysql_conn,
 	int rc = SLURM_SUCCESS;
 	char *query = NULL;
 	time_t curr_end;
-	struct tm time_tm;
-	uint32_t units;
 	time_t last_submit = time(NULL);
 
 	if(arch_cond->archive_script)
@@ -1963,36 +1935,18 @@ static int _execute_archive(mysql_conn_t *mysql_conn,
 		return SLURM_ERROR;
 	}
 
-	if((units = SLURMDB_PURGE_GET_UNITS(arch_cond->purge_event))) {
+	if(arch_cond->purge_event != NO_VAL) {
 		/* remove all data from event table that was older than
 		 * period_start * arch_cond->purge_event.
 		 */
-		/* use localtime to avoid any daylight savings issues */
-		if(!localtime_r(&last_submit, &time_tm)) {
-			error("Couldn't get localtime from first submit %d",
-			      last_submit);
+		if(!(curr_end = _setup_end_time(
+			     last_submit, arch_cond->purge_event))) {
+			error("Parsing purge event");
 			return SLURM_ERROR;
 		}
-		time_tm.tm_sec = 0;
-		time_tm.tm_min = 0;
-
-		if(SLURMDB_PURGE_IN_HOURS(arch_cond->purge_event))
- 			time_tm.tm_hour -= units;
- 		else if(SLURMDB_PURGE_IN_DAYS(arch_cond->purge_event)) {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday -= units;
-		} else {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday = 1;
-			time_tm.tm_mon -= units;
-		}
 
-		time_tm.tm_isdst = -1;
-		curr_end = mktime(&time_tm);
-		curr_end--;
-
-		debug4("from %d - %d days/months purging events from before %d",
-		       last_submit, arch_cond->purge_event, curr_end);
+		debug4("Purging event entries before %d for %s",
+		       curr_end, cluster_name);
 
 		if(SLURMDB_PURGE_ARCHIVE_SET(arch_cond->purge_event)) {
 			rc = _archive_events(mysql_conn, cluster_name,
@@ -2018,36 +1972,18 @@ static int _execute_archive(mysql_conn_t *mysql_conn,
 
 exit_events:
 
-	if((units = SLURMDB_PURGE_GET_UNITS(arch_cond->purge_suspend))) {
+	if(arch_cond->purge_suspend != NO_VAL) {
 		/* remove all data from suspend table that was older than
 		 * period_start * arch_cond->purge_suspend.
 		 */
-		/* use localtime to avoid any daylight savings issues */
-		if(!localtime_r(&last_submit, &time_tm)) {
-			error("Couldn't get localtime from first submit %d",
-			      last_submit);
+		if(!(curr_end = _setup_end_time(
+			     last_submit, arch_cond->purge_suspend))) {
+			error("Parsing purge suspend");
 			return SLURM_ERROR;
 		}
-		time_tm.tm_sec = 0;
-		time_tm.tm_min = 0;
-
- 		if(SLURMDB_PURGE_IN_HOURS(arch_cond->purge_suspend))
- 			time_tm.tm_hour -= units;
- 		else if(SLURMDB_PURGE_IN_DAYS(arch_cond->purge_suspend)) {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday -= units;
-		} else {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday = 1;
-			time_tm.tm_mon -= units;
-		}
 
-		time_tm.tm_isdst = -1;
-		curr_end = mktime(&time_tm);
-		curr_end--;
-
-		debug4("from %d - %d months purging suspend from before %d",
-		       last_submit, arch_cond->purge_suspend, curr_end);
+		debug4("Purging suspend entries before %d for %s",
+		       curr_end, cluster_name);
 
 		if(SLURMDB_PURGE_ARCHIVE_SET(arch_cond->purge_suspend)) {
 			rc = _archive_suspend(mysql_conn, cluster_name,
@@ -2073,36 +2009,18 @@ exit_events:
 
 exit_suspend:
 
-	if((units = SLURMDB_PURGE_GET_UNITS(arch_cond->purge_step))) {
+	if(arch_cond->purge_step != NO_VAL) {
 		/* remove all data from step table that was older than
 		 * start * arch_cond->purge_step.
 		 */
-		/* use localtime to avoid any daylight savings issues */
-		if(!localtime_r(&last_submit, &time_tm)) {
-			error("Couldn't get localtime from first start %d",
-			      last_submit);
+		if(!(curr_end = _setup_end_time(
+			     last_submit, arch_cond->purge_step))) {
+			error("Parsing purge step");
 			return SLURM_ERROR;
 		}
-		time_tm.tm_sec = 0;
-		time_tm.tm_min = 0;
-
-		if(SLURMDB_PURGE_IN_HOURS(arch_cond->purge_step))
- 			time_tm.tm_hour -= units;
- 		else if(SLURMDB_PURGE_IN_DAYS(arch_cond->purge_step)) {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday -= units;
-		} else {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday = 1;
-			time_tm.tm_mon -= units;
-		}
-
-		time_tm.tm_isdst = -1;
-		curr_end = mktime(&time_tm);
-		curr_end--;
 
-		debug4("from %d - %d months purging steps from before %d",
-		       last_submit, arch_cond->purge_step, curr_end);
+		debug4("Purging step entries before %d for %s",
+		       curr_end, cluster_name);
 
 		if(SLURMDB_PURGE_ARCHIVE_SET(arch_cond->purge_step)) {
 			rc = _archive_steps(mysql_conn, cluster_name,
@@ -2128,36 +2046,18 @@ exit_suspend:
 	}
 exit_steps:
 
-	if((units = SLURMDB_PURGE_GET_UNITS(arch_cond->purge_job))) {
+	if(arch_cond->purge_job != NO_VAL) {
 		/* remove all data from job table that was older than
 		 * last_submit * arch_cond->purge_job.
 		 */
-		/* use localtime to avoid any daylight savings issues */
-		if(!localtime_r(&last_submit, &time_tm)) {
-			error("Couldn't get localtime from first submit %d",
-			      last_submit);
+		if(!(curr_end = _setup_end_time(
+			     last_submit, arch_cond->purge_job))) {
+			error("Parsing purge job");
 			return SLURM_ERROR;
 		}
-		time_tm.tm_sec = 0;
-		time_tm.tm_min = 0;
-
-		if(SLURMDB_PURGE_IN_HOURS(arch_cond->purge_job))
- 			time_tm.tm_hour -= units;
- 		else if(SLURMDB_PURGE_IN_DAYS(arch_cond->purge_job)) {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday -= units;
-		} else {
-			time_tm.tm_hour = 0;
-			time_tm.tm_mday = 1;
-			time_tm.tm_mon -= units;
-		}
-
- 		time_tm.tm_isdst = -1;
-		curr_end = mktime(&time_tm);
-		curr_end--;
 
-		debug4("from %d - %d months purging jobs from before %d",
-		       last_submit, arch_cond->purge_job, curr_end);
+		debug4("Purging job entires before %d for %s",
+		       curr_end, cluster_name);
 
 		if(SLURMDB_PURGE_ARCHIVE_SET(arch_cond->purge_job)) {
 			rc = _archive_jobs(mysql_conn, cluster_name,
diff --git a/src/plugins/accounting_storage/mysql/as_mysql_rollup.c b/src/plugins/accounting_storage/mysql/as_mysql_rollup.c
index 1fef43f675d..625ccebefab 100644
--- a/src/plugins/accounting_storage/mysql/as_mysql_rollup.c
+++ b/src/plugins/accounting_storage/mysql/as_mysql_rollup.c
@@ -121,12 +121,20 @@ static int _process_purge(mysql_conn_t *mysql_conn,
 
 	if(purge_period & slurmdbd_conf->purge_event)
 		arch_cond.purge_event = slurmdbd_conf->purge_event;
+	else
+		arch_cond.purge_event = NO_VAL;
 	if(purge_period & slurmdbd_conf->purge_job)
 		arch_cond.purge_job = slurmdbd_conf->purge_job;
+	else
+		arch_cond.purge_job = NO_VAL;
 	if(purge_period & slurmdbd_conf->purge_step)
 		arch_cond.purge_step = slurmdbd_conf->purge_step;
+	else
+		arch_cond.purge_step = NO_VAL;
 	if(purge_period & slurmdbd_conf->purge_suspend)
 		arch_cond.purge_suspend = slurmdbd_conf->purge_suspend;
+	else
+		arch_cond.purge_suspend = NO_VAL;
 
 	job_cond.cluster_list = list_create(NULL);
 	list_append(job_cond.cluster_list, cluster_name);
diff --git a/src/sacctmgr/archive_functions.c b/src/sacctmgr/archive_functions.c
index 082a1b9cae6..6b6c0a6615e 100644
--- a/src/sacctmgr/archive_functions.c
+++ b/src/sacctmgr/archive_functions.c
@@ -275,7 +275,8 @@ static int _set_cond(int *start, int argc, char *argv[],
 			set = 1;
 		} else if (!strncasecmp (argv[i], "PurgeEventAfter",
 					 MAX(command_len, 10))) {
-			if (!(tmp = slurmdb_parse_purge(argv[i]+end))) {
+			if ((tmp = slurmdb_parse_purge(argv[i]+end))
+			    == NO_VAL) {
 				exit_code = 1;
 			} else {
 				arch_cond->purge_event |= tmp;
@@ -283,7 +284,8 @@ static int _set_cond(int *start, int argc, char *argv[],
 			}
 		} else if (!strncasecmp (argv[i], "PurgeJobAfter",
 					 MAX(command_len, 10))) {
-			if (!(tmp = slurmdb_parse_purge(argv[i]+end))) {
+			if ((tmp = slurmdb_parse_purge(argv[i]+end))
+			    == NO_VAL) {
 				exit_code = 1;
 			} else {
 				arch_cond->purge_job |= tmp;
@@ -291,7 +293,8 @@ static int _set_cond(int *start, int argc, char *argv[],
 			}
 		} else if (!strncasecmp (argv[i], "PurgeStepAfter",
 					 MAX(command_len, 10))) {
-			if (!(tmp = slurmdb_parse_purge(argv[i]+end))) {
+			if ((tmp = slurmdb_parse_purge(argv[i]+end))
+			    == NO_VAL) {
 				exit_code = 1;
 			} else {
 				arch_cond->purge_step |= tmp;
@@ -299,7 +302,8 @@ static int _set_cond(int *start, int argc, char *argv[],
 			}
 		} else if (!strncasecmp (argv[i], "PurgeSuspendAfter",
 					 MAX(command_len, 10))) {
-			if (!(tmp = slurmdb_parse_purge(argv[i]+end))) {
+			if ((tmp = slurmdb_parse_purge(argv[i]+end))
+			    == NO_VAL) {
 				exit_code = 1;
 			} else {
 				arch_cond->purge_suspend |= tmp;
@@ -390,6 +394,15 @@ extern int sacctmgr_archive_dump(int argc, char *argv[])
 		_set_cond(&i, argc, argv, arch_cond);
 	}
 
+	if(!arch_cond->purge_event)
+		arch_cond->purge_event = NO_VAL;
+	if(!arch_cond->purge_job)
+		arch_cond->purge_job = NO_VAL;
+	if(!arch_cond->purge_step)
+		arch_cond->purge_step = NO_VAL;
+	if(!arch_cond->purge_suspend)
+		arch_cond->purge_suspend = NO_VAL;
+
 	if(exit_code) {
 		slurmdb_destroy_archive_cond(arch_cond);
 		return SLURM_ERROR;
diff --git a/src/slurmdbd/read_config.c b/src/slurmdbd/read_config.c
index a88b3d08fac..31042683de9 100644
--- a/src/slurmdbd/read_config.c
+++ b/src/slurmdbd/read_config.c
@@ -455,28 +455,28 @@ extern void log_config(void)
 
 	debug2("PrivateData       = %s", tmp_str);
 
-	if(slurmdbd_conf->purge_event)
+	if(slurmdbd_conf->purge_event != NO_VAL)
 		slurmdb_purge_string(slurmdbd_conf->purge_event,
 				    tmp_str, sizeof(tmp_str), 1);
 	else
 		sprintf(tmp_str, "NONE");
 	debug2("PurgeEventAfter   = %s", tmp_str);
 
-	if(slurmdbd_conf->purge_job)
+	if(slurmdbd_conf->purge_job != NO_VAL)
 		slurmdb_purge_string(slurmdbd_conf->purge_job,
 				    tmp_str, sizeof(tmp_str), 1);
 	else
 		sprintf(tmp_str, "NONE");
 	debug2("PurgeJobAfter     = %s", tmp_str);
 
-	if(slurmdbd_conf->purge_step)
+	if(slurmdbd_conf->purge_step != NO_VAL)
 		slurmdb_purge_string(slurmdbd_conf->purge_step,
 				    tmp_str, sizeof(tmp_str), 1);
 	else
 		sprintf(tmp_str, "NONE");
 	debug2("PurgeStepAfter    = %s", tmp_str);
 
-	if(slurmdbd_conf->purge_suspend)
+	if(slurmdbd_conf->purge_suspend != NO_VAL)
 		slurmdb_purge_string(slurmdbd_conf->purge_suspend,
 				    tmp_str, sizeof(tmp_str), 1);
 	else
@@ -559,11 +559,39 @@ extern List dump_config(void)
 	key_pair->value = xstrdup(slurmdbd_conf->archive_dir);
 	list_append(my_list, key_pair);
 
+	key_pair = xmalloc(sizeof(config_key_pair_t));
+	key_pair->name = xstrdup("ArchiveEvents");
+	key_pair->value = xmalloc(16);
+	snprintf(key_pair->value, 16, "%u",
+		 SLURMDB_PURGE_ARCHIVE_SET(slurmdbd_conf->purge_event) ? 1 : 0);
+	list_append(my_list, key_pair);
+
+	key_pair = xmalloc(sizeof(config_key_pair_t));
+	key_pair->name = xstrdup("ArchiveJobs");
+	key_pair->value = xmalloc(16);
+	snprintf(key_pair->value, 16, "%u",
+		 SLURMDB_PURGE_ARCHIVE_SET(slurmdbd_conf->purge_job) ? 1 : 0);
+	list_append(my_list, key_pair);
+
 	key_pair = xmalloc(sizeof(config_key_pair_t));
 	key_pair->name = xstrdup("ArchiveScript");
 	key_pair->value = xstrdup(slurmdbd_conf->archive_script);
 	list_append(my_list, key_pair);
 
+	key_pair = xmalloc(sizeof(config_key_pair_t));
+	key_pair->name = xstrdup("ArchiveSteps");
+	key_pair->value = xmalloc(16);
+	snprintf(key_pair->value, 16, "%u",
+		 SLURMDB_PURGE_ARCHIVE_SET(slurmdbd_conf->purge_step) ? 1 : 0);
+	list_append(my_list, key_pair);
+
+	key_pair = xmalloc(sizeof(config_key_pair_t));
+	key_pair->name = xstrdup("ArchiveSupend");
+	key_pair->value = xmalloc(16);
+	snprintf(key_pair->value, 16, "%u", SLURMDB_PURGE_ARCHIVE_SET(
+			 slurmdbd_conf->purge_suspend) ? 1 : 0);
+	list_append(my_list, key_pair);
+
 	key_pair = xmalloc(sizeof(config_key_pair_t));
 	key_pair->name = xstrdup("AuthInfo");
 	key_pair->value = xstrdup(slurmdbd_conf->auth_info);
@@ -642,7 +670,7 @@ extern List dump_config(void)
 
 	key_pair = xmalloc(sizeof(config_key_pair_t));
 	key_pair->name = xstrdup("PurgeEventAfter");
-	if(slurmdbd_conf->purge_event) {
+	if(slurmdbd_conf->purge_event != NO_VAL) {
 		key_pair->value = xmalloc(32);
 		slurmdb_purge_string(slurmdbd_conf->purge_event,
 				     key_pair->value, 32, 1);
@@ -652,7 +680,7 @@ extern List dump_config(void)
 
 	key_pair = xmalloc(sizeof(config_key_pair_t));
 	key_pair->name = xstrdup("PurgeJobAfter");
-	if(slurmdbd_conf->purge_job) {
+	if(slurmdbd_conf->purge_job != NO_VAL) {
 		key_pair->value = xmalloc(32);
 		slurmdb_purge_string(slurmdbd_conf->purge_job,
 				     key_pair->value, 32, 1);
@@ -662,7 +690,7 @@ extern List dump_config(void)
 
 	key_pair = xmalloc(sizeof(config_key_pair_t));
 	key_pair->name = xstrdup("PurgeStepAfter");
-	if(slurmdbd_conf->purge_step) {
+	if(slurmdbd_conf->purge_step != NO_VAL) {
 		key_pair->value = xmalloc(32);
 		slurmdb_purge_string(slurmdbd_conf->purge_step,
 				     key_pair->value, 32, 1);
@@ -672,7 +700,7 @@ extern List dump_config(void)
 
 	key_pair = xmalloc(sizeof(config_key_pair_t));
 	key_pair->name = xstrdup("PurgeSuspendAfter");
-	if(slurmdbd_conf->purge_suspend) {
+	if(slurmdbd_conf->purge_suspend != NO_VAL) {
 		key_pair->value = xmalloc(32);
 		slurmdb_purge_string(slurmdbd_conf->purge_suspend,
 				     key_pair->value, 32, 1);
-- 
GitLab