<div dir="ltr">Reviewed-by: Robin Dong <<a href="mailto:sanbai@taobao.com">sanbai@taobao.com</a>></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/12/26 Liu Yuan <span dir="ltr"><<a href="mailto:namei.unix@gmail.com" target="_blank">namei.unix@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">For object create/delete, we can't easily maintain the bnode consistent by<br>
playing around the operations order.<br>
<br>
We should inform the user the deletion failure if bnode_update() fails even<br>
though we might delete the onode successfully. Then subsequent 'delete' for<br>
the same object won't skew up the bnode metadata.<br>
<br>
The true fix for the inconsistency (for whatever reaons it happens), is a check<br>
request that does a server side consistency check. This is left for a future<br>
patch.<br>
<br>
Another fix is that we drop the redundant data about bytes_used, object_counts<br>
from bnode, and so for "HEAD" operation, we just iterate all the objects. This<br>
can't scale if we have huge objects.<br>
<div class="im"><br>
Signed-off-by: Liu Yuan <<a href="mailto:namei.unix@gmail.com">namei.unix@gmail.com</a>><br>
---<br>
</div> sheep/http/kv.c | 36 +++++++++++++++++++++++++-----------<br>
 1 file changed, 25 insertions(+), 11 deletions(-)<br>
<br>
diff --git a/sheep/http/kv.c b/sheep/http/kv.c<br>
index 3bb8a1d..679784d 100644<br>
--- a/sheep/http/kv.c<br>
+++ b/sheep/http/kv.c<br>
@@ -373,6 +373,21 @@ out:<br>
        return ret;<br>
 }<br>
<br>
+/*<br>
+ * For object create/delete, we can't easily maintain the bnode consistent by<br>
+ * playing around the operations order.<br>
+ *<br>
+ * We should inform the user the deletion failure if bnode_update() fails even<br>
+ * though we might delete the onode successfully. Then subsequent 'delete' for<br>
+ * the same object won't skew up the bnode metadata.<br>
+ * The true fix for the inconsistency (for whatever reaons it happens), is a<br>
+ * check request that does a server side consistency check. This is left for a<br>
+ * future patch.<br>
+ *<br>
+ * Another fix is that we drop the redundant data about bytes_used,<br>
+ * object_counts from bnode, and so for "HEAD" operation, we just iterate all<br>
+ * the objects. This can't scale if we have huge objects.<br>
+ */<br>
 static int bnode_update(const char *account, const char *bucket, uint64_t used,<br>
                        bool create)<br>
 {<br>
@@ -1033,7 +1048,8 @@ int kv_create_object(struct http_request *req, const char *account,<br>
<div class="im"><br>
        ret = bnode_update(account, bucket, req->data_length, true);<br>
        if (ret != SD_RES_SUCCESS) {<br>
-               ret = onode_delete(onode);<br>
+               sd_err("failed to update bucket for %s", name);<br>
+               onode_delete(onode);<br>
                goto out;<br>
        }<br>
 out:<br>
</div>@@ -1087,17 +1103,15 @@ int kv_delete_object(const char *account, const char *bucket, const char *name)<br>
                goto out;<br>
<div class="im"><br>
        ret = onode_delete(onode);<br>
-       if (ret != SD_RES_SUCCESS)<br>
</div><div class="im">+       if (ret != SD_RES_SUCCESS) {<br>
</div>+               sd_err("failed to delete bnode for %s", name);<br>
                goto out;<br>
-<br>
<div class="im HOEnZb">-       /*<br>
-        * If bnode is deleted successfully, we consider it successful deletion<br>
-        * even if bnode_update() fails.<br>
-        *<br>
-        * FIXME: make bnode metadata consistent<br>
-        */<br>
-       if (bnode_update(account, bucket, onode->size, false) != SD_RES_SUCCESS)<br>
-               sd_err("failed to update bnode for %s/%s", account, bucket);<br>
+       }<br>
</div><div class="im HOEnZb">+       ret = bnode_update(account, bucket, onode->size, false);<br>
+       if (ret != SD_RES_SUCCESS) {<br>
+               sd_err("failed to update bnode for %s", name);<br>
</div><div class="HOEnZb"><div class="h5">+               goto out;<br>
+       }<br>
 out:<br>
        free(onode);<br>
        return ret;<br>
--<br>
1.8.1.2<br>
<br>
--<br>
sheepdog mailing list<br>
<a href="mailto:sheepdog@lists.wpkg.org">sheepdog@lists.wpkg.org</a><br>
<a href="http://lists.wpkg.org/mailman/listinfo/sheepdog" target="_blank">http://lists.wpkg.org/mailman/listinfo/sheepdog</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>--<br>Best Regard<br>Robin Dong
</div>