Example #1
0
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);
		}
	}
}
Example #2
0
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;
}