Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}