Hello community,

here is the log from the commit of package lmdb for openSUSE:Factory checked in 
at 2014-08-05 21:11:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/lmdb (Old)
 and      /work/SRC/openSUSE:Factory/.lmdb.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "lmdb"

Changes:
--------
--- /work/SRC/openSUSE:Factory/lmdb/lmdb.changes        2014-05-21 
16:19:49.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.lmdb.new/lmdb.changes   2014-08-05 
21:11:23.000000000 +0200
@@ -1,0 +2,9 @@
+Mon Jul 28 15:55:31 UTC 2014 - kkae...@suse.com
+
+- Prevent deadlock when process holding the db lock dies
+  0001-Patch-for-LMDB-to-use-robust-mutexes.patch
+
+- command line tools for debugging
+  0002-Add-extra-tools-and-CFEngine-modifications-for-LMDB.patch
+
+-------------------------------------------------------------------
@@ -16 +25 @@
-- Switch to cmake build
+- Switch to cmake, fix dynamic lib build and versioning.

New:
----
  0001-Patch-for-LMDB-to-use-robust-mutexes.patch
  0002-Add-extra-tools-and-CFEngine-modifications-for-LMDB.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ lmdb.spec ++++++
--- /var/tmp/diff_new_pack.btiAR5/_old  2014-08-05 21:11:24.000000000 +0200
+++ /var/tmp/diff_new_pack.btiAR5/_new  2014-08-05 21:11:24.000000000 +0200
@@ -28,6 +28,8 @@
 #Git-Clone:    git://git.openldap.org/openldap mdb.master
 Source:         %{name}-%{version}.tar.bz2
 Patch1:         automake.diff
+Patch2:         0001-Patch-for-LMDB-to-use-robust-mutexes.patch
+Patch3:         0002-Add-extra-tools-and-CFEngine-modifications-for-LMDB.patch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  autoconf
 BuildRequires:  automake >= 1.10
@@ -76,7 +78,12 @@
 
 %prep
 %setup -qn liblmdb
-%patch -P 1 -p1
+# PATCH-FIX-OPENSUSE - autotools files, jeng...@inai.de
+%patch1 -p1
+# PATCH-FIX-UPSTREAM - prevent deadlock when process holding db lock dies, 
kkae...@suse.de
+%patch2 -p1
+# PATCH-FIX-OPENSUSE - debugging tools (https://github.com/kacfengine/lmdb)
+%patch3 -p1
 
 %build
 mkdir -p m4

++++++ 0001-Patch-for-LMDB-to-use-robust-mutexes.patch ++++++
diff -wruN -x '*~' -x '*.o' -x '*.a' -x '*.so' -x '*.so.[0-9]' -x 
autom4te.cache -x .deps -x .libs ../orig-liblmdb/configure.ac ./configure.ac
--- ../orig-liblmdb/configure.ac        2014-07-28 17:44:41.873398363 +0200
+++ ./configure.ac      2014-07-28 17:47:06.143497590 +0200
@@ -9,5 +9,12 @@
 m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
 LT_INIT
 AC_CHECK_HEADERS([sys/file.h])
+AC_CHECK_LIB([pthread], [pthread_mutex_lock])
+AC_CHECK_LIB([pthreadGC2], [pthread_mutex_lock])
+AS_IF([test "$ac_cv_lib_pthread" = "no" && test "$ac_cv_lib_pthreadGC2" = 
"no"],
+[
+  AC_MSG_ERROR([Could not find pthreads library])
+])
+AC_CHECK_FUNCS([pthread_mutexattr_settype pthread_mutexattr_setrobust])
 AC_CONFIG_FILES([Makefile])
 AC_OUTPUT
diff -wruN -x '*~' -x '*.o' -x '*.a' -x '*.so' -x '*.so.[0-9]' -x 
autom4te.cache -x .deps -x .libs ../orig-liblmdb/mdb.c ./mdb.c
--- ../orig-liblmdb/mdb.c       2014-01-31 09:23:13.341427766 +0100
+++ ./mdb.c     2014-07-28 17:44:55.145959267 +0200
@@ -169,6 +169,7 @@
 #ifdef _WIN32
 #define MDB_USE_HASH   1
 #define MDB_PIDLOCK    0
+#define EOWNERDEAD      130
 #define pthread_t      DWORD
 #define pthread_mutex_t        HANDLE
 #define pthread_key_t  DWORD
@@ -179,7 +180,7 @@
 #define pthread_getspecific(x) TlsGetValue(x)
 #define pthread_setspecific(x,y)       (TlsSetValue(x,y) ? 0 : ErrCode())
 #define pthread_mutex_unlock(x)        ReleaseMutex(x)
