Beispiel #1
0
void pmixp_coll_ring_reset_if_to(pmixp_coll_t *coll, time_t ts) {
	pmixp_coll_ring_ctx_t *coll_ctx;
	int i;

	/* lock the structure */
	slurm_mutex_lock(&coll->lock);
	for (i = 0; i < PMIXP_COLL_RING_CTX_NUM; i++) {
		coll_ctx = &coll->state.ring.ctx_array[i];
		if (!coll_ctx->in_use ||
		    (PMIXP_COLL_RING_SYNC == coll_ctx->state)) {
			continue;
		}
		if (ts - coll->ts > pmixp_info_timeout()) {
			/* respond to the libpmix */
			if (coll_ctx->contrib_local && coll->cbfunc) {
				pmixp_lib_modex_invoke(coll->cbfunc,
						       PMIXP_ERR_TIMEOUT, NULL,
						       0, coll->cbdata,
						       NULL, NULL);
			}
			/* report the timeout event */
			PMIXP_ERROR("%p: collective timeout seq=%d",
				    coll, coll_ctx->seq);
			pmixp_coll_log(coll);
			/* drop the collective */
			_reset_coll_ring(coll_ctx);
		}
	}
	/* unlock the structure */
	slurm_mutex_unlock(&coll->lock);
}
Beispiel #2
0
void pmixp_coll_localcb_nodata(pmixp_coll_t *coll, int status)
{
	if (coll->cbfunc) {
		pmixp_lib_modex_invoke(coll->cbfunc, status, NULL,
				       0, coll->cbdata, NULL, NULL);
		/* Clear callback info as we are not allowed
		 * to use it second ime */
		coll->cbfunc = NULL;
		coll->cbdata = NULL;
	}
}
Beispiel #3
0
static void _progress_coll_ring(pmixp_coll_ring_ctx_t *coll_ctx)
{
	int ret = 0;
	pmixp_coll_t *coll = _ctx_get_coll(coll_ctx);

	pmixp_coll_ring_ctx_sanity_check(coll_ctx);

	do {
		ret = false;
		switch(coll_ctx->state) {
		case PMIXP_COLL_RING_SYNC:
			if (coll_ctx->contrib_local || coll_ctx->contrib_prev) {
				coll_ctx->state = PMIXP_COLL_RING_PROGRESS;
				ret = true;
			}
			break;
		case PMIXP_COLL_RING_PROGRESS:
			/* check for all data is collected and forwarded */
			if (!_ring_remain_contrib(coll_ctx) ) {
				coll_ctx->state = PMIXP_COLL_RING_FINALIZE;

				if (coll->cbfunc) {
					pmixp_coll_ring_cbdata_t *cbdata;

					cbdata = xmalloc(
						sizeof(pmixp_coll_ring_cbdata_t));
					cbdata->coll = coll;
					cbdata->coll_ctx = coll_ctx;
					cbdata->buf = coll_ctx->ring_buf;
					cbdata->seq = coll_ctx->seq;
					pmixp_lib_modex_invoke(
						coll->cbfunc, SLURM_SUCCESS,
						get_buf_data(
							coll_ctx->ring_buf),
						get_buf_offset(
							coll_ctx->ring_buf),
						coll->cbdata, _libpmix_cb,
						(void *)cbdata);
				}
				ret = true;
			}
			break;
		case PMIXP_COLL_RING_FINALIZE:
			if(_ring_fwd_done(coll_ctx)) {
#ifdef PMIXP_COLL_DEBUG
				PMIXP_DEBUG("%p: %s seq=%d is DONE", coll,
					    pmixp_coll_type2str(coll->type),
					    coll_ctx->seq);
#endif
				/* increase coll sequence */
				coll->seq++;
				_reset_coll_ring(coll_ctx);
				ret = true;

			}
			break;
		default:
			PMIXP_ERROR("%p: unknown state = %d",
				    coll_ctx, (int)coll_ctx->state);
		}
	} while(ret);
}