int kz_close (kz_t *kz) { int rc = -1; char *json_str = NULL; char *key = NULL; if ((kz->flags & KZ_FLAGS_WRITE)) { if (!(kz->flags & KZ_FLAGS_RAW)) { if (asprintf (&key, "%s.%.6d", kz->name, kz->seq++) < 0) oom (); if (!(json_str = zio_json_encode (NULL, 0, true))) { /* EOF */ errno = EPROTO; goto done; } if (kvs_put (kz->h, key, json_str) < 0) goto done; } if (!(kz->flags & KZ_FLAGS_NOCOMMIT_CLOSE)) { if (kvs_commit (kz->h) < 0) goto done; } if (kz->nprocs > 0 && kz->grpname) { if (kz_fence (kz) < 0) goto done; } } rc = 0; done: if (json_str) free (json_str); if (key) free (key); kz_destroy (kz); return rc; }
kz_t *kz_gopen (flux_t h, const char *grpname, int nprocs, const char *name, int flags) { kz_t *kz; if (!(flags & KZ_FLAGS_WRITE) || !grpname || nprocs <= 0) { errno = EINVAL; return NULL; } flags |= KZ_FLAGS_NOCOMMIT_OPEN; flags |= KZ_FLAGS_NOCOMMIT_CLOSE; if (!(kz = kz_open (h, name, flags))) return NULL; kz->grpname = xstrdup (grpname); kz->nprocs = nprocs; if (kz_fence (kz) < 0) goto error; return kz; error: kz_destroy (kz); return NULL; }
kz_t *kz_open (flux_t *h, const char *name, int flags) { kz_t *kz = xzmalloc (sizeof (*kz)); kz->flags = flags; kz->name = xstrdup (name); if ((kz->stream = strchr (kz->name, '.'))) kz->stream++; else kz->stream = kz->name; kz->h = h; if ((flags & KZ_FLAGS_WRITE)) { if (key_exists (h, name)) { if (!(flags & KZ_FLAGS_TRUNC)) { errno = EEXIST; goto error; } else if (kvs_unlink (h, name) < 0) goto error; } if (kvs_mkdir (h, name) < 0) /* N.B. does not catch EEXIST */ goto error; if (!(flags & KZ_FLAGS_NOCOMMIT_OPEN)) { if (kvs_commit (h) < 0) goto error; } } else if ((flags & KZ_FLAGS_READ)) { if (!(flags & KZ_FLAGS_NOEXIST)) { if (kvs_get_dir (h, &kz->dir, "%s", name) < 0) goto error; } } return kz; error: kz_destroy (kz); return NULL; }