From: Liu Yuan <[email protected]>

When there are multiple thread calling object_cache_pull(), they all will return
success even though there is only one thread that can actually create the 
object.
Then we should only add oid to object list once.

Signed-off-by: Liu Yuan <[email protected]>
---
 include/sheepdog_proto.h |    1 +
 sheep/object_cache.c     |    5 ++++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/include/sheepdog_proto.h b/include/sheepdog_proto.h
index 45a4b81..9e66769 100644
--- a/include/sheepdog_proto.h
+++ b/include/sheepdog_proto.h
@@ -68,6 +68,7 @@
 #define SD_RES_CLUSTER_RECOVERING 0x22 /* Cluster is recovering. */
 #define SD_RES_OBJ_RECOVERING     0x23 /* Object is recovering */
 #define SD_RES_KILLED           0x24 /* Node is killed */
+#define SD_RES_OID_EXIST        0x25 /* Object ID exists already */
 
 /* errors above 0x80 are sheepdog-internal */
 
diff --git a/sheep/object_cache.c b/sheep/object_cache.c
index 5e709c2..e34b12e 100644
--- a/sheep/object_cache.c
+++ b/sheep/object_cache.c
@@ -692,7 +692,8 @@ out:
 static int create_cache_object(struct object_cache *oc, uint32_t idx,
                               void *buffer, size_t buf_size)
 {
-       int flags = def_open_flags | O_CREAT | O_EXCL, fd, ret = SD_RES_SUCCESS;
+       int flags = def_open_flags | O_CREAT | O_EXCL, fd;
+       int ret = SD_RES_OID_EXIST;
        struct strbuf buf;
 
        strbuf_init(&buf, PATH_MAX);
@@ -771,6 +772,8 @@ static int object_cache_pull(struct object_cache *oc, 
uint32_t idx)
                ret = create_cache_object(oc, idx, buf, data_length);
                if (ret == SD_RES_SUCCESS)
                        add_to_object_cache(oc, idx, 0);
+               else if (ret == SD_RES_OID_EXIST)
+                       ret = SD_RES_SUCCESS;
        }
        free(buf);
 out:
-- 
1.7.10.2

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to