On 06/27/2012 11:05 AM, yaohaiting.wujue at gmail.com wrote: > From: HaiTing Yao <wujue.yht at taobao.com> > > Node A receives a COW write request, and then forward the request to > replica nodes B, C, D. Nodes B, C, D do COW separately. On some > conditions, nodes B, C, D maybe need read base data from node A. Now > node A is waiting for the reply from B, C, D. If the I/O threads are > busy, there is dead lock. > > Signed-off-by: HaiTing Yao <wujue.yht at taobao.com> > --- > sheep/gateway.c | 43 +++++++++++++++++++++++++++++++++++++++++++ > sheep/ops.c | 2 +- > sheep/sheep_priv.h | 3 +++ > 3 files changed, 47 insertions(+), 1 deletions(-) > > diff --git a/sheep/gateway.c b/sheep/gateway.c > index 42f028a..dfee8f3 100644 > --- a/sheep/gateway.c > +++ b/sheep/gateway.c > @@ -208,6 +208,42 @@ err: > return ret; > } > > +static int do_cow_at_gateway(struct request *req) > +{ > + int ret = 0; > + char *buf = NULL; > + > + dprintf("%" PRIx64 ", %" PRIx64 "\n", req->rq.obj.oid, > + req->rq.obj.cow_oid); > + > + buf = valloc(SD_DATA_OBJ_SIZE); > + if (!buf) { > + eprintf("can not allocate memory\n"); > + return -1; > + } > + > + if (req->rq.data_length != SD_DATA_OBJ_SIZE) { > + ret = read_copy_from_replica(req->vnodes, req->rq.epoch, > + req->rq.obj.cow_oid, buf); Indentation. > + if (ret != SD_RES_SUCCESS) { > + eprintf("failed to read cow object\n"); > + free(buf); > + return -1; > + } > + > + memcpy(buf + req->rq.obj.offset, req->data, > + req->rq.data_length); > + Ditto > + free(req->data); > + req->data = buf; > + > + req->rq.data_length = SD_DATA_OBJ_SIZE; > + req->rq.obj.offset = 0; > + } > + > + return ret; > +} > + > void do_gateway_request(struct work *work) > { > struct request *req = container_of(work, struct request, work); > @@ -216,6 +252,13 @@ void do_gateway_request(struct work *work) > dprintf("%x, %" PRIx64" , %u\n", > req->rq.opcode, req->rq.obj.oid, req->rq.epoch); > > + if ((req->rq.flags & SD_FLAG_CMD_WRITE) && > + (req->rq.flags & SD_FLAG_CMD_COW)) { ditto. Also here We should document fallback of the failure and why we fallback. Thanks, Yuan |