changeset 157:6dd1b43f0589

objstore/mem: lock the backend when operating on shared structs Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sun, 18 Oct 2015 16:20:41 -0400
parents f17edce1a103
children efde22afef53
files src/objstore/mem/main.c
diffstat 1 files changed, 19 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/objstore/mem/main.c	Sun Oct 18 16:08:37 2015 -0400
+++ b/src/objstore/mem/main.c	Sun Oct 18 16:20:41 2015 -0400
@@ -28,6 +28,7 @@
 #include <nomad/time.h>
 #include <nomad/rand.h>
 #include <nomad/atomic.h>
+#include <nomad/mutex.h>
 #include <nomad/objstore_impl.h>
 
 /* each <oid,ver> */
@@ -51,6 +52,8 @@
 
 	uint32_t ds; /* our dataset id */
 	atomic64_t next_oid_uniq; /* the next unique part of noid */
+
+	pthread_mutex_t lock;
 };
 
 static int cmp(const void *va, const void *vb)
@@ -124,6 +127,8 @@
 		return PTR_ERR(obj);
 	}
 
+	mxinit(&ms->lock);
+
 	ms->ds = rand32();
 
 	noid_set(&obj->oid, ms->ds, atomic_inc(&ms->next_oid_uniq));
@@ -145,8 +150,10 @@
 
 	ms = store->private;
 
+	mxlock(&ms->lock);
 	hndl->oid = ms->root->oid;
 	hndl->clock = nvclock_dup(ms->root->ver);
+	mxunlock(&ms->lock);
 
 	if (!hndl->clock)
 		return ENOMEM;
@@ -160,6 +167,7 @@
 	struct memstore *ms;
 	struct memobj *obj;
 	struct memobj key;
+	int ret;
 
 	if (!vol || !hndl || !attr)
 		return EINVAL;
@@ -169,13 +177,19 @@
 	key.oid = hndl->oid;
 	key.ver = hndl->clock;
 
-	obj = avl_find(&ms->objs, &key, NULL);
-	if (!obj)
-		return ENOENT;
+	mxlock(&ms->lock);
 
-	*attr = obj->attrs;
+	obj = avl_find(&ms->objs, &key, NULL);
+	if (!obj) {
+		ret = ENOENT;
+	} else {
+		ret = 0;
+		*attr = obj->attrs;
+	}
 
-	return 0;
+	mxunlock(&ms->lock);
+
+	return ret;
 }
 
 static const struct vol_ops vol_ops = {