LIBCOUCHBASE_API lcb_error_t lcb_observe(lcb_t instance, const void *command_cookie, lcb_size_t num, const lcb_observe_cmd_t *const *items) { return lcb_observe_ex(instance, command_cookie, num, (const void * const *)items, LCB_OBSERVE_TYPE_BCAST); }
/** * Schedules a single sweep of observe requests. */ static void poll_once(lcb_durability_set_t *dset) { lcb_size_t ii, oix; lcb_error_t err; /** * We should never be called while an 'iter' operation is still * in progress */ lcb_assert(dset->waiting == 0); dset_ref(dset); for (ii = 0, oix = 0; ii < dset->nentries; ii++) { struct lcb_durability_entry_st *ent = dset->entries + ii; if (ent->done) { continue; } /* reset all the per-iteration fields */ RESFLD(ent, persisted_master) = 0; RESFLD(ent, exists_master) = 0; RESFLD(ent, npersisted) = 0; RESFLD(ent, nreplicated) = 0; RESFLD(ent, cas) = 0; RESFLD(ent, err) = LCB_SUCCESS; dset->valid_entries[oix++] = ent; } lcb_assert(oix == dset->nremaining); err = lcb_observe_ex(dset->instance, dset, dset->nremaining, (const void * const *)dset->valid_entries, LCB_OBSERVE_TYPE_DURABILITY); if (err != LCB_SUCCESS) { for (ii = 0; ii < dset->nentries; ii++) { lcb_durability_entry_t *ent = dset->entries + ii; if (ent->done) { continue; } RESFLD(ent, err) = err; ent_set_resdone(ent); } } else { dset->waiting = 1; dset_ref(dset); } if (dset->waiting && oix) { lcb_uint32_t us_now = (lcb_uint32_t)(gethrtime() / 1000); lcb_uint32_t us_tmo; if (dset->us_timeout > us_now) { us_tmo = dset->us_timeout - us_now; } else { us_tmo = 1; } timer_schedule(dset, us_tmo, STATE_TIMEOUT); } else { purge_entries(dset, LCB_ERROR); } dset_unref(dset); }