diff --git a/.gitignore b/.gitignore index 6cac9f6..094933e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ graphdump/ __pycache__ core _testtmp/ +*.pyc diff --git a/ptnk/db.h b/ptnk/db.h index 848cb9c..7e18154 100644 --- a/ptnk/db.h +++ b/ptnk/db.h @@ -8,8 +8,6 @@ namespace ptnk { -class TPIO; -class TPIOTxSession; class TPIO; class TPIOTxSession; diff --git a/ptnk/partitionedpageio.cpp b/ptnk/partitionedpageio.cpp index ba1350e..d98dde5 100644 --- a/ptnk/partitionedpageio.cpp +++ b/ptnk/partitionedpageio.cpp @@ -20,6 +20,7 @@ namespace ptnk PartitionedPageIO::PartitionedPageIO(const char* dbprefix, ptnk_opts_t opts, int mode) : m_mode(mode), m_opts(opts), + m_needInit(false), m_pgidLast(PGID_INVALID), m_partidFirst(PTNK_PARTID_INVALID), m_partidLast(0), m_helper(nullptr), m_isHelperInvoked(true) diff --git a/ptnk/tpio.cpp b/ptnk/tpio.cpp index 19ea3e3..377a577 100644 --- a/ptnk/tpio.cpp +++ b/ptnk/tpio.cpp @@ -48,6 +48,8 @@ TPIOTxSession::TPIOTxSession(TPIO* tpio, shared_ptr aovr, unique_ptr< m_aovr(move(aovr)), m_lovr(move(lovr)) { + tpio->registerTx(this); + m_lovr->attachExtra(unique_ptr(new OvrExtra)); m_oldlink = &reinterpret_cast(m_lovr->getExtra())->oldlink; } @@ -66,7 +68,7 @@ TPIOTxSession::OvrExtra::~OvrExtra() TPIOTxSession::~TPIOTxSession() { - /* NOP */ + m_tpio->unregisterTx(this); } pair @@ -216,6 +218,11 @@ TPIO::TPIO(shared_ptr backend, ptnk_opts_t opts) m_bDuringRebase(false), m_bDuringRefresh(false) { + for(size_t i = 0; i < NTXPOOL; ++ i) + { + m_txpool[i] = nullptr; + } + if(m_backend->needInit()) { m_aovr = unique_ptr(new ActiveOvr); @@ -261,6 +268,34 @@ TPIO::newTransaction() return unique_ptr(new TPIOTxSession(this, move(aovr), move(lovr))); } +void +TPIO::registerTx(TPIOTxSession* tx) +{ +#ifdef PTNK_REGTX + for(size_t i = 0; i < NTXPOOL; ++ i) + { + if(!m_txpool[i] && PTNK_CAS(&m_txpool[i], 0, tx)) + { + tx->m_regtxidx = i; + return; + } + } + + PTNK_THROW_RUNTIME_ERR("out of session pool"); +#endif +} + +void +TPIO::unregisterTx(TPIOTxSession* tx) +{ +#ifdef PTNK_REGTX + size_t i = tx->m_regtxidx; + + PTNK_ASSERT(m_txpool[i] == tx); + m_txpool[i] = nullptr; +#endif +} + void TPIO::syncDelayed(const Vpage_id_t& pagesModified) { diff --git a/ptnk/tpio.h b/ptnk/tpio.h index 1528e28..f180fbe 100644 --- a/ptnk/tpio.h +++ b/ptnk/tpio.h @@ -102,7 +102,7 @@ class TPIOTxSession : public PageIO void addOvr(page_id_t pgidOrig, page_id_t pgidOvr) { - m_lovr->addOvr(pgidOrig, pgidOvr); + m_lovr->addOvr(pgidOrig, pgidOvr); } void loadStreak(BufferCRef bufStreak); @@ -121,6 +121,7 @@ class TPIOTxSession : public PageIO PagesOldLink* m_oldlink; Vpage_id_t m_pagesModified; TPIOStat m_stat; + size_t m_regtxidx; }; inline std::ostream& operator<<(std::ostream& s, const TPIOTxSession& o) @@ -193,6 +194,12 @@ class TPIO std::mutex m_mtxRebase; std::condition_variable m_condRebase; + + static const size_t NTXPOOL = 256; + TPIOTxSession* m_txpool[NTXPOOL]; +public: + void registerTx(TPIOTxSession* tx); + void unregisterTx(TPIOTxSession* tx); }; inline std::ostream& operator<<(std::ostream& s, const TPIO& o)