<div>Hi Hitoshi,</div><div>    I have missed some important code in queue_peer_request().  The function has the following code:</div><div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">      </span>if (req->rq.flags & SD_FLAG_CMD_RECOVERY)</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>req->rq.epoch = req->rq.obj.tgt_epoch;</div></div><div><div><br></div><div>   At last, epoch and tgt_epoch has the same value. So it it not a bug. I'm sorry about my mistake.</div><div><br></div><div>Bingpeng</div><div><br></div><div style="font-size: 12px;font-family: Arial Narrow;padding:2px 0 2px 0;">------------------ Original ------------------</div><div style="font-size: 12px;background:#efefef;padding:8px;"><div><b>From: </b> "Hitoshi Mitake";<mitake.hitoshi@gmail.com>;</div><div><b>Date: </b> Sat, May 30, 2015 06:11 PM</div><div><b>To: </b> "Bingpeng Zhu"<nkuzbp@foxmail.com>; <wbr></div><div><b>Cc: </b> "sheepdog"<sheepdog@lists.wpkg.org>; <wbr></div><div><b>Subject: </b> Re: [sheepdog] question about the epoch field in reading peer request      header</div></div><div><br></div>At Sat, 30 May 2015 01:12:12 +0800,<br>=?ISO-8859-1?B?QmluZ3BlbmcgWmh1?= wrote:<br>> <br>> [1  <multipart/alternative (8bit)>]<br>> [1.1  <text/plain; ISO-8859-1 (base64)>]<br>> Hi all:<br>>     I have a problem about the epoch information in SD_OP_READ_PEER request header. I'm not sure whether I misunderstand the code or it is a bug.<br>>     When we recover a erasure code object in recovery, we need to read the remaining replicas firstly to rebuild the lost replica. In function read_erasure_object(), we init  SD_OP_READ_PEER request header by the following code:<br>> <br>> <br>>    sd_init_req(&hdr, SD_OP_READ_PEER);<br>>   hdr.epoch = epoch;<br>>        hdr.flags = SD_FLAG_CMD_RECOVERY;<br>>         hdr.data_length = rlen;<br>>   hdr.obj.oid = oid;<br>>        hdr.obj.tgt_epoch = tgt_epoch;<br>>    hdr.obj.ec_index = idx;<br>> <br>> <br>> <br>>     I think hdr.epoch is current epoch of the cluster and hdr.obj.tgt_epoch is the historical epoch from which we want to read the stale replica. The target node will call peer_read_obj() to process SD_OP_READ_PEER request. Peer_read_obj() set  iocb.epoch = hdr->epoch then pass iocb to sd_store->read(). In default_read(), we use iocb->epoch < sys_epoch() to  judge whether the request is againt the older epoch which needs to read replica from the stale directory. I think we use the wrong epoch here. We should use hdr.obj.tgt_epoch rather than hdr.epoch to make the judgement. Can anyone answer my question?<br><br>Hi Bingpeng,<br><br>Thanks for your pointing! Your argument seems to be right. We need to<br>use tgt_epoch. The problem seems to be shared with recovyer process of<br>ordinal replicated object.<br><br>Could you send a patch for solving this problem?<br><br>Thanks,<br>Hitoshi<br><br>> <br>> <br>> Thanks.<br>> Bingpeng<br>> [1.2  <text/html; ISO-8859-1 (base64)>]<br>> <br>> [2  <text/plain; us-ascii (7bit)>]<br>> -- <br>> sheepdog mailing list<br>> sheepdog@lists.wpkg.org<br>> https://lists.wpkg.org/mailman/listinfo/sheepdog<br></div>