diff --git a/NEWS b/NEWS index a3012249c4c4fb1550f5cbc1e4139d81d804be2a..b90e5c199a89e360ee27551983f76021bdb1962a 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,9 @@ documents those changes that are of interest to users and admins. -- Added sbatch '--parsable' option to output only the job id number and the cluster name separated by a semicolon. Errors will still be displayed. -- Added failure management "slurmctld/nonstop" plugin. + -- Remove the SLURM_PMI_KVS_NO_DUP_KEYS functionality from PMI support, + the PMI protocol does not accept duplicate keys. If there already + is an entry with the same key, the old value is replaced. * Changes in Slurm 14.03.0pre6 ============================== diff --git a/doc/man/man1/srun.1 b/doc/man/man1/srun.1 index d3ef73326485f4f387f7448e36728af78a37b081..72644e1598779473525de4072699e0d074ebc851 100644 --- a/doc/man/man1/srun.1 +++ b/doc/man/man1/srun.1 @@ -2039,11 +2039,6 @@ Same as \fB\-O, \-\-overcommit\fR \fBSLURM_PARTITION\fR Same as \fB\-p, \-\-partition\fR .TP -\fBSLURM_PMI_KVS_NO_DUP_KEYS\fR -If set, then PMI key\-pairs will contain no duplicate keys. -This is the case for MPICH2 and reduces overhead in testing for duplicates -for improved performance -.TP \fBSLURM_PROFILE\fR Same as \fB\-\-profile\fR .TP diff --git a/src/api/pmi.c b/src/api/pmi.c index 27cca1c836c154bdca70842df194eda8735e0c76..2af8451c54a75deeebdd924423e86e69f13a2275 100644 --- a/src/api/pmi.c +++ b/src/api/pmi.c @@ -149,7 +149,6 @@ int pmi_size; int pmi_spawned; int pmi_rank; int pmi_debug; -static int pmi_kvs_no_dup_keys = 0; static pthread_mutex_t kvs_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -196,12 +195,6 @@ int PMI_Init( int *spawned ) if (pmi_debug) fprintf(stderr, "In: PMI_Init\n"); - env = getenv("SLURM_PMI_KVS_NO_DUP_KEYS"); - if (env) - pmi_kvs_no_dup_keys = 1; - else - pmi_kvs_no_dup_keys = 0; - if (spawned == NULL) return PMI_ERR_INVALID_ARG; @@ -1121,10 +1114,6 @@ static int _kvs_put( const char kvsname[], const char key[], const char value[], for (i=0; i<kvs_rec_cnt; i++) { if (strncmp(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN)) continue; - if (pmi_kvs_no_dup_keys) { - j = kvs_recs[i].kvs_cnt; - goto no_dup; - } /* search for duplicate key */ for (j=0; j<kvs_recs[i].kvs_cnt; j++) { if (strncmp(kvs_recs[i].kvs_keys[j], key, @@ -1147,7 +1136,7 @@ static int _kvs_put( const char kvsname[], const char key[], const char value[], } goto fini; } -no_dup: + /* create new key */ kvs_recs[i].kvs_cnt++; kvs_recs[i].kvs_key_states = realloc(kvs_recs[i].kvs_key_states, @@ -1753,7 +1742,7 @@ int PMI_Args_to_keyval(int *argcp, char *((*argvp)[]), PMI_keyval_t **keyvalp, if (pmi_debug) fprintf(stderr, "In: PMI_Args_to_keyval \n"); - if ((keyvalp == NULL) || (size == NULL) || + if ((keyvalp == NULL) || (size == NULL) || (argcp == NULL) || (argvp == NULL)) return PMI_ERR_INVALID_ARG; diff --git a/src/api/pmi_server.c b/src/api/pmi_server.c index d135ad91c278f3667b4f27cd9e2818ce0e83ee3f..73f66172193c49369a0eea876862d8b0f25145ab 100644 --- a/src/api/pmi_server.c +++ b/src/api/pmi_server.c @@ -58,8 +58,6 @@ static int min_time_kvs_put = 1000000; static int max_time_kvs_put = 0; static int tot_time_kvs_put = 0; -static int pmi_kvs_no_dup_keys = 0; - struct barrier_resp { uint16_t port; char *hostname; @@ -315,8 +313,8 @@ struct kvs_comm **_kvs_comm_dup(void) rc_kvs[i]->kvs_values = xmalloc(sizeof(char *) * rc_kvs[i]->kvs_cnt); if (kvs_comm_ptr[i]->kvs_key_sent == NULL) { - kvs_comm_ptr[i]->kvs_key_sent = - xmalloc(sizeof(uint16_t) * + kvs_comm_ptr[i]->kvs_key_sent = + xmalloc(sizeof(uint16_t) * kvs_comm_ptr[i]->kvs_cnt); } cnt = 0; @@ -354,8 +352,6 @@ static void _merge_named_kvs(struct kvs_comm *kvs_orig, int i, j; for (i=0; i<kvs_new->kvs_cnt; i++) { - if (pmi_kvs_no_dup_keys) - goto no_dup; for (j=0; j<kvs_orig->kvs_cnt; j++) { if (strcmp(kvs_new->kvs_keys[i], kvs_orig->kvs_keys[j])) continue; @@ -368,7 +364,6 @@ static void _merge_named_kvs(struct kvs_comm *kvs_orig, } if (j < kvs_orig->kvs_cnt) continue; /* already recorded, update */ -no_dup: /* append it */ kvs_orig->kvs_cnt++; xrealloc(kvs_orig->kvs_keys, @@ -383,7 +378,7 @@ no_dup: } if (kvs_orig->kvs_key_sent) { xrealloc(kvs_orig->kvs_key_sent, - (sizeof(uint16_t) * kvs_orig->kvs_cnt)); + (sizeof(uint16_t) * kvs_orig->kvs_cnt)); } } @@ -415,17 +410,8 @@ extern int pmi_kvs_put(struct kvs_comm_set *kvs_set_ptr) { int i, usec_timer; struct kvs_comm *kvs_ptr; - static int pmi_kvs_no_dup_keys_set = 0; DEF_TIMERS; - if (pmi_kvs_no_dup_keys_set == 0) { - char *env = getenv("SLURM_PMI_KVS_NO_DUP_KEYS"); - if (env) - pmi_kvs_no_dup_keys = 1; - else - pmi_kvs_no_dup_keys = 0; - pmi_kvs_no_dup_keys_set = 1; - } /* Merge new data with old. * NOTE: We just move pointers rather than copy data where * possible for improved performance */ diff --git a/src/plugins/mpi/pmi2/kvs.c b/src/plugins/mpi/pmi2/kvs.c index c7d4e426c959b0edf6ce1956f7d94c3807e53168..f87dcacda7eea86074bec7f12fe09cdc9eb79a36 100644 --- a/src/plugins/mpi/pmi2/kvs.c +++ b/src/plugins/mpi/pmi2/kvs.c @@ -66,8 +66,6 @@ static char *temp_kvs_buf = NULL; static int temp_kvs_cnt = 0; static int temp_kvs_size = 0; -static int no_dup_keys = 0; - #define TASKS_PER_BUCKET 8 #define TEMP_KVS_SIZE_INC 2048 @@ -234,9 +232,6 @@ kvs_init(void) kvs_hash = xmalloc(hash_size * sizeof(kvs_bucket_t)); - if (getenv(PMI2_KVS_NO_DUP_KEYS_ENV)) - no_dup_keys = 1; - return SLURM_SUCCESS; } @@ -277,17 +272,16 @@ kvs_put(char *key, char *val) bucket = &kvs_hash[HASH(key)]; - if (! no_dup_keys) { - for (i = 0; i < bucket->count; i ++) { - if (! strcmp(key, bucket->pairs[KEY_INDEX(i)])) { - /* replace the k-v pair */ - xfree(bucket->pairs[VAL_INDEX(i)]); - bucket->pairs[VAL_INDEX(i)] = xstrdup(val); - debug("mpi/pmi2: put kvs %s=%s", key, val); - return SLURM_SUCCESS; - } + for (i = 0; i < bucket->count; i ++) { + if (! strcmp(key, bucket->pairs[KEY_INDEX(i)])) { + /* replace the k-v pair */ + xfree(bucket->pairs[VAL_INDEX(i)]); + bucket->pairs[VAL_INDEX(i)] = xstrdup(val); + debug("mpi/pmi2: put kvs %s=%s", key, val); + return SLURM_SUCCESS; } } + if (bucket->count * 2 >= bucket->size) { bucket->size += (TASKS_PER_BUCKET * 2); xrealloc(bucket->pairs, bucket->size * sizeof(char *)); diff --git a/src/plugins/mpi/pmi2/pmi.h b/src/plugins/mpi/pmi2/pmi.h index 3703870fc0a79b66a1473980dcf742f7a96292b1..e21309b222313c0b33759f096c28e2da82124dfb 100644 --- a/src/plugins/mpi/pmi2/pmi.h +++ b/src/plugins/mpi/pmi2/pmi.h @@ -234,8 +234,6 @@ #define SLURM_STEP_RESV_PORTS "SLURM_STEP_RESV_PORTS" /* old PMIv1 envs */ #define PMI2_PMI_DEBUGGED_ENV "PMI_DEBUG" -#define PMI2_KVS_NO_DUP_KEYS_ENV "SLURM_PMI_KVS_NO_DUP_KEYS" - extern int handle_pmi1_cmd(int fd, int lrank); extern int handle_pmi2_cmd(int fd, int lrank);