void fiber_value(struct fbr_context *fiber_context, void *_arg) { struct client_context *cc; struct my_value *value; struct me_cli_value *mv; int retval; ev_tstamp t1, t2, diff; cc = fbr_container_of(fiber_context, struct client_context, fbr); for (;;) { value = new_value(cc); record_value(cc, value); assert(value->buf); assert(value->buf->ptr); for (;;) { if (value->nreceived > 0) break; mv = me_cli_value_new(cc->conn); mv->data = (uint8_t *)value->buf->ptr; mv->data_len = value->buf->size; value->nsent++; ev_now_update(cc->loop); t1 = ev_now(cc->loop); retval = me_cli_value_submit(mv, cc->args_info.instance_timeout_arg); if (0 == retval) { value->latency = mv->latency; cc->last_iid = mv->iid; t2 = ev_now(cc->loop); diff = cc->args_info.each_arg - (t2 - t1); if (diff > 0) fbr_sleep(&cc->fbr, diff); if (value->nreceived > 0) break; next_value(cc, value, mv->iid); me_cli_value_processed(mv); me_cli_value_dispose(mv); break; } me_cli_value_processed(mv); me_cli_value_dispose(mv); cc->stats.timeouts++; assert(value->buf); assert(value->buf->ptr); } } }
char *hs_get(HStore *store, char *key, int *vlen, uint32_t *flag) { if (!key || !store) return NULL; if (key[0] == '@'){ char *r = hs_list(store, key+1); if (r) *vlen = strlen(r); *flag = 0; return r; } bool info = false; if (key[0] == '?'){ info = true; key ++; } int index = get_index(store, key); DataRecord *r = bc_get(store->bitcasks[index], key); if (r == NULL){ return NULL; } char *res = NULL; if (info){ res = malloc(256); if (!res) { free_record(r); return NULL; } uint16_t hash = 0; if (r->version > 0){ hash = gen_hash(r->value, r->vsz); } *vlen = snprintf(res, 255, "%d %u %u %u %u", r->version, hash, r->flag, r->vsz, r->tstamp); *flag = 0; }else if (r->version > 0){ res = record_value(r); r->value = NULL; *vlen = r->vsz; *flag = r->flag; } free_record(r); return res; }