-#define pthread_mutex_lock(x)  WaitForSingleObject(x, INFINITE)
+#define pthread_mutex_lock(x)  (WaitForSingleObject(x, INFINITE) == 
WAIT_ABANDONED ? EOWNERDEAD : 0) // masks FAIL and TIMEOUT error, but acceptable
 #define LOCK_MUTEX_R(env)      pthread_mutex_lock((env)->me_rmutex)
 #define UNLOCK_MUTEX_R(env)    pthread_mutex_unlock((env)->me_rmutex)
 #define LOCK_MUTEX_W(env)      pthread_mutex_lock((env)->me_wmutex)
@@ -2275,7 +2276,20 @@
                                        env->me_flags |= MDB_LIVE_READER;
                                }
 
-                               LOCK_MUTEX_R(env);
+                               rc = LOCK_MUTEX_R(env);
+                                switch (rc)
+                               {
+                               case 0:
+                                       break;
+#ifdef HAVE_PTHREAD_MUTEXATTR_SETROBUST
+                               case EOWNERDEAD:
+                                       // we cannot recover the state, so mark 
mutex as unusable
+                                       UNLOCK_MUTEX_R(env);
+                                       // FALLTHROUGH
+#endif
+                               default:
+                                       return MDB_PANIC;
+                               }
                                nr = ti->mti_numreaders;
                                for (i=0; i<nr; i++)
                                        if (ti->mti_readers[i].mr_pid == 0)
