r25892: Keep the tdb code in sync between 3.2.x and 4.0.
authorJeremy Allison <jra@samba.org>
Wed, 7 Nov 2007 05:59:02 +0000 (06:59 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 21 Dec 2007 04:44:42 +0000 (05:44 +0100)
Add in the alarm fix to allow locks to exit on
alarm signal.
Sync up the changes in tools.
Jeremy.
(This used to be commit cb6c663fa8818f49cc36f196bb5f4dea47edd69e)

source4/lib/replace/replace.h
source4/lib/replace/system/wait.h
source4/lib/tdb/common/io.c
source4/lib/tdb/common/lock.c
source4/lib/tdb/common/tdb_private.h
source4/lib/tdb/include/tdb.h
source4/lib/tdb/tools/tdbbackup.c
source4/lib/tdb/tools/tdbdump.c
source4/lib/tdb/tools/tdbtool.c

index e42d5ff168ef864451ffc0cc81b1738ddc9719ff..55ed2e95705b34ea8dfba6b11676b3d77f4b4c89 100644 (file)
@@ -452,6 +452,10 @@ typedef int bool;
 #define MAX(a,b) ((a)>(b)?(a):(b))
 #endif
 
+#if !defined(HAVE_VOLATILE)
+#define volatile
+#endif
+
 /**
   this is a warning hack. The idea is to use this everywhere that we
   get the "discarding const" warning from gcc. That doesn't actually
index de94cf09d5b8c459528f8fb45f217504a1dd8082..5784b1ae924d139855ba25fb973bda72df69c652 100644 (file)
@@ -48,4 +48,8 @@
 #define SA_RESETHAND SA_ONESHOT
 #endif
 
+#if !defined(HAVE_SIG_ATOMIC_T_TYPE)
+typedef int sig_atomic_t;
+#endif
+
 #endif
index 3b7e712cfe78b7d9a584f0b3c41e56bd278a3968..c963e66ad4dcb89f7c29da73d2dc37a63a8d6f53 100644 (file)
@@ -94,7 +94,7 @@ static int tdb_write(struct tdb_context *tdb, tdb_off_t off,
                        /* try once more */
                        TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_write: wrote only "
                                 "%d of %d bytes at %d, trying once more\n",
-                                written, len, off));
+                                (int)written, len, off));
                        errno = ENOSPC;
                        written = pwrite(tdb->fd, (void *)((char *)buf+written),
                                         len-written,
@@ -274,11 +274,13 @@ static int tdb_expand_file(struct tdb_context *tdb, tdb_off_t size, tdb_off_t ad
                        return -1;
                } else if (written == -1) {
                        TDB_LOG((tdb, TDB_DEBUG_FATAL, "expand_file write of "
-                               "%d bytes failed (%s)\n", n, strerror(errno)));
+                                "%d bytes failed (%s)\n", (int)n,
+                                strerror(errno)));
                        return -1;
                } else if (written != n) {
                        TDB_LOG((tdb, TDB_DEBUG_WARNING, "expand_file: wrote "
-                               "only %d of %d bytes - retrying\n", written,n));
+                                "only %d of %d bytes - retrying\n", (int)written,
+                                (int)n));
                }
                addition -= written;
                size += written;
index c0cb9c8766cc0446719020c612ccda6a61ae09cf..e3fe888c465f357adb436b7230d8e3070f073a63 100644 (file)
 
 #define TDB_MARK_LOCK 0x80000000
 
