diff options
| author | George Hazan <ghazan@miranda.im> | 2018-09-16 18:35:44 +0300 | 
|---|---|---|
| committer | George Hazan <ghazan@miranda.im> | 2018-09-16 18:35:44 +0300 | 
| commit | cee72905099ee7be2bc7327907e09a28f2220d15 (patch) | |
| tree | 032f8d06707e2e4fd57f8bb9c9a3c086fbc847ac /libs/libmdbx/src | |
| parent | 50d176bfe78d4b5ffd829a874e503facef398e7d (diff) | |
libmdbx: fix for GC
Diffstat (limited to 'libs/libmdbx/src')
| -rw-r--r-- | libs/libmdbx/src/appveyor.yml | 20 | ||||
| -rw-r--r-- | libs/libmdbx/src/src/mdbx.c | 109 | ||||
| -rw-r--r-- | libs/libmdbx/src/test/log.cc | 6 | ||||
| -rw-r--r-- | libs/libmdbx/src/test/log.h | 2 | ||||
| -rw-r--r-- | libs/libmdbx/src/test/osal-windows.cc | 5 | ||||
| -rw-r--r-- | libs/libmdbx/src/test/test.vcxproj | 4 | 
6 files changed, 92 insertions, 54 deletions
diff --git a/libs/libmdbx/src/appveyor.yml b/libs/libmdbx/src/appveyor.yml index 1ee3a467c8..10a9ab2915 100644 --- a/libs/libmdbx/src/appveyor.yml +++ b/libs/libmdbx/src/appveyor.yml @@ -19,7 +19,7 @@ configuration:  platform:  - x86 -#- x64 +- x64  #- ARM  build_script: @@ -32,21 +32,23 @@ build_script:  test_script:  - ps: | -    if (($env:PLATFORM -eq "x86") -and (Test-Path "C:\projects\libmdbx\Win32\$env:CONFIGURATION\test.exe" -PathType Leaf)) { -      $test = "C:\projects\libmdbx\Win32\$env:CONFIGURATION\test.exe" +    if (($env:PLATFORM -eq "x86") -and (Test-Path "C:\projects\libmdbx\Win32\$env:CONFIGURATION\mdbx_test.exe" -PathType Leaf)) { +      $mdbx_test = "C:\projects\libmdbx\Win32\$env:CONFIGURATION\mdbx_test.exe"        $mdbx_chk = "C:\projects\libmdbx\Win32\$env:CONFIGURATION\mdbx_chk.exe"      } elseif (($env:PLATFORM -ne "ARM") -and ($env:PLATFORM -ne "ARM64")) { -      $test = "C:\projects\libmdbx\$env:PLATFORM\$env:CONFIGURATION\test.exe" +      $mdbx_test = "C:\projects\libmdbx\$env:PLATFORM\$env:CONFIGURATION\mdbx_test.exe"        $mdbx_chk = "C:\projects\libmdbx\$env:PLATFORM\$env:CONFIGURATION\mdbx_chk.exe"      } else { -      $test = "" +      $mdbx_test = ""        $mdbx_chk = ""      } -    if ($test -ne "") { -        & "$test" --pathname=tmp.db --dont-cleanup-after basic | Tee-Object -file test.log | Select-Object -last 42 -        & "$mdbx_chk" -nvv tmp.db | Tee-Object -file chk.log | Select-Object -last 42 +    if ($mdbx_test -ne "") { +        & "$mdbx_test" --pathname=test.db --dont-cleanup-after basic | Tee-Object -file test.log | Select-Object -last 42 +        & "$mdbx_chk" -nvv test.db | Tee-Object -file chk.log | Select-Object -last 42      }  on_failure: -- ps: Push-AppveyorArtifact test.log chk.log +- ps: Push-AppveyorArtifact test.log +- ps: Push-AppveyorArtifact test.db +- ps: Push-AppveyorArtifact chk.log diff --git a/libs/libmdbx/src/src/mdbx.c b/libs/libmdbx/src/src/mdbx.c index 3d576eca68..82e0959134 100644 --- a/libs/libmdbx/src/src/mdbx.c +++ b/libs/libmdbx/src/src/mdbx.c @@ -2408,7 +2408,7 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,                           last, txn->mt_dbs[FREE_DBI].md_root, repg_pos);          unsigned i;          for (i = repg_pos; i; i--) -          mdbx_debug_extra_print(" %" PRIaPGNO "", re_pnl[i]); +          mdbx_debug_extra_print(" %" PRIaPGNO, re_pnl[i]);          mdbx_debug_extra_print("\n");        } @@ -2511,7 +2511,7 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,           * just for resume reclaiming only, not for data consistency. */          mdbx_debug("kick-gc: head %" PRIaTXN "-%s, tail %" PRIaTXN -                   "-%s, oldest %" PRIaTXN "", +                   "-%s, oldest %" PRIaTXN,                     mdbx_meta_txnid_stable(env, head), mdbx_durable_str(head),                     mdbx_meta_txnid_stable(env, steady),                     mdbx_durable_str(steady), oldest); @@ -3576,7 +3576,7 @@ static int mdbx_prep_backlog(MDBX_txn *txn, MDBX_cursor *mc) {  /* Count all the pages in each DB and in the freelist and make sure   * it matches the actual number of pages being used.   * All named DBs must be open for a correct count. */ -static int mdbx_audit(MDBX_txn *txn, unsigned befree_stored) { +static __cold int mdbx_audit(MDBX_txn *txn, unsigned befree_stored) {    MDBX_val key, data;    const pgno_t pending = @@ -3674,12 +3674,11 @@ static int mdbx_update_gc(MDBX_txn *txn) {    (void)dbg_prefix_mode;    mdbx_trace("\n>>> @%" PRIaTXN, txn->mt_txnid); +  unsigned befree_stored = 0, loop = 0;    MDBX_cursor mc;    int rc = mdbx_cursor_init(&mc, txn, FREE_DBI);    if (unlikely(rc != MDBX_SUCCESS)) -    return rc; - -  unsigned befree_stored = 0, loop = 0; +    goto bailout;  retry:    mdbx_trace(" >> restart"); @@ -3762,6 +3761,11 @@ retry:      // handle loose pages - put ones into the reclaimed- or befree-list      mdbx_tassert(txn, mdbx_pnl_check(env->me_reclaimed_pglist, true)); +    if (mdbx_audit_enabled()) { +      rc = mdbx_audit(txn, befree_stored); +      if (unlikely(rc != MDBX_SUCCESS)) +        goto bailout; +    }      if (txn->mt_loose_pages) {        /* Return loose page numbers to me_reclaimed_pglist,         * though usually none are left at this point. @@ -3772,7 +3776,7 @@ retry:           * since unable to return them to me_reclaimed_pglist. */          if (unlikely((rc = mdbx_pnl_need(&txn->mt_befree_pages,                                           txn->mt_loose_count)) != 0)) -          return rc; +          goto bailout;          for (MDBX_page *mp = txn->mt_loose_pages; mp; mp = NEXT_LOOSE_PAGE(mp))            mdbx_pnl_xappend(txn->mt_befree_pages, mp->mp_pgno);          mdbx_trace("%s: append %u loose-pages to befree-pages", dbg_prefix_mode, @@ -3851,6 +3855,11 @@ retry:        txn->mt_loose_pages = NULL;        txn->mt_loose_count = 0; +      if (mdbx_audit_enabled()) { +        rc = mdbx_audit(txn, befree_stored); +        if (unlikely(rc != MDBX_SUCCESS)) +          goto bailout; +      }      }      // handle reclaimed pages - return suitable into unallocated space @@ -3884,6 +3893,11 @@ retry:              dbg_prefix_mode, txn->mt_next_pgno - tail, tail, txn->mt_next_pgno);          txn->mt_next_pgno = tail;          mdbx_tassert(txn, mdbx_pnl_check(env->me_reclaimed_pglist, true)); +        if (mdbx_audit_enabled()) { +          rc = mdbx_audit(txn, befree_stored); +          if (unlikely(rc != MDBX_SUCCESS)) +            goto bailout; +        }        }      } @@ -3920,7 +3934,7 @@ retry:                           " num %u, PNL",                           txn->mt_txnid, txn->mt_dbs[FREE_DBI].md_root, i);          for (; i; i--) -          mdbx_debug_extra_print(" %" PRIaPGNO "", txn->mt_befree_pages[i]); +          mdbx_debug_extra_print(" %" PRIaPGNO, txn->mt_befree_pages[i]);          mdbx_debug_extra_print("\n");        }        continue; @@ -3931,6 +3945,11 @@ retry:      mdbx_tassert(txn, txn->mt_loose_count == 0);      mdbx_trace(" >> reserving"); +    if (mdbx_audit_enabled()) { +      rc = mdbx_audit(txn, befree_stored); +      if (unlikely(rc != MDBX_SUCCESS)) +        goto bailout; +    }      const unsigned amount =          env->me_reclaimed_pglist ? MDBX_PNL_SIZE(env->me_reclaimed_pglist) : 0;      const unsigned left = amount - settled; @@ -4213,6 +4232,11 @@ retry:                   (unsigned)(to - env->me_reclaimed_pglist), to[-1], fill_gc_id);        left -= chunk; +      if (mdbx_audit_enabled()) { +        rc = mdbx_audit(txn, befree_stored + amount - left); +        if (unlikely(rc != MDBX_SUCCESS)) +          goto bailout; +      }        if (left == 0) {          rc = MDBX_SUCCESS;          break; @@ -4240,11 +4264,12 @@ retry:      goto retry;    } +  mdbx_tassert(txn, +               txn->mt_lifo_reclaimed == NULL || +                   cleaned_gc_slot == MDBX_PNL_SIZE(txn->mt_lifo_reclaimed)); +  bailout:    if (txn->mt_lifo_reclaimed) { -    mdbx_tassert(txn, -                 rc != MDBX_SUCCESS || -                     cleaned_gc_slot == MDBX_PNL_SIZE(txn->mt_lifo_reclaimed));      MDBX_PNL_SIZE(txn->mt_lifo_reclaimed) = 0;      if (txn != env->me_txn0) {        mdbx_txl_free(txn->mt_lifo_reclaimed); @@ -4328,7 +4353,7 @@ static int mdbx_page_flush(MDBX_txn *txn, pgno_t keep) {        wpos = pos;        wsize = 0;      } -    mdbx_debug("committing page %" PRIaPGNO "", pgno); +    mdbx_debug("committing page %" PRIaPGNO, pgno);      next_pos = pos + size;      iov[n].iov_len = size;      iov[n].iov_base = (char *)dp; @@ -6289,15 +6314,15 @@ int __cold mdbx_env_open(MDBX_env *env, const char *path, unsigned flags,      mdbx_debug("opened database version %u, pagesize %u",                 (uint8_t)meta->mm_magic_and_version, env->me_psize); -    mdbx_debug("using meta page %" PRIaPGNO ", txn %" PRIaTXN "", +    mdbx_debug("using meta page %" PRIaPGNO ", txn %" PRIaTXN,                 container_of(meta, MDBX_page, mp_data)->mp_pgno,                 mdbx_meta_txnid_fluid(env, meta));      mdbx_debug("depth: %u", db->md_depth); -    mdbx_debug("entries: %" PRIu64 "", db->md_entries); -    mdbx_debug("branch pages: %" PRIaPGNO "", db->md_branch_pages); -    mdbx_debug("leaf pages: %" PRIaPGNO "", db->md_leaf_pages); -    mdbx_debug("overflow pages: %" PRIaPGNO "", db->md_overflow_pages); -    mdbx_debug("root: %" PRIaPGNO "", db->md_root); +    mdbx_debug("entries: %" PRIu64, db->md_entries); +    mdbx_debug("branch pages: %" PRIaPGNO, db->md_branch_pages); +    mdbx_debug("leaf pages: %" PRIaPGNO, db->md_leaf_pages); +    mdbx_debug("overflow pages: %" PRIaPGNO, db->md_overflow_pages); +    mdbx_debug("root: %" PRIaPGNO, db->md_root);    }  #endif @@ -6576,7 +6601,7 @@ static MDBX_node *__hot mdbx_node_search(MDBX_cursor *mc, MDBX_val *key,    const unsigned nkeys = NUMKEYS(mp); -  mdbx_debug("searching %u keys in %s %spage %" PRIaPGNO "", nkeys, +  mdbx_debug("searching %u keys in %s %spage %" PRIaPGNO, nkeys,               IS_LEAF(mp) ? "leaf" : "branch", IS_SUBP(mp) ? "sub-" : "",               mp->mp_pgno); @@ -6779,7 +6804,7 @@ static int mdbx_page_search_root(MDBX_cursor *mc, MDBX_val *key, int flags) {       * while in the process of rebalancing a FreeDB branch page; we must       * let that proceed. ITS#8336 */      mdbx_cassert(mc, !mc->mc_dbi || NUMKEYS(mp) > 1); -    mdbx_debug("found index 0 to page %" PRIaPGNO "", NODEPGNO(NODEPTR(mp, 0))); +    mdbx_debug("found index 0 to page %" PRIaPGNO, NODEPGNO(NODEPTR(mp, 0)));      if (flags & (MDBX_PS_FIRST | MDBX_PS_LAST)) {        i = 0; @@ -7714,8 +7739,10 @@ int mdbx_cursor_get(MDBX_cursor *mc, MDBX_val *key, MDBX_val *data,        return MDBX_INCOMPATIBLE;    /* FALLTHRU */    case MDBX_SET: +#ifndef SLAPD_LMDB_LEGACY      if (op == MDBX_SET && unlikely(data != NULL))        return MDBX_EINVAL; +#endif /* SLAPD_LMDB_LEGACY */    /* FALLTHRU */    case MDBX_SET_KEY:    case MDBX_SET_RANGE: @@ -8351,7 +8378,8 @@ new_sub:    } else {      /* There is room already in this leaf page. */      if (IS_LEAF2(mc->mc_pg[mc->mc_top])) { -      mdbx_cassert(mc, nflags == 0 && rdata->iov_len == 0); +      mdbx_cassert(mc, (nflags & (F_BIGDATA | F_SUBDATA | F_DUPDATA)) == 0 && +                           rdata->iov_len == 0);        rc = mdbx_node_add_leaf2(mc, mc->mc_ki[mc->mc_top], key);      } else        rc = mdbx_node_add_leaf(mc, mc->mc_ki[mc->mc_top], key, rdata, nflags); @@ -8837,7 +8865,7 @@ static int __must_check_result mdbx_node_add_leaf(MDBX_cursor *mc,      int rc = mdbx_page_new(mc, P_OVERFLOW, ovpages, &largepage);      if (unlikely(rc != MDBX_SUCCESS))        return rc; -    mdbx_debug("allocated overflow page %" PRIaPGNO "", largepage->mp_pgno); +    mdbx_debug("allocated overflow page %" PRIaPGNO, largepage->mp_pgno);      flags |= F_BIGDATA;      node_size += sizeof(pgno_t);      mdbx_cassert(mc, mdbx_leaf_size(mc->mc_txn->mt_env, key, data) == @@ -8960,7 +8988,7 @@ static int mdbx_node_add(MDBX_cursor *mc, unsigned indx, const MDBX_val *key,          goto full;        if ((rc = mdbx_page_new(mc, P_OVERFLOW, ovpages, &ofp)))          return rc; -      mdbx_debug("allocated overflow page %" PRIaPGNO "", ofp->mp_pgno); +      mdbx_debug("allocated overflow page %" PRIaPGNO, ofp->mp_pgno);        flags |= F_BIGDATA;        goto update;      } else { @@ -9020,9 +9048,9 @@ update:  full:    mdbx_debug("not enough room in page %" PRIaPGNO ", got %u ptrs", mp->mp_pgno,               NUMKEYS(mp)); -  mdbx_debug("upper-lower = %u - %u = %" PRIiPTR "", mp->mp_upper, mp->mp_lower, +  mdbx_debug("upper-lower = %u - %u = %" PRIiPTR, mp->mp_upper, mp->mp_lower,               room); -  mdbx_debug("node size = %" PRIuPTR "", node_size); +  mdbx_debug("node size = %" PRIuPTR, node_size);    mc->mc_txn->mt_flags |= MDBX_TXN_ERROR;    return MDBX_PAGE_FULL;  } @@ -9039,7 +9067,7 @@ static void mdbx_node_del(MDBX_cursor *mc, size_t ksize) {    MDBX_node *node;    char *base; -  mdbx_debug("delete node %u on %s page %" PRIaPGNO "", indx, +  mdbx_debug("delete node %u on %s page %" PRIaPGNO, indx,               IS_LEAF(mp) ? "leaf" : "branch", mp->mp_pgno);    numkeys = NUMKEYS(mp);    mdbx_cassert(mc, indx < numkeys); @@ -9210,7 +9238,7 @@ static int mdbx_xcursor_init1(MDBX_cursor *mc, MDBX_node *node) {          mx->mx_db.md_flags |= MDBX_INTEGERKEY;      }    } -  mdbx_debug("Sub-db -%u root page %" PRIaPGNO "", mx->mx_cursor.mc_dbi, +  mdbx_debug("Sub-db -%u root page %" PRIaPGNO, mx->mx_cursor.mc_dbi,               mx->mx_db.md_root);    mx->mx_dbflag = DB_VALID | DB_USRVALID | DB_DUPDATA;    /* FIXME: #if UINT_MAX < SIZE_MAX @@ -9248,7 +9276,7 @@ static int mdbx_xcursor_init2(MDBX_cursor *mc, MDBX_xcursor *src_mx,    }    mx->mx_db = src_mx->mx_db;    mx->mx_cursor.mc_pg[0] = src_mx->mx_cursor.mc_pg[0]; -  mdbx_debug("Sub-db -%u root page %" PRIaPGNO "", mx->mx_cursor.mc_dbi, +  mdbx_debug("Sub-db -%u root page %" PRIaPGNO, mx->mx_cursor.mc_dbi,               mx->mx_db.md_root);    return MDBX_SUCCESS;  } @@ -9478,8 +9506,8 @@ static int mdbx_update_key(MDBX_cursor *mc, const MDBX_val *key) {      char kbuf2[DKBUF_MAXKEYSIZE * 2 + 1];      k2.iov_base = NODEKEY(node);      k2.iov_len = node->mn_ksize; -    mdbx_debug("update key %u (ofs %u) [%s] to [%s] on page %" PRIaPGNO "", -               indx, ptr, mdbx_dkey(&k2, kbuf2, sizeof(kbuf2)), DKEY(key), +    mdbx_debug("update key %u (ofs %u) [%s] to [%s] on page %" PRIaPGNO, indx, +               ptr, mdbx_dkey(&k2, kbuf2, sizeof(kbuf2)), DKEY(key),                 mp->mp_pgno);    } @@ -9814,7 +9842,7 @@ static int mdbx_page_merge(MDBX_cursor *csrc, MDBX_cursor *cdst) {    MDBX_page *const psrc = csrc->mc_pg[csrc->mc_top];    MDBX_page *const pdst = cdst->mc_pg[cdst->mc_top]; -  mdbx_debug("merging page %" PRIaPGNO " into %" PRIaPGNO "", psrc->mp_pgno, +  mdbx_debug("merging page %" PRIaPGNO " into %" PRIaPGNO, psrc->mp_pgno,               pdst->mp_pgno);    mdbx_cassert(csrc, PAGETYPE(psrc) == PAGETYPE(pdst)); @@ -10542,7 +10570,7 @@ static int mdbx_page_split(MDBX_cursor *mc, const MDBX_val *newkey,    if ((rc = mdbx_page_new(mc, mp->mp_flags, 1, &rp)))      return rc;    rp->mp_leaf2_ksize = mp->mp_leaf2_ksize; -  mdbx_debug("new right sibling: page %" PRIaPGNO "", rp->mp_pgno); +  mdbx_debug("new right sibling: page %" PRIaPGNO, rp->mp_pgno);    /* Usually when splitting the root page, the cursor     * height is 1. But when called from mdbx_update_key, @@ -10560,7 +10588,7 @@ static int mdbx_page_split(MDBX_cursor *mc, const MDBX_val *newkey,      mc->mc_pg[0] = pp;      mc->mc_ki[0] = 0;      mc->mc_db->md_root = pp->mp_pgno; -    mdbx_debug("root split! new root = %" PRIaPGNO "", pp->mp_pgno); +    mdbx_debug("root split! new root = %" PRIaPGNO, pp->mp_pgno);      foliage = mc->mc_db->md_depth++;      /* Add left (implicit) pointer. */ @@ -10578,7 +10606,7 @@ static int mdbx_page_split(MDBX_cursor *mc, const MDBX_val *newkey,      ptop = 0;    } else {      ptop = mc->mc_top - 1; -    mdbx_debug("parent branch page is %" PRIaPGNO "", mc->mc_pg[ptop]->mp_pgno); +    mdbx_debug("parent branch page is %" PRIaPGNO, mc->mc_pg[ptop]->mp_pgno);    }    mdbx_cursor_copy(mc, &mn); @@ -10797,16 +10825,17 @@ static int mdbx_page_split(MDBX_cursor *mc, const MDBX_val *newkey,      mc->mc_ki[mc->mc_top] = 0;      switch (PAGETYPE(rp)) {      case P_BRANCH: { -      mdbx_cassert(mc, nflags == 0); +      mdbx_cassert(mc, (nflags & (F_BIGDATA | F_SUBDATA | F_DUPDATA)) == 0); +      mdbx_cassert(mc, newpgno != 0 || newpgno != P_INVALID);        rc = mdbx_node_add_branch(mc, 0, newkey, newpgno);      } break;      case P_LEAF: { -      mdbx_cassert(mc, newpgno == 0); +      mdbx_cassert(mc, newpgno == 0 || newpgno == P_INVALID);        rc = mdbx_node_add_leaf(mc, 0, newkey, newdata, nflags);      } break;      case P_LEAF | P_LEAF2: { -      mdbx_cassert(mc, nflags == 0); -      mdbx_cassert(mc, newpgno == 0); +      mdbx_cassert(mc, (nflags & (F_BIGDATA | F_SUBDATA | F_DUPDATA)) == 0); +      mdbx_cassert(mc, newpgno == 0 || newpgno == P_INVALID);        rc = mdbx_node_add_leaf2(mc, 0, newkey);      } break;      default: @@ -10860,7 +10889,7 @@ static int mdbx_page_split(MDBX_cursor *mc, const MDBX_val *newkey,          rc = mdbx_node_add_leaf(mc, n, &rkey, rdata, flags);        } break;        /* case P_LEAF | P_LEAF2: { -        mdbx_cassert(mc, 0 == (uint16_t)flags); +        mdbx_cassert(mc, (nflags & (F_BIGDATA | F_SUBDATA | F_DUPDATA)) == 0);          mdbx_cassert(mc, gno == 0);          rc = mdbx_node_add_leaf2(mc, n, &rkey);        } break; */ @@ -12348,7 +12377,7 @@ int __cold mdbx_reader_check0(MDBX_env *env, int rdt_locked, int *dead) {      /* clean it */      for (unsigned j = i; j < snap_nreaders; j++) {        if (lck->mti_readers[j].mr_pid == pid) { -        mdbx_debug("clear stale reader pid %" PRIuPTR " txn %" PRIaTXN "", +        mdbx_debug("clear stale reader pid %" PRIuPTR " txn %" PRIaTXN,                     (size_t)pid, lck->mti_readers[j].mr_txnid);          lck->mti_readers[j].mr_pid = 0;          lck->mti_readers_refresh_flag = true; diff --git a/libs/libmdbx/src/test/log.cc b/libs/libmdbx/src/test/log.cc index 7bc3ecf613..0e325e3add 100644 --- a/libs/libmdbx/src/test/log.cc +++ b/libs/libmdbx/src/test/log.cc @@ -57,7 +57,7 @@ static void mdbx_logger(int type, const char *function, int line,    if (logging::output(            level,            strncmp(function, "mdbx_", 5) == 0 ? "%s: " : "mdbx: %s: ", function)) -    logging::feed(msg, args); +    logging::feed_ap(msg, args);    if (type & MDBX_DBG_ASSERT)      abort();  } @@ -193,7 +193,7 @@ bool output(const logging::loglevel priority, const char *format, va_list ap) {    return true;  } -bool feed(const char *format, va_list ap) { +bool feed_ap(const char *format, va_list ap) {    if (!last)      return false; @@ -212,7 +212,7 @@ bool feed(const char *format, ...) {    va_list ap;    va_start(ap, format); -  feed(format, ap); +  feed_ap(format, ap);    va_end(ap);    return true;  } diff --git a/libs/libmdbx/src/test/log.h b/libs/libmdbx/src/test/log.h index 7350f1b9b1..ecdd91bf88 100644 --- a/libs/libmdbx/src/test/log.h +++ b/libs/libmdbx/src/test/log.h @@ -42,7 +42,7 @@ void setlevel(loglevel level);  bool output(const loglevel priority, const char *format, va_list ap);  bool __printf_args(2, 3)      output(const loglevel priority, const char *format, ...); -bool feed(const char *format, va_list ap); +bool feed_ap(const char *format, va_list ap);  bool __printf_args(1, 2) feed(const char *format, ...);  class local_suffix { diff --git a/libs/libmdbx/src/test/osal-windows.cc b/libs/libmdbx/src/test/osal-windows.cc index b8cdb53513..81f1da7f86 100644 --- a/libs/libmdbx/src/test/osal-windows.cc +++ b/libs/libmdbx/src/test/osal-windows.cc @@ -268,9 +268,12 @@ int osal_actor_start(const actor_config &config, mdbx_pid_t &pid) {                                    &exename_size))      failure_perror("QueryFullProcessImageName()", GetLastError()); -  std::string cmdline = "test_mdbx.child "; +  std::string cmdline = "$ ";    ArgvQuote(cmdline, thunk_param(config)); +  if (cmdline.size() >= 32767) +    return ERROR_BAD_LENGTH; +    PROCESS_INFORMATION ProcessInformation;    if (!CreateProcessA(exename, const_cast<char *>(cmdline.c_str()),                        NULL, // Retuned process handle is not inheritable. diff --git a/libs/libmdbx/src/test/test.vcxproj b/libs/libmdbx/src/test/test.vcxproj index 3ee13cf8cf..a8c21d38c5 100644 --- a/libs/libmdbx/src/test/test.vcxproj +++ b/libs/libmdbx/src/test/test.vcxproj @@ -78,21 +78,25 @@      <LinkIncremental>true</LinkIncremental>      <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>      <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir> +    <TargetName>mdbx_test</TargetName>    </PropertyGroup>    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">      <LinkIncremental>false</LinkIncremental>      <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>      <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir> +    <TargetName>mdbx_test</TargetName>    </PropertyGroup>    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">      <LinkIncremental>true</LinkIncremental>      <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>      <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir> +    <TargetName>mdbx_test</TargetName>    </PropertyGroup>    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">      <LinkIncremental>false</LinkIncremental>      <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>      <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir> +    <TargetName>mdbx_test</TargetName>    </PropertyGroup>    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">      <ClCompile>  | 
