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 | |
parent | 50d176bfe78d4b5ffd829a874e503facef398e7d (diff) |
libmdbx: fix for GC
Diffstat (limited to 'libs/libmdbx')
-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> |