]> git.sur5r.net Git - openldap/commitdiff
BDB 4.7 patch from sleepycat to fix locking issues on single CPU systems
authorQuanah Gibson-Mount <quanah@openldap.org>
Thu, 2 Oct 2008 18:27:21 +0000 (18:27 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Thu, 2 Oct 2008 18:27:21 +0000 (18:27 +0000)
build/db.4.7.52.patch [new file with mode: 0644]

diff --git a/build/db.4.7.52.patch b/build/db.4.7.52.patch
new file mode 100644 (file)
index 0000000..96459aa
--- /dev/null
@@ -0,0 +1,42 @@
+--- db-4.7.25/lock/lock.c.orig 2008-05-07 05:27:35.000000000 -0700
++++ db-4.7.25/lock/lock.c      2008-09-26 11:07:15.000000000 -0700
+@@ -1274,10 +1274,12 @@
+               SH_TAILQ_REMOVE(
+                   &lt->obj_tab[obj_ndx], sh_obj, links, __db_lockobj);
+               if (sh_obj->lockobj.size > sizeof(sh_obj->objdata)) {
+-                      LOCK_REGION_LOCK(env);
++                      if (region->part_t_size != 1)
++                              LOCK_REGION_LOCK(env);
+                       __env_alloc_free(&lt->reginfo,
+                           SH_DBT_PTR(&sh_obj->lockobj));
+-                      LOCK_REGION_UNLOCK(env);
++                      if (region->part_t_size != 1)
++                              LOCK_REGION_UNLOCK(env);
+               }
+               SH_TAILQ_INSERT_HEAD(
+                   &FREE_OBJS(lt, part_id), sh_obj, links, __db_lockobj);
+@@ -1467,15 +1469,21 @@
+               if (obj->size <= sizeof(sh_obj->objdata))
+                       p = sh_obj->objdata;
+               else {
+-                      LOCK_REGION_LOCK(env);
++                      /*
++                       * If we have only one partition, the region is locked.
++                       */
++                      if (region->part_t_size != 1)
++                              LOCK_REGION_LOCK(env);
+                       if ((ret =
+                           __env_alloc(&lt->reginfo, obj->size, &p)) != 0) {
+                               __db_errx(env,
+                                   "No space for lock object storage");
+-                              LOCK_REGION_UNLOCK(env);
++                              if (region->part_t_size != 1)
++                                      LOCK_REGION_UNLOCK(env);
+                               goto err;
+                       }
+-                      LOCK_REGION_UNLOCK(env);
++                      if (region->part_t_size != 1)
++                              LOCK_REGION_UNLOCK(env);
+               }
+               memcpy(p, obj->data, obj->size);