CTDB_NO_MEMORY(ctdb, c->record_data.dptr);
c->new_data = NULL;
c->reply_data = NULL;
+ c->status = 0;
for (fn=ctdb->calls;fn;fn=fn->next) {
if (fn->id == call->call_id) break;
call->reply_data.dptr = NULL;
call->reply_data.dsize = 0;
}
+ call->status = c->status;
talloc_free(c);
r->hdr.destnode = hdr->srcnode;
r->hdr.srcnode = hdr->destnode;
r->hdr.reqid = hdr->reqid;
+ r->status = call.status;
r->datalen = call.reply_data.dsize;
- memcpy(&r->data[0], call.reply_data.dptr, call.reply_data.dsize);
+ if (call.reply_data.dsize) {
+ memcpy(&r->data[0], call.reply_data.dptr, call.reply_data.dsize);
+ talloc_free(call.reply_data.dptr);
+ }
ctdb_queue_packet(ctdb, &r->hdr);
- talloc_free(call.reply_data.dptr);
talloc_free(r);
}
{
struct ctdb_reply_call *c = (struct ctdb_reply_call *)hdr;
struct ctdb_call_state *state;
- TDB_DATA reply_data;
state = idr_find(ctdb->idr, hdr->reqid);
if (state == NULL) return;
- reply_data.dptr = c->data;
- reply_data.dsize = c->datalen;
-
- state->call.reply_data = reply_data;
+ state->call.reply_data.dptr = c->data;
+ state->call.reply_data.dsize = c->datalen;
+ state->call.status = c->status;
talloc_steal(state, c);
talloc_free(state);
return -1;
}
- call->reply_data.dptr = talloc_memdup(state->node->ctdb,
- state->call.reply_data.dptr,
- state->call.reply_data.dsize);
- call->reply_data.dsize = state->call.reply_data.dsize;
+ if (state->call.reply_data.dsize) {
+ call->reply_data.dptr = talloc_memdup(state->node->ctdb,
+ state->call.reply_data.dptr,
+ state->call.reply_data.dsize);
+ call->reply_data.dsize = state->call.reply_data.dsize;
+ } else {
+ call->reply_data.dptr = NULL;
+ call->reply_data.dsize = 0;
+ }
+ call->status = state->call.status;
talloc_free(state);
return 0;
}