Full_Name: Jeremiah Morrill
Version: 0.9
OS: Linux (Ubuntu14)
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (70.173.183.164)


Two possible issues.  Semi-related.

The first:
On a full storage partition, when creating a new database, I get a SIGBUS.  I
believe it is caused by the locks successfully mmap()ing, but not really having
the storage to back it.  I hacked in a "posix_fallocate" to make sure the
storage space is there and it appeared to fix it.  I have no idea what the
unintended consequences of this change may be.

Here is the diff:

 void
@@ -4863,6 +4868,14 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode,
int *excl)
                void *m = mmap(NULL, rsize, PROT_READ|PROT_WRITE, MAP_SHARED,
                        env->me_lfd, 0);
                if (m == MAP_FAILED) goto fail_errno;
+       
+       rc = posix_fallocate(env->me_lfd, 0, rsize);
+       
+       if (rc) {
+               munmap(m, rsize);
+               goto fail;
+       }
+       
                env->me_txns = m;
 #endif
        }


I'm not sure if this next one is an issue or just incorrect usage on my part. 
So take with a grain of salt.  

After getting an EIO (deliberate out of storage space) from a mdb_txn_commit,
the transaction would be mdb_txn_abort()ed. I then would close then env which
would get a SIGABORT from a double-free on the env_close0 with env->txn0.

The hack I put in there to avoid this was in the mdb_txn_end.  I check if txn ==
env->me_txn0, and if it is, to set env->me_txn0 to NULL.

Here's the diff:

@@ -3244,12 +3244,17 @@ mdb_txn_end(MDB_txn *txn, unsigned mode)
                }
                pthread_mutex_unlock(&env->me_rpmutex);
                tl[0].mid = 0;
-               if (mode & MDB_END_FREE)
+       if (mode & MDB_END_FREE)
                        free(tl);
        }
 #endif
-       if (mode & MDB_END_FREE)
-               free(txn);
+    if (mode & MDB_END_FREE) {
+        /* avoid double free on env close */
+        if(txn == env->me_txn0){
+            env->me_txn0 = NULL;
+        }
+        free(txn);
+    }
 }

Reply via email to