]> git.sur5r.net Git - openldap/commitdiff
Add cache txn_prepare code based upon submission (ITS#1575) by
authorKurt Zeilenga <kurt@openldap.org>
Sat, 2 Feb 2002 03:28:32 +0000 (03:28 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Sat, 2 Feb 2002 03:28:32 +0000 (03:28 +0000)
Jong Hyuk Choi <jongchoi@us.ibm.com>.  Needs a bit more work
(GID should be globally unique).

servers/slapd/back-bdb/add.c
servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/delete.c
servers/slapd/back-bdb/modify.c
servers/slapd/back-bdb/modrdn.c
servers/slapd/back-bdb/passwd.c
servers/slapd/back-bdb/tools.c

index 7da553e59fcb6fabbb2db333875c9a9430ca0124..f203434b9adcbfe730ffb66718f439539035d657 100644 (file)
@@ -13,6 +13,8 @@
 #include "back-bdb.h"
 #include "external.h"
 
+static char bdb_gid[DB_XIDDATASIZE];
+
 int
 bdb_add(
        BackendDB       *be,
@@ -69,7 +71,7 @@ bdb_add(
 
        if( 0 ) {
 retry: /* transaction retry */
-               rc = txn_abort( ltid );
+               rc = TXN_ABORT( ltid );
                ltid = NULL;
                op->o_private = NULL;
                if( rc != 0 ) {
@@ -81,7 +83,7 @@ retry:        /* transaction retry */
        }
 
        /* begin transaction */
-       rc = txn_begin( bdb->bi_dbenv, NULL, &ltid, 
+       rc = TXN_BEGIN( bdb->bi_dbenv, NULL, &ltid, 
                bdb->bi_db_opflags );
        text = NULL;
        if( rc != 0 ) {
@@ -351,40 +353,50 @@ retry:    /* transaction retry */
        }
 
        if( op->o_noop ) {
-               rc = txn_abort( ltid );
+               if (( rc=TXN_ABORT( ltid )) != 0 ) {
+                       text = "txn_abort (no-op) failed";
+               } else {
+                       rc = LDAP_SUCCESS;
+               }
+
        } else {
-               rc = txn_commit( ltid, 0 );
+               if (( rc=TXN_PREPARE( ltid, bdb_gid )) != 0 ) {
+                       text = "txn_prepare failed";
+
+               } else {
+                       if ( bdb_cache_add_entry_rw(&bdb->bi_cache,
+                               e, CACHE_WRITE_LOCK) != 0 )
+                       {
+                               if(( rc=TXN_ABORT( ltid )) != 0 ) {
+                                       text = "cache add & txn_abort failed";
+                               } else {
+                                       rc = LDAP_OTHER;
+                                       text = "cache add failed";
+                               }
+                       } else {
+                               if(( rc=TXN_COMMIT( ltid, 0 )) != 0 ) {
+                                       text = "txn_commit failed";
+                               } else {
+                                       rc = LDAP_SUCCESS;
+                               }
+                       }
+               }
        }
+
        ltid = NULL;
        op->o_private = NULL;
 
-       if( rc != 0 ) {
-               Debug( LDAP_DEBUG_TRACE,
-                       "bdb_add: txn_%s failed: %s (%d)\n",
-                       op->o_noop ? "abort (no-op)" : "commit",
-                       db_strerror(rc), rc );
-               rc = LDAP_OTHER;
-               text = "commit failed";
-
-       } else {
-               /* add the entry to the entry cache */
-               /* we should add to cache only upon free of txn-abort */
-               if (!op->o_noop &&
-                       bdb_cache_add_entry_rw(&bdb->bi_cache, e, CACHE_WRITE_LOCK) != 0)
-               {
-                       text = "cache add failed";
-                       goto return_results;
-               }
-               Debug( LDAP_DEBUG_TRACE,
-                       "bdb_add: added%s id=%08lx dn=\"%s\"\n",
-                       op->o_noop ? " (no-op)" : "",
-                       e->e_id, e->e_dn );
-               rc = LDAP_SUCCESS;
+       if (rc == LDAP_SUCCESS) {
+               Debug(LDAP_DEBUG_TRACE, "bdb_add: added%s id=%08lx dn=\"%s\"\n",
+                       op->o_noop ? " (no-op)" : "", e->e_id, e->e_dn );
                text = NULL;
+               bdb_cache_entry_commit( e );
+       }
+       else {
+               Debug( LDAP_DEBUG_TRACE, "bdb_add: %s : %s (%d)\n",
+                       text, db_strerror(rc), rc );
+               rc = LDAP_OTHER;
        }
-
-       bdb_cache_entry_commit( e );
 
 return_results:
        send_ldap_result( conn, op, rc,
@@ -399,7 +411,7 @@ return_results:
 done:
 
        if( ltid != NULL ) {
-               txn_abort( ltid );
+               TXN_ABORT( ltid );
                op->o_private = NULL;
        }
 
index e0d6cd7842a4557a1b6a4bf078afeb35ab8576a4..8a8417a327067c4ea7ff508094de797836f62f5e 100644 (file)
@@ -149,15 +149,23 @@ struct bdb_op_info {
 };
 
 #if DB_VERSION_MAJOR < 4
-#define        TXN_CHECKPOINT(env, k, m, f)    txn_checkpoint(env, k, m, f)
-#define        TXN_ID(txn)                     txn_id(txn)
-#define        LOCK_DETECT(env, f, t, a)       lock_detect(env, f, t, a)
-#define        LOCK_GET(env, i, f, o, m, l)    lock_get(env, i, f, o, m, l)
+#define LOCK_DETECT(env,f,t,a)         lock_detect(env, f, t, a)
+#define LOCK_GET(env,i,f,o,m,l)                lock_get(env, i, f, o, m, l)
+#define TXN_CHECKPOINT(env,k,m,f)      txn_checkpoint(env, k, m, f)
+#define TXN_BEGIN(env,p,t,f)           txn_begin((env), p, t, f)
+#define TXN_PREPARE(txn,gid)           txn_prepare((txn), (gid))
+#define TXN_COMMIT(txn,f)                      txn_commit((txn), (f))
+#define        TXN_ABORT(txn)                          txn_abort((txn))
+#define TXN_ID(txn)                                    txn_id(txn)
 #else
-#define        TXN_CHECKPOINT(env, k, m, f)    (env)->txn_checkpoint(env, k, m, f)
-#define        TXN_ID(txn)                     (txn)->id(txn)
-#define        LOCK_DETECT(env, f, t, a)       (env)->lock_detect(env, f, t, a)
-#define        LOCK_GET(env, i, f, o, m, l)    (env)->lock_get(env, i, f, o, m, l)
+#define LOCK_DETECT(env,f,t,a)         (env)->lock_detect(env, f, t, a)
+#define LOCK_GET(env,i,f,o,m,l)                (env)->lock_get(env, i, f, o, m, l)
+#define TXN_CHECKPOINT(env,k,m,f)      (env)->txn_checkpoint(env, k, m, f)
+#define TXN_BEGIN(env,p,t,f)           (env)->txn_begin((env), p, t, f)
+#define TXN_PREPARE(txn,g)                     (txn)->prepare((txn), (g))
+#define TXN_COMMIT(txn,f)                      (txn)->commit((txn), (f))
+#define TXN_ABORT(txn)                         (txn)->abort((txn))
+#define TXN_ID(txn)                                    (txn)->id(txn)
 #endif
 
 LDAP_END_DECL
index 24d4f2ecb49404d0431762a5a994c1c11d030a4b..a469fb1265ed84f0c5fea9b7a2c3b42af47c43e2 100644 (file)
@@ -47,7 +47,7 @@ retry:        /* transaction retry */
                }
                Debug( LDAP_DEBUG_TRACE, "==> bdb_delete: retrying...\n",
                        0, 0, 0 );
-               rc = txn_abort( ltid );
+               rc = TXN_ABORT( ltid );
                ltid = NULL;
                op->o_private = NULL;
                if( rc != 0 ) {
@@ -59,7 +59,7 @@ retry:        /* transaction retry */
        }
 
        /* begin transaction */
-       rc = txn_begin( bdb->bi_dbenv, NULL, &ltid, 
+       rc = TXN_BEGIN( bdb->bi_dbenv, NULL, &ltid, 
                bdb->bi_db_opflags );
        text = NULL;
        if( rc != 0 ) {
@@ -332,9 +332,9 @@ retry:      /* transaction retry */
 #endif
 
        if( op->o_noop ) {
-               rc = txn_abort( ltid );
+               rc = TXN_ABORT( ltid );
        } else {
-               rc = txn_commit( ltid, 0 );
+               rc = TXN_COMMIT( ltid, 0 );
        }
        ltid = NULL;
        op->o_private = NULL;
@@ -372,7 +372,7 @@ done:
        }
 
        if( ltid != NULL ) {
-               txn_abort( ltid );
+               TXN_ABORT( ltid );
                op->o_private = NULL;
        }
 
index d9dc92be05fa68243b50bd9e242ee071cb11f05c..bd82300d89fc5a8aced50b1b6ae836fbeeabf2bb 100644 (file)
@@ -204,7 +204,7 @@ retry:      /* transaction retry */
                }
                Debug(LDAP_DEBUG_TRACE,
                        "bdb_modify: retrying...\n", 0, 0, 0);
-               rc = txn_abort( ltid );
+               rc = TXN_ABORT( ltid );
                ltid = NULL;
                op->o_private = NULL;
                if( rc != 0 ) {
@@ -216,7 +216,7 @@ retry:      /* transaction retry */
        }
 
        /* begin transaction */
-       rc = txn_begin( bdb->bi_dbenv, NULL, &ltid, 
+       rc = TXN_BEGIN( bdb->bi_dbenv, NULL, &ltid, 
                bdb->bi_db_opflags );
        text = NULL;
        if( rc != 0 ) {
@@ -328,9 +328,9 @@ retry:      /* transaction retry */
        }
 
        if( op->o_noop ) {
-               rc = txn_abort( ltid );
+               rc = TXN_ABORT( ltid );
        } else {
-               rc = txn_commit( ltid, 0 );
+               rc = TXN_COMMIT( ltid, 0 );
        }
        ltid = NULL;
        op->o_private = NULL;
@@ -364,7 +364,7 @@ return_results:
 
 done:
        if( ltid != NULL ) {
-               txn_abort( ltid );
+               TXN_ABORT( ltid );
                op->o_private = NULL;
        }
 
index 29888ae7d0b11792a7e183aea72ece1c7f76c19c..914eae9927f20a101239bccbdbb9606509eca311 100644 (file)
 #include "back-bdb.h"
 #include "external.h"
 
+static char bdb_gid[DB_XIDDATASIZE];
+
 int
 bdb_modrdn(
-    Backend    *be,
-    Connection *conn,
-    Operation  *op,
-    struct berval      *dn,
-    struct berval      *ndn,
-    struct berval      *newrdn,
-    struct berval      *nnewrdn,
-    int                deleteoldrdn,
-    struct berval      *newSuperior,
-    struct berval      *nnewSuperior
-)
+       Backend *be,
+       Connection      *conn,
+       Operation       *op,
+       struct berval   *dn,
+       struct berval   *ndn,
+       struct berval   *newrdn,
+       struct berval   *nnewrdn,
+       int             deleteoldrdn,
+       struct berval   *newSuperior,
+       struct berval   *nnewSuperior )
 {
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        AttributeDescription *children = slap_schema.si_ad_children;
@@ -81,7 +82,7 @@ retry:        /* transaction retry */
                        bdb_cache_return_entry_r(&bdb->bi_cache, np);
                }
                Debug( LDAP_DEBUG_TRACE, "==>bdb_modrdn: retrying...\n", 0, 0, 0 );
-               rc = txn_abort( ltid );
+               rc = TXN_ABORT( ltid );
                ltid = NULL;
                op->o_private = NULL;
                if( rc != 0 ) {
@@ -93,7 +94,7 @@ retry:        /* transaction retry */
        }
 
        /* begin transaction */
-       rc = txn_begin( bdb->bi_dbenv, NULL, &ltid, 
+       rc = TXN_BEGIN( bdb->bi_dbenv, NULL, &ltid, 
                bdb->bi_db_opflags );
        text = NULL;
        if( rc != 0 ) {
@@ -581,7 +582,7 @@ retry:      /* transaction retry */
        e->e_nname = new_ndn;
 
        new_dn.bv_val = NULL;
-        new_ndn.bv_val = NULL;
+       new_ndn.bv_val = NULL;
 
        /* add new one */
        rc = bdb_dn2id_add( be, ltid, np_ndn, e );
@@ -623,30 +624,48 @@ retry:    /* transaction retry */
        }
 
        if( op->o_noop ) {
-               rc = txn_abort( ltid );
+               if(( rc=TXN_ABORT( ltid )) != 0 ) {
+                       text = "txn_abort (no-op) failed";
+               } else {
+                       rc = LDAP_SUCCESS;
+               }
+
        } else {
-               rc = txn_commit( ltid, 0 );
+               if(( rc=TXN_PREPARE( ltid, bdb_gid )) != 0 ) {
+                       text = "txn_prepare failed";
+               } else {
+                       if( bdb_cache_update_entry(&bdb->bi_cache, e) == -1 ) {
+                               if(( rc=TXN_ABORT( ltid )) != 0 ) {
+                                       text ="cache update & txn_abort failed";
+                               } else {
+                                       rc = LDAP_OTHER;
+                                       text = "cache update failed";
+                               }
+
+                       } else {
+                               if(( rc=TXN_COMMIT( ltid, 0 )) != 0 ) {
+                                       text = "txn_commit failed";
+                               } else {
+                                       rc = LDAP_SUCCESS;
+                               }
+                       }
+               }
        }
        ltid = NULL;
        op->o_private = NULL;
-
-       if( rc != 0 ) {
-               Debug( LDAP_DEBUG_TRACE,
-                       "bdb_modrdn: txn_%s failed: %s (%d)\n",
-                       op->o_noop ? "abort (no-op)" : "commit",
-                       db_strerror(rc), rc );
-               rc = LDAP_OTHER;
-               text = "commit failed";
-
-       } else {
-               (void) bdb_cache_update_entry(&bdb->bi_cache, e);
-               Debug( LDAP_DEBUG_TRACE,
-                       "bdb_modrdn: added%s id=%08lx dn=\"%s\"\n",
-                       op->o_noop ? " (no-op)" : "",
-                       e->e_id, e->e_dn );
-               rc = LDAP_SUCCESS;
+       if( rc == LDAP_SUCCESS ) {
+               Debug(LDAP_DEBUG_TRACE,
+                       "bdb_modrdn: rdn modified%s id=%08lx dn=\"%s\"\n",
+                       op->o_noop ? " (no-op)" : "", e->e_id, e->e_dn );
                text = NULL;
                bdb_cache_entry_commit( e );
+
+       } else {
+               Debug( LDAP_DEBUG_TRACE, "bdb_add: %s : %s (%d)\n",
+                       text, db_strerror(rc), rc );
+               rc = LDAP_OTHER;
        }
 
 return_results:
@@ -691,7 +710,7 @@ done:
        }
 
        if( ltid != NULL ) {
-               txn_abort( ltid );
+               TXN_ABORT( ltid );
                op->o_private = NULL;
        }
 
index 38cee4b7c6153126c4c30234c0671befd1b11aa2..bec86197894430933f815cbd5ff677c2b8bbcab5 100644 (file)
@@ -91,7 +91,7 @@ retry:        /* transaction retry */
                        bdb_cache_return_entry_w(&bdb->bi_cache, e);
                }
                Debug( LDAP_DEBUG_TRACE, "bdb_exop_passwd: retrying...\n", 0, 0, 0 );
-               rc = txn_abort( ltid );
+               rc = TXN_ABORT( ltid );
                ltid = NULL;
                op->o_private = NULL;
                if( rc != 0 ) {
@@ -103,7 +103,7 @@ retry:      /* transaction retry */
        }
 
        /* begin transaction */
-       rc = txn_begin( bdb->bi_dbenv, NULL, &ltid, 
+       rc = TXN_BEGIN( bdb->bi_dbenv, NULL, &ltid, 
                bdb->bi_db_opflags );
        *text = NULL;
        if( rc != 0 ) {
@@ -208,9 +208,9 @@ retry:      /* transaction retry */
 
                if( rc == 0 ) {
                        if( op->o_noop ) {
-                               rc = txn_abort( ltid );
+                               rc = TXN_ABORT( ltid );
                        } else {
-                               rc = txn_commit( ltid, 0 );
+                               rc = TXN_COMMIT( ltid, 0 );
                        }
                        ltid = NULL;
                }
@@ -231,7 +231,7 @@ done:
        }
 
        if( ltid != NULL ) {
-               txn_abort( ltid );
+               TXN_ABORT( ltid );
                op->o_private = NULL;
        }
 
index 737a0c8180e5790efcc56e1ea0c69f47dba1738c..bcec7c7c5525b977906c0e4d46cf236f366ee8ae 100644 (file)
@@ -130,7 +130,7 @@ ID bdb_tool_entry_put(
        Debug( LDAP_DEBUG_TRACE, "=> bdb_tool_entry_put( %ld, \"%s\" )\n",
                (long) e->e_id, e->e_dn, 0 );
 
-       rc = txn_begin( bdb->bi_dbenv, NULL, &tid, 
+       rc = TXN_BEGIN( bdb->bi_dbenv, NULL, &tid, 
                bdb->bi_db_opflags );
        if( rc != 0 ) {
                snprintf( text->bv_val, text->bv_len,
@@ -191,7 +191,7 @@ ID bdb_tool_entry_put(
 
 done:
        if( rc == 0 ) {
-               rc = txn_commit( tid, 0 );
+               rc = TXN_COMMIT( tid, 0 );
                if( rc != 0 ) {
                        snprintf( text->bv_val, text->bv_len,
                                        "txn_commit failed: %s (%d)",
@@ -203,7 +203,7 @@ done:
                }
 
        } else {
-               txn_abort( tid );
+               TXN_ABORT( tid );
                snprintf( text->bv_val, text->bv_len,
                        "txn_aborted! %s (%d)",
                        db_strerror(rc), rc );
@@ -238,7 +238,7 @@ int bdb_tool_entry_reindex(
                return -1;
        }
 
-       rc = txn_begin( bi->bi_dbenv, NULL, &tid, bi->bi_db_opflags );
+       rc = TXN_BEGIN( bi->bi_dbenv, NULL, &tid, bi->bi_db_opflags );
        if( rc != 0 ) {
                Debug( LDAP_DEBUG_ANY,
                        "=> bdb_tool_entry_reindex: txn_begin failed: %s (%d)\n",
@@ -274,7 +274,7 @@ int bdb_tool_entry_reindex(
 
 done:
        if( rc == 0 ) {
-               rc = txn_commit( tid, 0 );
+               rc = TXN_COMMIT( tid, 0 );
                if( rc != 0 ) {
                        Debug( LDAP_DEBUG_ANY,
                                "=> bdb_tool_entry_reindex: txn_commit failed: %s (%d)\n",
@@ -283,7 +283,7 @@ done:
                }
 
        } else {
-               txn_abort( tid );
+               TXN_ABORT( tid );
                Debug( LDAP_DEBUG_ANY,
                        "=> bdb_tool_entry_reindex: txn_aborted! %s (%d)\n",
                        db_strerror(rc), rc, 0 );