txn_commit must abort txn before returning errors
authorHoward Chu <hyc@symas.com>
Sat, 21 Jan 2012 16:20:43 +0000 (08:20 -0800)
committerHoward Chu <hyc@symas.com>
Sat, 21 Jan 2012 16:20:43 +0000 (08:20 -0800)
Fix for failure when committing a txn that is a child of
some parent txn.

libraries/libmdb/mdb.c
libraries/libmdb/mdb.h

index 9480a43..cd0e810 100644 (file)
@@ -1737,8 +1737,10 @@ mdb_txn_commit(MDB_txn *txn)
                }
                x = dst[0].mid;
                for (; y<=src[0].mid; y++) {
-                       if (++x >= MDB_IDL_UM_MAX)
+                       if (++x >= MDB_IDL_UM_MAX) {
+                               mdb_txn_abort(txn);
                                return ENOMEM;
+                       }
                        dst[x] = src[y];
                }
                dst[0].mid = x;
index c40a5e9..5682c8f 100644 (file)
@@ -530,6 +530,7 @@ int  mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **
         *      <li>EINVAL - an invalid parameter was specified.
         *      <li>ENOSPC - no more disk space.
         *      <li>EIO - a low-level I/O error occurred while writing.
+        *      <li>ENOMEM - the transaction is nested and could not be merged into its parent.
         * </ul>
         */
 int  mdb_txn_commit(MDB_txn *txn);