diff --git a/0001-Ticket-331-transaction-errors-with-db-4.3-and-db-4.2.patch b/0001-Ticket-331-transaction-errors-with-db-4.3-and-db-4.2.patch new file mode 100644 index 0000000..fb995c6 --- /dev/null +++ b/0001-Ticket-331-transaction-errors-with-db-4.3-and-db-4.2.patch @@ -0,0 +1,100 @@ +From 9c7e9d51309cb8daa900a3e37c56267477aa666d Mon Sep 17 00:00:00 2001 +From: Rich Megginson +Date: Wed, 28 Mar 2012 16:11:20 -0600 +Subject: [PATCH] Ticket #331 - transaction errors with db 4.3 and db 4.2 + +https://fedorahosted.org/389/ticket/331 +Resolves: Ticket #331 +Bug Description: transaction errors with db 4.3 and db 4.2 +Reviewed by: nhosoi (Thanks!) +Branch: master +Fix Description: +we are enabling transactions everywhere - since we are opening databases +with DB_AUTO_COMMIT we must either open and pass a valid txn handle to +all operations that modify the database (put, del) or we must pass the +DB_AUTO_COMMIT flag to those operations. +Platforms tested: RHEL6 x86_64, RHEL5 i386 +Flag Day: no +Doc impact: no +--- + ldap/servers/plugins/replication/cl5_api.c | 22 +++++++++++++++------- + 1 files changed, 15 insertions(+), 7 deletions(-) + +diff --git a/ldap/servers/plugins/replication/cl5_api.c b/ldap/servers/plugins/replication/cl5_api.c +index 3c02d41..2b57f91 100644 +--- a/ldap/servers/plugins/replication/cl5_api.c ++++ b/ldap/servers/plugins/replication/cl5_api.c +@@ -95,7 +95,15 @@ + #if 1000*DB_VERSION_MAJOR + 100*DB_VERSION_MINOR >= 4100 + #define USE_DB_TXN 1 /* use transactions */ + #define DEFAULT_DB_ENV_OP_FLAGS DB_AUTO_COMMIT +-#define DEFAULT_DB_OP_FLAGS 0 ++#if 1000*DB_VERSION_MAJOR + 100*DB_VERSION_MINOR <= 4300 ++/* we are enabling transactions everywhere - since we are opening databases ++ with DB_AUTO_COMMIT we must either open and pass a valid txn handle to ++ all operations that modify the database (put, del) or we must pass the ++ DB_AUTO_COMMIT flag to those operations */ ++#define DEFAULT_DB_OP_FLAGS(txn) (txn ? 0 : DB_AUTO_COMMIT) ++#else ++#define DEFAULT_DB_OP_FLAGS(txn) 0 ++#endif + #define DB_OPEN(oflags, db, txnid, file, database, type, flags, mode, rval) \ + { \ + if (((oflags) & DB_INIT_TXN) && ((oflags) & DB_INIT_LOG)) \ +@@ -108,7 +116,7 @@ + } \ + } + #else /* older then db 41 */ +-#define DEFAULT_DB_OP_FLAGS 0 ++#define DEFAULT_DB_OP_FLAGS(txn) 0 + #define DB_OPEN(oflags, db, txnid, file, database, type, flags, mode, rval) \ + (rval) = (db)->open((db), (file), (database), (type), (flags), (mode)) + #endif +@@ -3676,7 +3684,7 @@ static int _cl5ReadRUV (const char *replGen, Object *obj, PRBool purge) + + /* delete the entry; it is re-added when file + is successfully closed */ +- file->db->del (file->db, NULL, &key, DEFAULT_DB_OP_FLAGS); ++ file->db->del (file->db, NULL, &key, DEFAULT_DB_OP_FLAGS(NULL)); + + rc = CL5_SUCCESS; + goto done; +@@ -3747,7 +3755,7 @@ static int _cl5WriteRUV (CL5DBFile *file, PRBool purge) + return CL5_DB_ERROR; + } + #endif +- rc = file->db->put(file->db, txnid, &key, &data, DEFAULT_DB_OP_FLAGS); ++ rc = file->db->put(file->db, txnid, &key, &data, DEFAULT_DB_OP_FLAGS(txnid)); + + slapi_ch_free (&(data.data)); + if ( rc == 0 ) +@@ -4039,7 +4047,7 @@ static int _cl5GetEntryCount (CL5DBFile *file) + + /* delete the entry. the entry is re-added when file + is successfully closed */ +- file->db->del (file->db, NULL, &key, DEFAULT_DB_OP_FLAGS); ++ file->db->del (file->db, NULL, &key, DEFAULT_DB_OP_FLAGS(NULL)); + slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name_cl, + "_cl5GetEntryCount: %d changes for replica %s\n", + file->entryCount, file->replName); +@@ -4103,7 +4111,7 @@ static int _cl5WriteEntryCount (CL5DBFile *file) + return CL5_DB_ERROR; + } + #endif +- rc = file->db->put(file->db, txnid, &key, &data, DEFAULT_DB_OP_FLAGS); ++ rc = file->db->put(file->db, txnid, &key, &data, DEFAULT_DB_OP_FLAGS(txnid)); + if (rc == 0) + { + #if 1000*DB_VERSION_MAJOR + 100*DB_VERSION_MINOR < 4100 +@@ -4599,7 +4607,7 @@ static int _cl5WriteOperationTxn(const char *replName, const char *replGen, + { + PR_WaitSemaphore(file->sema); + } +- rc = file->db->put(file->db, txnid, &key, data, DEFAULT_DB_OP_FLAGS); ++ rc = file->db->put(file->db, txnid, &key, data, DEFAULT_DB_OP_FLAGS(txnid)); + if ( file->sema ) + { + PR_PostSemaphore(file->sema); +-- +1.7.1 + diff --git a/389-ds-base.spec b/389-ds-base.spec index 086d71b..55a57f2 100644 --- a/389-ds-base.spec +++ b/389-ds-base.spec @@ -18,7 +18,7 @@ Summary: 389 Directory Server (base) Name: 389-ds-base Version: 1.2.10.4 -Release: %{?relprefix}2%{?prerel}%{?dist} +Release: %{?relprefix}3%{?prerel}%{?dist} License: GPLv2 with exceptions URL: http://port389.org/ Group: System Environment/Daemons @@ -103,6 +103,7 @@ Source0: http://port389.org/sources/%{name}-%{version}%{?prerel}.tar.bz # 389-ds-git.sh should be used to generate the source tarball from git Source1: %{name}-git.sh Source2: %{name}-devel.README +Patch0: 0001-Ticket-331-transaction-errors-with-db-4.3-and-db-4.2.patch %description 389 Directory Server is an LDAPv3 compliant server. The base package includes @@ -159,6 +160,7 @@ SELinux policy interface for the 389 Directory Server base package. %prep %setup -q -n %{name}-%{version}%{?prerel} cp %{SOURCE2} README.devel +%patch0 -p1 %build %if %{use_openldap} @@ -348,6 +350,9 @@ exit 0 %{_libdir}/%{pkgname}/libslapd.so.* %changelog +* Wed Mar 28 2012 Rich Megginson - 1.2.10.4-3 +- Ticket #331 - transaction errors with db 4.3 and db 4.2 + * Tue Mar 13 2012 Rich Megginson - 1.2.10.4-2 - rebuild