+void tdb_setalarm_sigptr(struct tdb_context *tdb, volatile sig_atomic_t *ptr)
+{
+       tdb->interrupt_sig_ptr = ptr;
+}
+
 /* a byte range locking function - return 0 on success
    this functions locks/unlocks 1 byte at the specified offset.
 
@@ -60,6 +65,13 @@ int tdb_brlock(struct tdb_context *tdb, tdb_off_t offset,
 
        do {
                ret = fcntl(tdb->fd,lck_type,&fl);
+
+               /* Check for a sigalarm break. */
+               if (ret == -1 && errno == EINTR &&
+                               tdb->interrupt_sig_ptr &&
+                               *tdb->interrupt_sig_ptr) {
+                       break;
+               }
        } while (ret == -1 && errno == EINTR);
 
        if (ret == -1) {
index 99fa4434c0c1369cce457f9d9ed0515790e7068b..00bd0eb537a61f3639e577bd55bb2d8465c2876b 100644 (file)
@@ -28,6 +28,7 @@
 #include "system/time.h"
 #include "system/shmem.h"
 #include "system/select.h"
+#include "system/wait.h"
 #include "tdb.h"
 
 #ifndef HAVE_GETPAGESIZE
@@ -162,6 +163,7 @@ struct tdb_context {
        int page_size;
        int max_dead_records;
        bool have_transaction_lock;
+       volatile sig_atomic_t *interrupt_sig_ptr;
 };
 
 
index f3a0dbe7bf1c218c346f74eff5a5f3ae69ca3f52..7de4c419a81ea0c67b6faadfc22b0208c44a0c6b 100644 (file)
@@ -147,6 +147,8 @@ int tdb_chainunlock_read(struct tdb_context *tdb, TDB_DATA key);
 int tdb_chainlock_mark(struct tdb_context *tdb, TDB_DATA key);
 int tdb_chainlock_unmark(struct tdb_context *tdb, TDB_DATA key);
 
+void tdb_setalarm_sigptr(struct tdb_context *tdb, volatile sig_atomic_t *sigptr);
+
 /* Debug functions. Not used in production. */
 void tdb_dump_all(struct tdb_context *tdb);
 int tdb_printfreelist(struct tdb_context *tdb);
index dedfb9e6656fc408a059ce3ea54cd0990626e6e6..6f3ca48314f0ccbb0b48bcecf1637e0e3f628290 100644 (file)
@@ -44,6 +44,7 @@
 #include "system/locale.h"
 #include "system/time.h"
 #include "system/filesys.h"
+#include "system/wait.h"
 #include "tdb.h"
 
 #ifdef HAVE_GETOPT_H
index a654c0fb31682061188fe6cb40339a9deac3d771..8d930383b0918cc94ff2602f0685c95073273699 100644 (file)
@@ -21,6 +21,7 @@
 #include "system/locale.h"
 #include "system/time.h"
 #include "system/filesys.h"
+#include "system/wait.h"
 #include "tdb.h"
 
 static void print_data(TDB_DATA d)
index 580dd9d02ae17ec6059e7c2c8424bde97fca267c..79435a3571cf61f02233d088e7ce3f01354b19af 100644 (file)
@@ -24,6 +24,7 @@
 #include "system/locale.h"
 #include "system/time.h"
 #include "system/filesys.h"
+#include "system/wait.h"
 #include "tdb.h"
 
 static int do_command(void);
@@ -34,6 +35,7 @@ int bIterate = 0;
 char *line;
 TDB_DATA iterate_kbuf;
 char cmdline[1024];
+static int disable_mmap;
 
 enum commands {
        CMD_CREATE_TDB,
@@ -50,6 +52,8 @@ enum commands {
        CMD_LIST_HASH_FREE,
        CMD_LIST_FREE,
        CMD_INFO,
+       CMD_MMAP,
+       CMD_SPEED,
        CMD_FIRST,
        CMD_NEXT,
        CMD_SYSTEM,
@@ -77,6 +81,8 @@ COMMAND_TABLE cmd_table[] = {
        {"list",        CMD_LIST_HASH_FREE},
        {"free",        CMD_LIST_FREE},
        {"info",        CMD_INFO},
+       {"speed",       CMD_SPEED},
+       {"mmap",        CMD_MMAP},
        {"first",       CMD_FIRST},
        {"1",           CMD_FIRST},
        {"next",        CMD_NEXT},
@@ -87,6 +93,20 @@ COMMAND_TABLE cmd_table[] = {
        {NULL,          CMD_HELP}
 };
 
+struct timeval tp1,tp2;
+
+static void _start_timer(void)
+{
+       gettimeofday(&tp1,NULL);
+}
+
+static double _end_timer(void)
+{
+       gettimeofday(&tp2,NULL);
+       return((tp2.tv_sec - tp1.tv_sec) + 
+              (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
+}
+
 /* a tdb tool for manipulating a tdb database */
 
 static TDB_CONTEXT *tdb;
@@ -175,7 +195,7 @@ static void terror(const char *why)
 static void create_tdb(const char *tdbname)
 {
        if (tdb) tdb_close(tdb);
-       tdb = tdb_open(tdbname, 0, TDB_CLEAR_IF_FIRST,
+       tdb = tdb_open(tdbname, 0, TDB_CLEAR_IF_FIRST | (disable_mmap?TDB_NOMMAP:0),
                       O_RDWR | O_CREAT | O_TRUNC, 0600);
        if (!tdb) {
                printf("Could not create %s: %s\n", tdbname, strerror(errno));
@@ -185,7 +205,7 @@ static void create_tdb(const char *tdbname)
 static void open_tdb(const char *tdbname)
 {
        if (tdb) tdb_close(tdb);
-       tdb = tdb_open(tdbname, 0, 0, O_RDWR, 0600);
+       tdb = tdb_open(tdbname, 0, disable_mmap?TDB_NOMMAP:0, O_RDWR, 0600);
        if (!tdb) {
                printf("Could not open %s: %s\n", tdbname, strerror(errno));
        }
@@ -365,6 +385,31 @@ static void info_tdb(void)
                printf("%d records totalling %d bytes\n", count, total_bytes);
 }
 
+static void speed_tdb(const char *tlimit)
+{
+       unsigned timelimit = tlimit?atoi(tlimit):0;
+       double t;
+       int ops=0;
+       if (timelimit == 0) timelimit = 10;
+       printf("Testing traverse speed for %u seconds\n", timelimit);
+       _start_timer();
+       while ((t=_end_timer()) < timelimit) {
+               tdb_traverse(tdb, traverse_fn, NULL);
+               printf("%10.3f ops/sec\r", (++ops)/t);
+       }
+       printf("\n");
+}
+
+static void toggle_mmap(void)
+{
+       disable_mmap = !disable_mmap;
+       if (disable_mmap) {
+               printf("mmap is disabled\n");
+       } else {
+               printf("mmap is enabled\n");
+       }
+}
+
 static char *tdb_getline(const char *prompt)
 {
        static char thisline[1024];
@@ -493,6 +538,12 @@ static int do_command(void)
            case CMD_INFO:
                info_tdb();
                return 0;
+           case CMD_SPEED:
+               speed_tdb(arg1);
+               return 0;
+           case CMD_MMAP:
+               toggle_mmap();
+               return 0;
            case CMD_FIRST:
                bIterate = 1;
                first_record(tdb, &iterate_kbuf);