int dnet_trans_alloc_send(struct dnet_session *s, struct dnet_trans_control *ctl) { struct dnet_node *n = s->node; struct dnet_net_state *st; struct dnet_addr *addr = NULL; int err; if (dnet_session_get_cflags(s) & DNET_FLAGS_DIRECT) { st = dnet_state_search_by_addr(n, &s->direct_addr); addr = &s->direct_addr; } else if(dnet_session_get_cflags(s) & DNET_FLAGS_FORWARD) { st = dnet_state_search_by_addr(n, &s->forward_addr); addr = &s->forward_addr; }else { st = dnet_state_get_first(n, &ctl->id); } if (!st) { dnet_log(n, DNET_LOG_ERROR, "%s: direct: %d, direct-addr: %s, forward: %d: trans_send: could not find network state for address", dnet_dump_id(&ctl->id), !!(dnet_session_get_cflags(s) & DNET_FLAGS_DIRECT), dnet_addr_string(&s->direct_addr), !!(dnet_session_get_cflags(s) & DNET_FLAGS_FORWARD)); err = dnet_trans_send_fail(s, addr, ctl, -ENXIO, 1); } else { err = dnet_trans_alloc_send_state(s, st, ctl); dnet_state_put(st); } return err; }
static int dnet_bulk_add_id(struct dnet_node *n, struct dnet_bulk_array *bulk_array, struct dnet_id *id, struct dnet_meta_container *mc, struct dnet_check_params *params) { int err = 0; struct dnet_bulk_state tmp; struct dnet_bulk_state *state = NULL; struct dnet_net_state *st = dnet_state_get_first(n, id); struct dnet_bulk_id *bulk_id; struct dnet_meta_update mu; dnet_log(n, DNET_LOG_DEBUG, "BULK: adding ID %s to array\n", dnet_dump_id(id)); if (!st) return -1; memcpy(&tmp.addr, &st->addr, sizeof(struct dnet_addr)); dnet_state_put(st); dnet_log(n, DNET_LOG_DEBUG, "BULK: Searching state in states array\n"); state = bsearch(&tmp, bulk_array->states, bulk_array->num, sizeof(struct dnet_bulk_state), dnet_compare_bulk_state); if (!state) return -1; if (!dnet_get_meta_update(n, mc, &mu)) return -ENOENT; dnet_log(n, DNET_LOG_DEBUG, "BULK: addr = %s state->num = %d\n", dnet_server_convert_dnet_addr(&state->addr), state->num); //pthread_mutex_lock(&state->state_lock); if (state->num >= DNET_BULK_IDS_SIZE || state->num < 0) goto err_out_unlock; bulk_id = &state->ids[state->num]; memset(bulk_id, 0, sizeof(struct dnet_bulk_id)); memcpy(&bulk_id->id, &id->id, DNET_ID_SIZE); dnet_log(n, DNET_LOG_DEBUG, "BULK: ID: %s, last_update->tsec=%llu, last_update->tnsec=%llu, flags=%02llx\n", dnet_dump_id_str(bulk_id->id.id), (unsigned long long)mu.tm.tsec, (unsigned long long)mu.tm.tnsec, (unsigned long long)mu.flags); dnet_convert_meta_update(&mu); memcpy(&bulk_id->last_update, &mu, sizeof(struct dnet_meta_update)); state->num++; dnet_log(n, DNET_LOG_DEBUG, "BULK: addr = %s state->num = %d\n", dnet_server_convert_dnet_addr(&state->addr), state->num); if (state->num == DNET_BULK_IDS_SIZE) { err = dnet_request_bulk_check(n, state, params); state->num = 0; if (err) goto err_out_unlock; } //pthread_mutex_unlock(&state->state_lock); return 0; err_out_unlock: //pthread_mutex_unlock(&state->state_lock); return -2; }