<div>Sorry, I'm confused and I can't agree with you. You said that <span style="line-height: 1.5;">bnode_lookup() will check every objects, but the code doesn't seem like it. </span><span style="line-height: 1.5;"> </span></div><div>Here is the code of bnode_lookup() that I taken from the master branch.</div><div><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 12px; margin-top: 0px; margin-bottom: 0px; line-height: 18px;"><div class="line js-file-line" id="LC350" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;"><span class="k" style="box-sizing: border-box; font-weight: bold;">static</span> <span class="kt" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">int</span> <span class="nf" style="box-sizing: border-box; color: rgb(153, 0, 0); font-weight: bold;">bnode_lookup</span><span class="p" style="box-sizing: border-box;">(</span><span class="k" style="box-sizing: border-box; font-weight: bold;">struct</span> <span class="n" style="box-sizing: border-box;">kv_bnode</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">*</span><span class="n" style="box-sizing: border-box;">bnode</span><span class="p" style="box-sizing: border-box;">,</span> <span class="kt" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">uint32_t</span> <span class="n" style="box-sizing: border-box;">vid</span><span class="p" style="box-sizing: border-box;">,</span> <span class="k" style="box-sizing: border-box; font-weight: bold;">const</span> <span class="kt" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">char</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">*</span><span class="n" style="box-sizing: border-box;">name</span><span class="p" style="box-sizing: border-box;">)</span></div><div class="line js-file-line" id="LC351" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;"><span class="p" style="box-sizing: border-box;">{</span></div><div class="line js-file-line" id="LC352" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">  <span class="kt" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">uint64_t</span> <span class="n" style="box-sizing: border-box;">hval</span><span class="p" style="box-sizing: border-box;">,</span> <span class="n" style="box-sizing: border-box;">i</span><span class="p" style="box-sizing: border-box;">;</span></div><div class="line js-file-line" id="LC353" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">   <span class="kt" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">int</span> <span class="n" style="box-sizing: border-box;">ret</span><span class="p" style="box-sizing: border-box;">;</span></div><div class="line js-file-line" id="LC354" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;"><br style="box-sizing: border-box;"></div><div class="line js-file-line" id="LC355" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">  <span class="n" style="box-sizing: border-box;">hval</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">=</span> <span class="n" style="box-sizing: border-box;">sd_hash</span><span class="p" style="box-sizing: border-box;">(</span><span class="n" style="box-sizing: border-box;">name</span><span class="p" style="box-sizing: border-box;">,</span> <span class="n" style="box-sizing: border-box;">strlen</span><span class="p" style="box-sizing: border-box;">(</span><span class="n" style="box-sizing: border-box;">name</span><span class="p" style="box-sizing: border-box;">));</span></div><div class="line js-file-line" id="LC356" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">        <span class="k" style="box-sizing: border-box; font-weight: bold;">for</span> <span class="p" style="box-sizing: border-box;">(</span><span class="n" style="box-sizing: border-box;">i</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">=</span> <span class="mi" style="box-sizing: border-box; color: rgb(0, 153, 153);">0</span><span class="p" style="box-sizing: border-box;">;</span> <span class="n" style="box-sizing: border-box;">i</span> <span class="o" style="box-sizing: border-box; font-weight: bold;"><</span> <span class="n" style="box-sizing: border-box;">MAX_DATA_OBJS</span><span class="p" style="box-sizing: border-box;">;</span> <span class="n" style="box-sizing: border-box;">i</span><span class="o" style="box-sizing: border-box; font-weight: bold;">++</span><span class="p" style="box-sizing: border-box;">)</span> <span class="p" style="box-sizing: border-box;">{</span></div><div class="line js-file-line" id="LC357" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">            <span class="kt" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">uint32_t</span> <span class="n" style="box-sizing: border-box;">idx</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">=</span> <span class="p" style="box-sizing: border-box;">(</span><span class="n" style="box-sizing: border-box;">hval</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">+</span> <span class="n" style="box-sizing: border-box;">i</span><span class="p" style="box-sizing: border-box;">)</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">%</span> <span class="n" style="box-sizing: border-box;">MAX_DATA_OBJS</span><span class="p" style="box-sizing: border-box;">;</span></div><div class="line js-file-line" id="LC358" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">               <span class="kt" style="box-sizing: border-box; color: rgb(68, 85, 136); font-weight: bold;">uint64_t</span> <span class="n" style="box-sizing: border-box;">oid</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">=</span> <span class="n" style="box-sizing: border-box;">vid_to_data_oid</span><span class="p" style="box-sizing: border-box;">(</span><span class="n" style="box-sizing: border-box;">vid</span><span class="p" style="box-sizing: border-box;">,</span> <span class="n" style="box-sizing: border-box;">idx</span><span class="p" style="box-sizing: border-box;">);</span></div><div class="line js-file-line" id="LC359" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;"><br style="box-sizing: border-box;"></div><div class="line js-file-line" id="LC360" style="box-sizing: border-box; padding-left: 10px; height: 18px;"><font color="#ff0000">              <span class="n" style="box-sizing: border-box;">ret</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">=</span> <span class="n" style="box-sizing: border-box;">sd_read_object</span><span class="p" style="box-sizing: border-box;">(</span><span class="n" style="box-sizing: border-box;">oid</span><span class="p" style="box-sizing: border-box;">,</span> <span class="p" style="box-sizing: border-box;">(</span><span class="kt" style="box-sizing: border-box; font-weight: bold;">char</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">*</span><span class="p" style="box-sizing: border-box;">)</span><span class="n" style="box-sizing: border-box;">bnode</span><span class="p" style="box-sizing: border-box;">,</span> <span class="k" style="box-sizing: border-box; font-weight: bold;">sizeof</span><span class="p" style="box-sizing: border-box;">(</span><span class="o" style="box-sizing: border-box; font-weight: bold;">*</span><span class="n" style="box-sizing: border-box;">bnode</span><span class="p" style="box-sizing: border-box;">),</span> <span class="mi" style="box-sizing: border-box;">0</span><span class="p" style="box-sizing: border-box;">);</span></font></div><div class="line js-file-line" id="LC361" style="box-sizing: border-box; padding-left: 10px; height: 18px;"><font color="#ff0000">               <span class="k" style="box-sizing: border-box; font-weight: bold;">if</span> <span class="p" style="box-sizing: border-box;">(</span><span class="n" style="box-sizing: border-box;">ret</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">!=</span> <span class="n" style="box-sizing: border-box;">SD_RES_SUCCESS</span><span class="p" style="box-sizing: border-box;">)</span></font></div><div class="line js-file-line" id="LC362" style="box-sizing: border-box; padding-left: 10px; height: 18px;"><font color="#ff0000">                       <span class="k" style="box-sizing: border-box; font-weight: bold;">goto</span> <span class="n" style="box-sizing: border-box;">out</span><span class="p" style="box-sizing: border-box;">;</span></font></div><div class="line js-file-line" id="LC363" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">              <span class="k" style="box-sizing: border-box; font-weight: bold;">if</span> <span class="p" style="box-sizing: border-box;">(</span><span class="n" style="box-sizing: border-box;">strcmp</span><span class="p" style="box-sizing: border-box;">(</span><span class="n" style="box-sizing: border-box;">bnode</span><span class="o" style="box-sizing: border-box; font-weight: bold;">-></span><span class="n" style="box-sizing: border-box;">name</span><span class="p" style="box-sizing: border-box;">,</span> <span class="n" style="box-sizing: border-box;">name</span><span class="p" style="box-sizing: border-box;">)</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">==</span> <span class="mi" style="box-sizing: border-box; color: rgb(0, 153, 153);">0</span><span class="p" style="box-sizing: border-box;">)</span></div><div class="line js-file-line" id="LC364" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">                        <span class="k" style="box-sizing: border-box; font-weight: bold;">break</span><span class="p" style="box-sizing: border-box;">;</span></div><div class="line js-file-line" id="LC365" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">     <span class="p" style="box-sizing: border-box;">}</span></div><div class="line js-file-line" id="LC366" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;"><br style="box-sizing: border-box;"></div><div class="line js-file-line" id="LC367" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">    <span class="k" style="box-sizing: border-box; font-weight: bold;">if</span> <span class="p" style="box-sizing: border-box;">(</span><span class="n" style="box-sizing: border-box;">i</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">==</span> <span class="n" style="box-sizing: border-box;">MAX_DATA_OBJS</span><span class="p" style="box-sizing: border-box;">)</span></div><div class="line js-file-line" id="LC368" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">             <span class="n" style="box-sizing: border-box;">ret</span> <span class="o" style="box-sizing: border-box; font-weight: bold;">=</span> <span class="n" style="box-sizing: border-box;">SD_RES_NO_OBJ</span><span class="p" style="box-sizing: border-box;">;</span></div><div class="line js-file-line" id="LC369" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;"><span class="nl" style="box-sizing: border-box;">out</span><span class="p" style="box-sizing: border-box;">:</span></div><div class="line js-file-line" id="LC370" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;">  <span class="k" style="box-sizing: border-box; font-weight: bold;">return</span> <span class="n" style="box-sizing: border-box;">ret</span><span class="p" style="box-sizing: border-box;">;</span></div><div class="line js-file-line" id="LC371" style="color: rgb(51, 51, 51); box-sizing: border-box; padding-left: 10px; height: 18px;"><span class="p" style="box-sizing: border-box;">}</span></div></pre></div><div><div>Suppose container A and B has the same sd_hash() value, their bnodes will be stored in adjacent data objects. Then,</div><div>we delete container A and its bnode. When we call bnode_lookup() for container B,  <span style="color: rgb(51, 51, 51); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 12px; line-height: 18px; white-space: pre-wrap;">sd_read_object()</span><span style="line-height: 1.5;"> will return error.<span id="_editor_bookmark_start_4" style="display: none; line-height: 0px;">‍</span></span></div><div>I have read your another replied email. Do you mean we should just ignore the hash collision since it is really rare in practical<span id="_editor_bookmark_start_7" style="display: none; line-height: 0px;">‍</span> use?<span id="_editor_bookmark_start_6" style="display: none; line-height: 0px;">‍</span></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> "Liu Yuan";<namei.unix@gmail.com>;</div><div><b>Date: </b> Wed, Aug 6, 2014 04:17 PM</div><div><b>To: </b> "朱炳鹏"<nkuzbp@foxmail.com>; <wbr></div><div><b>Cc: </b> "sheepdog"<sheepdog@lists.wpkg.org>; "Yu Fang"<bingpeng.zbp@alibaba-inc.com>; <wbr></div><div><b>Subject: </b> Re: [sheepdog] [PATCH v1] sheep/http: fix error in bucket_delete</div></div><div><br></div>On Tue, Aug 05, 2014 at 08:33:46PM +0800, Bingpeng Zhu wrote:<br>> From: NankaiZBP <nkuzbp@foxmail.com><br>> <br>> In current implementation, When we create a bucket, we decide<br>> the bnode's location in account VDI using sd_hash(bucket_name)<br>> as key. We handle hash conflict by linear probing hash table.<br>> Here is the bug:<br>> When we delete a bucket, we can't discard its bnode. Because<br>> bnode_lookup() need it to find if some bucket exists or not<br>> by checking adjacent bnodes. Therefore, we just zero its<br>> bnode.name when client want to delete a bucket. When we create<br>> a bucket later, we can reuse the deleted bnode if they hash to<br>> the same location in account VDI.<br><br>No, bnode_lookup() will check every objects. What your said just applied to<br>onode_lookup(). There is no bug as your described for bnode_lookup().<br><br>Thanks<br>Yuan<br></div>