@@ -2305,7 +2319,20 @@
                }
        } else {
                if (ti) {
-                       LOCK_MUTEX_W(env);
+                       rc = LOCK_MUTEX_W(env);
+                        switch (rc)
+                        {
+                        case 0:
+                                break;
+#ifdef HAVE_PTHREAD_MUTEXATTR_SETROBUST
+                        case EOWNERDEAD:
+                                // we cannot recover the state, so mark mutex 
as unusable
+                                UNLOCK_MUTEX_W(env);
+                                // FALLTHROUGH
+#endif
+                        default:
+                                return MDB_PANIC;
+                        }
 
                        txn->mt_txnid = ti->mti_txnid;
                        meta = env->me_metas[txn->mt_txnid & 1];
@@ -4014,6 +4041,12 @@
                pthread_mutexattr_t mattr;
 
                if ((rc = pthread_mutexattr_init(&mattr))
+#ifdef HAVE_PTHREAD_MUTEXATTR_SETTYPE
+                        || (rc = pthread_mutexattr_settype(&mattr, 
PTHREAD_MUTEX_ERRORCHECK))
+#endif
+#ifdef HAVE_PTHREAD_MUTEXATTR_SETROBUST
+                        || (rc = pthread_mutexattr_setrobust(&mattr, 
PTHREAD_MUTEX_ROBUST))
+#endif
                        || (rc = pthread_mutexattr_setpshared(&mattr, 
PTHREAD_PROCESS_SHARED))
                        || (rc = pthread_mutex_init(&env->me_txns->mti_mutex, 
&mattr))
                        || (rc = pthread_mutex_init(&env->me_txns->mti_wmutex, 
&mattr)))
++++++ 0002-Add-extra-tools-and-CFEngine-modifications-for-LMDB.patch ++++++
diff -wruN -x '*~' -x '*.o' -x '*.a' -x '*.so' -x '*.so.[0-9]' -x 
autom4te.cache -x .deps -x .libs ../orig-liblmdb/lmdump.c ./lmdump.c
--- ../orig-liblmdb/lmdump.c    1970-01-01 01:00:00.000000000 +0100
+++ ./lmdump.c  2014-07-28 17:50:23.263838569 +0200
@@ -0,0 +1,128 @@
+/* lmdump.c - Lmdb database dumper
+   Has three modes :
+     -a : print keys in ascii form
+     -A : print keys and values in ascii form
+     -x : print keys and values in hexadecimal form
+     -d : print only the size of keys and values
+ */
+
+#define _XOPEN_SOURCE 500        /* srandom(), random() */
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+#include "lmdb.h"
+
+static void print_hex(char *s,  int len) 
+{
+    int i = 0;
+    for (i=0; i<len; i++)
+    {
+        printf("%02x", s[i]);
+    }
+}
+
+static void print_usage(void) 
+{
+    printf("Lmdb database dumper\n");
+    printf("Usage: dump -d|-x|-a|-A filename\n\n");
+    printf("Has three modes :\n");
+    printf("    -a : print keys in ascii form\n");
+    printf("    -A : print keys and values in ascii form\n");
+    printf("    -x : print keys and values in hexadecimal form\n");
+    printf("    -d : print only the size of keys and values\n");
+}
+
+static int report_error(int rc) 
+{
+    printf("err(%d): %s\n", rc, mdb_strerror(rc));   
+    return rc;
+}
+
+int main(int argc, char * argv[])
+{
+    int rc;
+    MDB_env *env;
+    MDB_dbi dbi;
+    MDB_val key, data;
+    MDB_txn *txn;
+    MDB_cursor *cursor;
+
+    if (argc<3)
+    {
+        print_usage();
+        return 1;
+    }
+    int mode = -1;
+    if (strcmp(argv[1],"-a") == 0)
+    {
+        mode = 'a';
+    }
+    else if (strcmp(argv[1],"-A") == 0)
+    {
+        mode = 'A';
+    }
+    else if(strcmp(argv[1],"-x") == 0)
+    {
+        mode = 'x';
+    }
+    else if(strcmp(argv[1],"-d") == 0)
+    {
+        mode = 'd';
+    }
+    else
+    {
+        print_usage();
+        return 1;
+    }
+    rc = mdb_env_create(&env);
+    if(rc) return report_error(rc);
+
+    rc = mdb_env_open(env, argv[2], MDB_NOSUBDIR, 0644);
+    if(rc) return report_error(rc);
+
+    rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);
+    if(rc) return report_error(rc);
+
+    rc = mdb_open(txn, NULL, 0, &dbi);
+    if(rc) return report_error(rc);
+
+    rc = mdb_cursor_open(txn, dbi, &cursor);
+    if(rc) return report_error(rc);
+
+    while( (rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) ==0)
+    {
+        if (mode == 'A')
+        {
+            printf("key: %p[%d] %.*s\n",
+                key.mv_data, (int) key.mv_size, (int) key.mv_size, (char *) 
key.mv_data);
+        }
+        else if (mode == 'a')
+        {
+            printf("key: %p[%d] %.*s, data: %p[%d] %.*s\n",
+                key.mv_data, (int) key.mv_size, (int) key.mv_size, (char *) 
key.mv_data,
+                data.mv_data, (int) data.mv_size, (int) data.mv_size, (char *) 
data.mv_data);
+        }
+        else if (mode == 'd')
+        {
+            printf("key: %p[%d] ,data: %p[%d]\n",
+                key.mv_data,  (int) key.mv_size,
+                data.mv_data, (int) data.mv_size);
+        }
+        else if (mode == 'x')
+        {
+            printf("key: %p[%d] ", key.mv_data,  (int) key.mv_size);
+            print_hex(key.mv_data,  (int) key.mv_size);
+            printf(" ,data: %p[%d] ", data.mv_data,  (int) data.mv_size);
+            print_hex(data.mv_data,  (int) data.mv_size);
+            printf("\n");
+        }
+    }
+    mdb_cursor_close(cursor);
+    mdb_close(env, dbi);
+
+    mdb_txn_abort(txn);
+    mdb_env_close(env);
+
+    return 0;
+}
diff -wruN -x '*~' -x '*.o' -x '*.a' -x '*.so' -x '*.so.[0-9]' -x 
autom4te.cache -x .deps -x .libs ../orig-liblmdb/lmmgr.c ./lmmgr.c
--- ../orig-liblmdb/lmmgr.c     1970-01-01 01:00:00.000000000 +0100
+++ ./lmmgr.c   2014-07-28 17:50:23.263838569 +0200
@@ -0,0 +1,201 @@
+/*
+lmmgr.c : Add, remove or manage the maxreaders value of a given database file
+*/
+#include <stdio.h>
+#include <string.h>
+#include "lmdb.h"
+
+static int report_error(int rc) 
+{
+    printf("err(%d): %s\n", rc, mdb_strerror(rc));   
+    return rc;
+}
+
+int openconn(const char *dbfile, MDB_env **env, long int maxreaders)
+{
+/*init*/
+    int rc;
+    rc = mdb_env_create(env);
+    if(rc) return report_error(rc);
+
+    rc = mdb_env_open(*env, dbfile, MDB_NOSUBDIR, 0644);
+    if(rc) return report_error(rc);
+    return 0;
+}
+
+int gettxn(MDB_env *env, MDB_txn **txn, MDB_dbi *dbi)
+{
+    int rc;
+/*setup txn*/
+    rc = mdb_txn_begin(env, NULL, 0, txn);
+    if(rc) return report_error(rc);
+    rc = mdb_open(*txn, NULL, 0, dbi);
+    if(rc) return report_error(rc);
+    return 0;
+}
+
+int committxn(MDB_txn *txn)
+{
+/*commit*/
+    int rc;
+    rc = mdb_txn_commit(txn);
+    return 0;
+}
+
+int aborttxn(MDB_txn *txn)
+{
+/*abort*/
+    int rc;
+    mdb_txn_abort(txn);
+    return 0;
+}
+
+int closeall(MDB_env *env, MDB_txn *txn, MDB_dbi dbi)
+{
+/*end*/
+    mdb_close(env, dbi);
+    mdb_env_close(env);
+    return 0;
+}
+
+int do_put(char *dbfile, char *mykey, char *myval)
+{
+    MDB_env *env;
+    openconn(dbfile, &env, 0);
+
+    MDB_txn *txn;
+    MDB_dbi dbi;
+    gettxn(env, &txn, &dbi);
+
+    int rc;
+    MDB_val key, data;
+    key.mv_data  = mykey;
+    data.mv_data = myval;
+    key.mv_size = strlen(mykey) + 1;
+    data.mv_size = strlen(myval) + 1;
+
+    rc = mdb_put(txn, dbi, &key, &data, MDB_NOOVERWRITE);
+    if (rc == MDB_SUCCESS)
+    {
+        rc = mdb_txn_commit(txn);
+    }
+    else
+    {
+        mdb_txn_abort(txn);
+    }
+
+    mdb_env_close(env);
+    return rc;
+}
+
+int do_del(char *dbfile, char *mykey)
+{
+    MDB_env *env;
+    openconn(dbfile, &env, 0);
+
+    MDB_txn *txn;
+    MDB_dbi dbi;
+    gettxn(env, &txn, &dbi);
+
+    int rc;
+    MDB_val key;
+    key.mv_data  = mykey;
+    key.mv_size = strlen(mykey) + 1;
+
+    rc = mdb_del(txn, dbi, &key, NULL);
+    if (rc == MDB_SUCCESS)
+    {
+        rc = mdb_txn_commit(txn);
+    }
+    else
+    {
+        mdb_txn_abort(txn);
+    }
+
+    mdb_env_close(env);
+    return rc;
+}
+
+int do_init(char *dbfile, unsigned long maxr)
+{
+    MDB_env *env;
+    openconn(dbfile, &env, maxr);
+    mdb_env_close(env);
+    return 0;
+}
+
+int do_stat(char *dbfile)
+{
+    int rc;
+    MDB_env *env;
+    openconn(dbfile, &env, 0);
+
+    MDB_stat stat;
+    MDB_envinfo info;
+
+    rc = mdb_env_stat(env, &stat);
+    rc = mdb_env_info(env, &info);
+    printf("me_maxreaders=%ld\n", info.me_maxreaders);
+    mdb_env_close(env);
+    return 0;
+}
+
+int main(int argc, char *argv[])
+{
+    if (argc < 3)
+    {
+        goto fail;
+    }
+
+    if (!strcmp(argv[1], "put"))
+    {
+        if (argc == 5)
+        {
+            int rc = do_put(argv[2], argv[3], argv[4]);
+            return rc;
+        }
+    }
+    else if (!strcmp(argv[1], "del"))
+    {
+        if (argc == 4)
+        {
+            int rc = do_del(argv[2], argv[3]);
+            return rc;
+        }
+    }
+    else if (!strcmp(argv[1], "init"))
+    {
+        if (argc == 3)
+        {
+            int rc = do_init(argv[2], 0L);
+            return rc;
+        }
+        else if (argc == 5 && !strcmp(argv[3], "-m"))
+        {
+            int rc = do_init(argv[2], atol(argv[4]));
+            do_stat(argv[2]);
+            return rc;
+        }
+    }
+    else if (!strcmp(argv[1], "maxr"))
+    {
+        if (argc == 3)
+        {
+            int rc = do_stat(argv[2]);
+            return rc;
+        }
+    }
+
+fail:
+    printf("Usage :\n");
+    printf("Add a key and value to a DB file :\n");
+    printf("\tlmmgr put dbfile key value\n");
+    printf("Remove a key from a DB file :\n");
+    printf("\tlmmgr del dbfile key\n");
+    printf("Set a new maxreaders value of a DB file :\n");
+    printf("\tlmmgr init dbfile [-m maxreaders]\n");
+    printf("Give maxreaders value of a DB file :\n");
+    printf("\tlmmgr maxr dbfile\n");
+
+    return 1;
+}
diff -wruN -x '*~' -x '*.o' -x '*.a' -x '*.so' -x '*.so.[0-9]' -x 
autom4te.cache -x .deps -x .libs ../orig-liblmdb/Makefile.am ./Makefile.am
--- ../orig-liblmdb/Makefile.am 2014-07-28 17:44:34.137071474 +0200
+++ ./Makefile.am       2014-07-28 17:58:11.979702178 +0200
@@ -4,7 +4,7 @@
 AM_CFLAGS = -W -Wall -Wno-unused-parameter -Wbad-function-cast -pthread
 LDADD = liblmdb.la
 
-bin_PROGRAMS = mdb_copy mdb_stat
+bin_PROGRAMS = mdb_copy mdb_stat lmdump lmmgr
 check_PROGRAMS = mtest mtest2 mtest3 mtest4 mtest5
 man_MANS = mdb_copy.1 mdb_stat.1
 include_HEADERS = lmdb.h
-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to