Tweak I/O, fix last commit.
authorHallvard Furuseth <hallvard@openldap.org>
Wed, 26 Jun 2013 16:02:17 +0000 (18:02 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Wed, 26 Jun 2013 16:02:17 +0000 (18:02 +0200)
libraries/liblmdb/mdb.c

index 84f32c6..c0f4398 100644 (file)
@@ -995,6 +995,9 @@ typedef struct MDB_ntxn {
 #define MDB_COMMIT_PAGES       IOV_MAX
 #endif
 
+       /* max bytes to write in one call */
+#define MAX_WRITE              (0x80000000U >> (sizeof(ssize_t) == 4))
+
 static int  mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp);
 static int  mdb_page_new(MDB_cursor *mc, uint32_t flags, int num, MDB_page **mp);
 static int  mdb_page_touch(MDB_cursor *mc);
@@ -2260,23 +2263,27 @@ mdb_page_flush(MDB_txn *txn)
                }
 #else
                /* Write up to MDB_COMMIT_PAGES dirty pages at a time. */
-               if (pos != next_pos || n == MDB_COMMIT_PAGES) {
+               if (pos!=next_pos || n==MDB_COMMIT_PAGES || wsize+size>MAX_WRITE) {
                        if (n) {
                                /* Write previous page(s) */
-#ifdef HAVE_PWRITEV
+#ifdef MDB_USE_PWRITEV
                                wres = pwritev(env->me_fd, iov, n, wpos);
 #else
-                               if (lseek(env->me_fd, wpos, SEEK_SET) < 0) {
-                                       rc = ErrCode();
-                                       DPRINTF("lseek: %s", strerror(rc));
-                                       return rc;
+                               if (n == 1) {
+                                       wres = pwrite(env->me_fd, iov[0].iov_base, wsize, wpos);
+                               } else {
+                                       if (lseek(env->me_fd, wpos, SEEK_SET) < 0) {
+                                               rc = ErrCode();
+                                               DPRINTF("lseek: %s", strerror(rc));
+                                               return rc;
+                                       }
+                                       wres = writev(env->me_fd, iov, n);
                                }
-                               wres = writev(env->me_fd, iov, n);
 #endif
                                if (wres != wsize) {
                                        if (wres < 0) {
                                                rc = ErrCode();
-                                               DPRINTF("writev: %s", strerror(rc));
+                                               DPRINTF("Write error: %s", strerror(rc));
                                        } else {
                                                rc = EIO; /* TODO: Use which error code? */
                                                DPUTS("short write, filesystem full?");
@@ -2685,6 +2692,8 @@ mdb_env_write_meta(MDB_txn *txn)
                meta.mm_last_pg = metab.mm_last_pg;
                meta.mm_txnid = metab.mm_txnid;
 #ifdef _WIN32
+               memset(&ov, 0, sizeof(ov));
+               ov.Offset = off;
                WriteFile(env->me_fd, ptr, len, NULL, &ov);
 #else
                r2 = pwrite(env->me_fd, ptr, len, off);
@@ -3615,7 +3624,6 @@ mdb_env_copyfd(MDB_env *env, HANDLE fd)
 
        ptr = env->me_map + wsize;
        wsize = txn->mt_next_pgno * env->me_psize - wsize;
-#define MAX_WRITE      2147483648U
 #ifdef _WIN32
        while (wsize > 0) {
                DWORD len, w2;
@@ -3638,7 +3646,7 @@ mdb_env_copyfd(MDB_env *env, HANDLE fd)
                else
                        w2 = wsize;
                wres = write(fd, ptr, w2);
-               rc = wres == (ssize_t)w2 ? MDB_SUCCESS : rc < 0 ? ErrCode() : EIO;
+               rc = wres == (ssize_t)w2 ? MDB_SUCCESS : wres < 0 ? ErrCode() : EIO;
                if (rc) break;
                wsize -= wres;
                ptr += wres;