void *thread (void *arg) { thd_t *t = arg; char *key, *fence_name = NULL; int i, flags = 0; struct timespec t0; uint32_t rank; flux_future_t *f; flux_kvs_txn_t *txn; if (!(t->h = flux_open (NULL, 0))) { log_err ("%d: flux_open", t->n); goto done; } if (flux_get_rank (t->h, &rank) < 0) { log_err ("%d: flux_get_rank", t->n); goto done; } for (i = 0; i < count; i++) { if (!(txn = flux_kvs_txn_create ())) log_err_exit ("flux_kvs_txn_create"); key = xasprintf ("%s.%"PRIu32".%d.%d", prefix, rank, t->n, i); if (fopt) fence_name = xasprintf ("%s-%d", prefix, i); if (sopt) monotime (&t0); if (flux_kvs_txn_pack (txn, 0, key, "i", 42) < 0) log_err_exit ("%s", key); if (nopt && (i % nopt_divisor) == 0) flags |= FLUX_KVS_NO_MERGE; else flags = 0; if (fopt) { if (!(f = flux_kvs_fence (t->h, flags, fence_name, fence_nprocs, txn)) || flux_future_get (f, NULL) < 0) log_err_exit ("flux_kvs_fence"); flux_future_destroy (f); } else { if (!(f = flux_kvs_commit (t->h, flags, txn)) || flux_future_get (f, NULL) < 0) log_err_exit ("flux_kvs_commit"); flux_future_destroy (f); } if (sopt && zlist_append (t->perf, ddup (monotime_since (t0))) < 0) oom (); free (key); free (fence_name); flux_kvs_txn_destroy (txn); } done: if (t->h) flux_close (t->h); return NULL; }
static int update_rdl (flux_t *h, int64_t j, const char *rs) { int rc = -1; char *key = lwj_key (h, j, ".rdl"); flux_kvs_txn_t *txn = NULL; flux_future_t *f = NULL; if (!(txn = flux_kvs_txn_create ())) { flux_log_error (h, "txn_create"); goto done; } if (flux_kvs_txn_pack (txn, 0, key, "s", rs) < 0) { flux_log_error (h, "update %s", key); goto done; } if (!(f = flux_kvs_commit (h, 0, txn)) || flux_future_get (f, NULL) < 0) { flux_log_error (h, "commit failed"); goto done; } flux_log (h, LOG_DEBUG, "job (%"PRId64") assigned new rdl.", j); rc = 0; done: flux_kvs_txn_destroy (txn); flux_future_destroy (f); free (key); return rc; }
static int attr_set_rpc (attr_ctx_t *ctx, const char *name, const char *val) { flux_future_t *f; attr_t *attr; int rc = -1; #if JANSSON_VERSION_HEX >= 0x020800 /* $? format specifier was introduced in jansson 2.8 */ f = flux_rpc_pack (ctx->h, "attr.set", FLUX_NODEID_ANY, 0, "{s:s, s:s?}", "name", name, "value", val); #else f = flux_rpc_pack (ctx->h, "attr.set", FLUX_NODEID_ANY, 0, val ? "{s:s, s:s}" : "{s:s, s:n}", "name", name, "value", val); #endif if (!f) goto done; if (flux_future_get (f, NULL) < 0) goto done; if (val) { if (!(attr = attr_create (val, 0))) goto done; zhash_update (ctx->hash, name, attr); zhash_freefn (ctx->hash, name, attr_destroy); } else zhash_delete (ctx->hash, name); rc = 0; done: flux_future_destroy (f); return rc; }
void test_flush (flux_t *h, uint32_t nodeid) { flux_future_t *f; if (!(f = flux_rpc (h, "req.flush", NULL, nodeid, 0)) || flux_future_get (f, NULL) < 0) log_err_exit ("req.flush"); flux_future_destroy (f); }
void commit_continuation (flux_future_t *f, void *arg) { if (flux_future_get (f, NULL) < 0) log_err_exit ("flux_kvs_commit"); rxcount++; flux_future_destroy (f); }
void test_sink (flux_t *h, uint32_t nodeid) { flux_future_t *f; if (!(f = flux_rpc_pack (h, "req.sink", nodeid, 0, "{s:f}", "pi", 3.14)) || flux_future_get (f, NULL) < 0) log_err_exit ("%s", __FUNCTION__); flux_future_destroy (f); }
static int update_rdesc (flux_t *h, int64_t j, json_object *o) { int rc = -1; int64_t nnodes = 0; int64_t ntasks = 0; int64_t walltime = 0; char *key1 = NULL; char *key2 = NULL; char *key3 = NULL; flux_kvs_txn_t *txn = NULL; flux_future_t *f = NULL; if (!Jget_int64 (o, JSC_RDESC_NNODES, &nnodes)) goto done; if (!Jget_int64 (o, JSC_RDESC_NTASKS, &ntasks)) goto done; if (!Jget_int64 (o, JSC_RDESC_WALLTIME, &walltime)) goto done; if ((nnodes < 0) || (ntasks < 0) || (walltime < 0)) goto done; key1 = lwj_key (h, j, ".nnodes"); key2 = lwj_key (h, j, ".ntasks"); key3 = lwj_key (h, j, ".walltime"); if (!key1 || !key2 || !key3) goto done; if (!(txn = flux_kvs_txn_create ())) { flux_log_error (h, "txn_create"); goto done; } if (flux_kvs_txn_pack (txn, 0, key1, "I", nnodes) < 0) { flux_log_error (h, "update %s", key1); goto done; } if (flux_kvs_txn_pack (txn, 0, key2, "I", ntasks) < 0) { flux_log_error (h, "update %s", key2); goto done; } if (flux_kvs_txn_pack (txn, 0, key3, "I", walltime) < 0) { flux_log_error (h, "update %s", key3); goto done; } if (!(f = flux_kvs_commit (h, 0, txn)) || flux_future_get (f, NULL) < 0) { flux_log_error (h, "commit failed"); goto done; } flux_log (h, LOG_DEBUG, "job (%"PRId64") assigned new resources.", j); rc = 0; done: flux_future_destroy (f); flux_kvs_txn_destroy (txn); free (key1); free (key2); free (key3); return rc; }
void *watchthread (void *arg) { thd_t *t = arg; watch_count_t wc; flux_kvs_txn_t *txn; flux_future_t *f; flux_reactor_t *r; flux_watcher_t *pw = NULL; flux_watcher_t *tw = NULL; if (!(t->h = flux_open (NULL, 0))) log_err_exit ("flux_open"); /* Make sure key doesn't already exist, initial value may affect * test by chance (i.e. initial value = 0, commit 0 and thus no * change) */ if (!(txn = flux_kvs_txn_create ())) log_err_exit ("flux_kvs_txn_create"); if (flux_kvs_txn_unlink (txn, 0, key) < 0) log_err_exit ("flux_kvs_txn_unlink"); if (!(f = flux_kvs_commit (t->h, 0, txn)) || flux_future_get (f, NULL) < 0) log_err_exit ("flux_kvs_commit"); flux_future_destroy (f); flux_kvs_txn_destroy (txn); r = flux_get_reactor (t->h); if (flux_kvs_watch (t->h, key, watch_count_cb, t) < 0) log_err_exit ("flux_kvs_watch %s", key); pw = flux_prepare_watcher_create (r, watch_prepare_cb, NULL); wc.t = t; wc.lastcount = -1; /* So test won't hang if there's a bug */ tw = flux_timer_watcher_create (r, WATCH_TIMEOUT, WATCH_TIMEOUT, watch_timeout_cb, &wc); flux_watcher_start (pw); flux_watcher_start (tw); if (flux_reactor_run (r, 0) < 0) log_err_exit ("flux_reactor_run"); flux_watcher_destroy (pw); flux_watcher_destroy (tw); flux_close (t->h); return NULL; }
int register_content_backing_service (flux_t *h) { int rc, saved_errno; flux_future_t *f; if (!(f = flux_service_register (h, "content-backing"))) return -1; rc = flux_future_get (f, NULL); saved_errno = errno; flux_future_destroy (f); errno = saved_errno; return rc; }
void test_sink (flux_t *h, uint32_t nodeid) { flux_future_t *f; json_object *in = Jnew(); Jadd_double (in, "pi", 3.14); if (!(f = flux_rpc (h, "req.sink", Jtostr (in), nodeid, 0)) || flux_future_get (f, NULL) < 0) log_err_exit ("%s", __FUNCTION__); Jput (in); flux_future_destroy (f); }
void test_err (flux_t *h, uint32_t nodeid) { flux_future_t *f; if (!(f = flux_rpc (h, "req.err", NULL, nodeid, 0))) log_err_exit ("error sending request"); if (flux_future_get (f, NULL) == 0) log_msg_exit ("%s: succeeded when should've failed", __FUNCTION__); if (errno != 42) log_msg_exit ("%s: got errno %d instead of 42", __FUNCTION__, errno); flux_future_destroy (f); }
static int update_rdl_alloc (flux_t *h, int64_t j, json_object *o) { int i = 0; int rc = -1; int size = 0; json_object *ra_e = NULL; const char *key = NULL; zhash_t *rtab = NULL; int64_t *ncores = NULL; flux_kvs_txn_t *txn = NULL; flux_future_t *f = NULL; if (!(rtab = zhash_new ())) oom (); if (!Jget_ar_len (o, &size)) goto done; for (i=0; i < (int) size; ++i) { if (!Jget_ar_obj (o, i, &ra_e)) goto done; /* 'o' represents an array of per-node core count to use. * However, becasue the same rank can appear multiple times * in this array in emulation mode, update_hash_1ra is * used to determine the total core count per rank. */ if ( (rc = update_hash_1ra (h, j, ra_e, rtab)) < 0) goto done; } if (!(txn = flux_kvs_txn_create ())) { flux_log_error (h, "txn_create"); goto done; } FOREACH_ZHASH (rtab, key, ncores) { if ( (rc = flux_kvs_txn_pack (txn, 0, key, "I", *ncores)) < 0) { flux_log_error (h, "put %s", key); goto done; } } if (!(f = flux_kvs_commit (h, 0, txn)) || flux_future_get (f, NULL) < 0) { flux_log (h, LOG_ERR, "update_pdesc commit failed"); goto done; } rc = 0; done: flux_future_destroy (f); flux_kvs_txn_destroy (txn); zhash_destroy (&rtab); return rc; }
/* KVS commit completed. * Respond to original request which was copied and passed as 'arg'. */ static void commit_continuation (flux_future_t *f, void *arg) { flux_t *h = flux_future_get_flux (f); flux_msg_t *msg = arg; if (flux_future_get (f, NULL) < 0) { if (flux_respond_error (h, msg, errno, NULL) < 0) flux_log_error (h, "%s: flux_respond_error", __FUNCTION__); } else { if (flux_respond (h, msg, 0, NULL) < 0) flux_log_error (h, "%s: flux_respond", __FUNCTION__); } flux_msg_destroy (msg); flux_future_destroy (f); }
int register_backing_store (flux_t *h, bool value, const char *name) { flux_future_t *f; int saved_errno = 0; int rc = -1; if (!(f = flux_rpc_pack (h, "content.backing", FLUX_NODEID_ANY, 0, "{ s:b s:s }", "backing", value, "name", name))) goto done; if (flux_future_get (f, NULL) < 0) goto done; rc = 0; done: saved_errno = errno; flux_future_destroy (f); errno = saved_errno; return rc; }
static int update_pdesc (flux_t *h, int64_t j, json_object *o) { int i = 0; int rc = -1; int64_t size = 0; json_object *h_arr = NULL; json_object *e_arr = NULL; json_object *pd_arr = NULL; json_object *pde = NULL; flux_kvs_txn_t *txn = NULL; flux_future_t *f = NULL; if (!Jget_int64 (o, JSC_PDESC_SIZE, &size)) goto done; if (!Jget_obj (o, JSC_PDESC_PDARRAY, &pd_arr)) goto done; if (!Jget_obj (o, JSC_PDESC_HOSTNAMES, &h_arr)) goto done; if (!Jget_obj (o, JSC_PDESC_EXECS, &e_arr)) goto done; if (!(txn = flux_kvs_txn_create ())) { flux_log_error (h, "txn_create"); goto done; } for (i=0; i < (int) size; ++i) { if (!Jget_ar_obj (pd_arr, i, &pde)) goto done; if ( (rc = update_1pdesc (h, txn, i, j, pde, h_arr, e_arr)) < 0) goto done; } if (!(f = flux_kvs_commit (h, 0, txn)) || flux_future_get (f, NULL) < 0) { flux_log (h, LOG_ERR, "update_pdesc commit failed"); goto done; } rc = 0; done: flux_kvs_txn_destroy (txn); flux_future_destroy (f); return rc; }
static int update_state (flux_t *h, int64_t j, json_object *o) { int rc = -1; int64_t st = 0; char *key = NULL; flux_kvs_txn_t *txn = NULL; flux_future_t *f = NULL; if (!Jget_int64 (o, JSC_STATE_PAIR_NSTATE, &st)) goto done; if ((st >= J_FOR_RENT) || (st < J_NULL)) goto done; if (!(key = lwj_key (h, j, ".state"))) goto done; if (!(txn = flux_kvs_txn_create ())) { flux_log_error (h, "txn_create"); goto done; } if (flux_kvs_txn_pack (txn, 0, key, "s", jsc_job_num2state ((job_state_t)st)) < 0) { flux_log_error (h, "update %s", key); goto done; } if (!(f = flux_kvs_commit (h, 0, txn)) || flux_future_get (f, NULL) < 0) { flux_log_error (h, "commit %s", key); goto done; } flux_log (h, LOG_DEBUG, "job (%"PRId64") assigned new state: %s", j, jsc_job_num2state ((job_state_t)st)); rc = 0; if (send_state_event (h, st, j) < 0) flux_log_error (h, "send state event"); done: flux_future_destroy (f); flux_kvs_txn_destroy (txn); free (key); return rc; }
void *committhread (void *arg) { thd_t *t = arg; flux_kvs_txn_t *txn; flux_future_t *f; if (!(t->h = flux_open (NULL, 0))) log_err_exit ("flux_open"); if (!(txn = flux_kvs_txn_create ())) log_err_exit ("flux_kvs_txn_create"); if (flux_kvs_txn_pack (txn, 0, key, "i", t->n) < 0) log_err_exit ("%s", key); if (!(f = flux_kvs_commit (t->h, nopt ? FLUX_KVS_NO_MERGE : 0, txn)) || flux_future_get (f, NULL) < 0) log_err_exit ("flux_kvs_commit"); flux_future_destroy (f); flux_kvs_txn_destroy (txn); flux_close (t->h); return NULL; }