diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp index dbc0e254e575f0d038f4c5d93ba2a7b3854aa27a..141a095a93598ce24945d0355759fad9383ae81a 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp @@ -346,12 +346,22 @@ Dbtup::disk_page_prealloc(Signal* signal, if ((pos= alloc.find_extent(sz)) != RNIL) { jam(); + Uint32 cnt = 0; LocalDLList<Extent_info> list(c_extent_pool, alloc.m_free_extents[pos]); list.first(ext); + while((pageBits= tsman.alloc_page_from_extent(&ext.p->m_key, bits)) < 0) + if(!list.next(ext) || ++cnt == 10) + break; + ndbout_c("cnt: %d", cnt); + if (cnt == 10 || ext.isNull()) + goto alloc; list.remove(ext); + alloc.m_curr_extent_info_ptr_i= ext.i; + ext.p->m_free_matrix_pos= RNIL; } else { + alloc: jam(); /** * We need to alloc an extent @@ -383,18 +393,19 @@ Dbtup::disk_page_prealloc(Signal* signal, LocalSLList<Extent_info, Extent_list_t> list1(c_extent_pool, alloc.m_extent_list); list1.add(ext); - } - alloc.m_curr_extent_info_ptr_i= ext.i; - ext.p->m_free_matrix_pos= RNIL; - pageBits= tsman.alloc_page_from_extent(&ext.p->m_key, bits); + + alloc.m_curr_extent_info_ptr_i= ext.i; + ext.p->m_free_matrix_pos= RNIL; + pageBits= tsman.alloc_page_from_extent(&ext.p->m_key, bits); #ifdef VM_TRACE - ddassert(pageBits >= 0); + ddassert(pageBits >= 0); #else - if (unlikely(pageBits < 0)) - { - return -AllocExtentReq::NoExtentAvailable; - } + if (unlikely(pageBits < 0)) + { + return -AllocExtentReq::NoExtentAvailable; + } #endif + } } /** diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp index 94fc9387a1ee6bf5ec8b003af24172dd65a8c69a..9fdddceb0c0f48113925cf94f56a9f7fba45c27f 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp @@ -307,9 +307,9 @@ void Dbtup::execREAD_CONFIG_REQ(Signal* signal) c_buildIndexPool.setSize(c_noOfBuildIndexRec); c_triggerPool.setSize(noOfTriggers); - c_extent_pool.setSize(256); + c_extent_pool.setSize(8192); c_extent_hash.setSize(1024); // 4k - c_page_request_pool.setSize(100); + c_page_request_pool.setSize(1000); Uint32 nScanOp; // use TUX config for now ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUX_SCAN_OP, &nScanOp)); diff --git a/storage/ndb/src/kernel/blocks/pgman.cpp b/storage/ndb/src/kernel/blocks/pgman.cpp index 4d85456e96066cd1c9ffa1b1786567b48f54af63..71cf283e75b4d8b06aa6140425b26d12c5ed20c1 100644 --- a/storage/ndb/src/kernel/blocks/pgman.cpp +++ b/storage/ndb/src/kernel/blocks/pgman.cpp @@ -40,10 +40,11 @@ #define dbg(x) #endif +static bool g_dbg_lcp = false; #if 1 #define DBG_LCP(x) #else -#define DBG_LCP(x) ndbout << x +#define DBG_LCP(x) if(g_dbg_lcp) ndbout << x #endif Pgman::Pgman(const Configuration & conf) : @@ -125,7 +126,7 @@ Pgman::execREAD_CONFIG_REQ(Signal* signal) if (page_buffer > 0) { page_buffer /= GLOBAL_PAGE_SIZE; // in pages - m_page_entry_pool.setSize(2*page_buffer); + m_page_entry_pool.setSize(100*page_buffer); m_page_request_pool.setSize(10000); m_param.m_max_pages = page_buffer; m_param.m_max_hot_pages = (page_buffer * 9) / 10; @@ -145,7 +146,7 @@ Pgman::Param::Param() : m_max_io_waits(64), m_stats_loop_delay(1000), m_cleanup_loop_delay(200), - m_lcp_loop_delay(200) + m_lcp_loop_delay(0) { } @@ -411,6 +412,8 @@ Pgman::get_page_entry(Ptr<Page_entry>& ptr, Uint32 file_no, Uint32 page_no) return true; } + ndbrequire(false); + return false; } @@ -739,7 +742,10 @@ Pgman::do_lcp_loop(Signal* signal, bool direct) { Uint32 delay = m_param.m_lcp_loop_delay; signal->theData[0] = PgmanContinueB::LCP_LOOP; - sendSignalWithDelay(PGMAN_REF, GSN_CONTINUEB, signal, delay, 1); + if (delay) + sendSignalWithDelay(PGMAN_REF, GSN_CONTINUEB, signal, delay, 1); + else + sendSignal(PGMAN_REF, GSN_CONTINUEB, signal, 1, JBB); } #ifdef VM_TRACE debugOut << "PGMAN: <do_lcp_loop on=" << m_lcp_loop_on @@ -1151,15 +1157,25 @@ Pgman::process_lcp(Signal* signal) // start or re-start from beginning of current hash bucket if (m_lcp_curr_bucket != ~(Uint32)0) { + DBG_LCP(" PROCESS LCP m_lcp_curr_bucket" + << m_lcp_curr_bucket << endl); + Page_hashlist::Iterator iter; pl_hash.next(m_lcp_curr_bucket, iter); - - while (iter.curr.i != RNIL && --max_count > 0) + Uint32 loop = 0; + while (iter.curr.i != RNIL && + m_lcp_outstanding < max_count && + (loop ++ < 32 || iter.bucket == m_lcp_curr_bucket)) { Ptr<Page_entry>& ptr = iter.curr; Uint16 state = ptr.p->m_state; - - DBG_LCP("PROCESS LCP: " << ptr); + + DBG_LCP("LCP " + << " m_lcp_outstanding: " << m_lcp_outstanding + << " max_count: " << max_count + << " loop: " << loop + << " iter.curr.i: " << iter.curr.i + << " " << ptr); if (ptr.p->m_last_lcp < m_last_lcp && (state & Page_entry::DIRTY)) @@ -1209,6 +1225,10 @@ Pgman::process_lcp(Signal* signal) ptr.p->m_last_lcp = m_last_lcp; m_lcp_outstanding++; } + else + { + DBG_LCP(" NOT DIRTY" << endl); + } pl_hash.next(iter); } @@ -2231,6 +2251,36 @@ Pgman::execDUMP_STATE_ORD(Signal* signal) ndbout << "Only in VM_TRACE builds" << endl; #endif } + + if (signal->theData[0] == 11004) + { + ndbout << "Dump LCP bucket m_lcp_outstanding: %d", m_lcp_outstanding; + if (m_lcp_curr_bucket != ~(Uint32)0) + { + Page_hashlist::Iterator iter; + pl_hash.next(m_lcp_curr_bucket, iter); + + ndbout_c(" %d", m_lcp_curr_bucket); + + while (iter.curr.i != RNIL && iter.bucket == m_lcp_curr_bucket) + { + Ptr<Page_entry>& ptr = iter.curr; + ndbout << ptr << endl; + pl_hash.next(iter); + } + + ndbout_c("-- done"); + } + else + { + ndbout_c(" == ~0"); + } + } + + if (signal->theData[0] == 11005) + { + g_dbg_lcp = ~g_dbg_lcp; + } } // page cache client diff --git a/storage/ndb/src/kernel/blocks/tsman.cpp b/storage/ndb/src/kernel/blocks/tsman.cpp index f73b7e141690afb1aff72898eb9ae2701de4b315..25bf998a62542da399b6a78c6a2c6d3ecd65f0d7 100644 --- a/storage/ndb/src/kernel/blocks/tsman.cpp +++ b/storage/ndb/src/kernel/blocks/tsman.cpp @@ -30,6 +30,7 @@ #include <signaldata/GetTabInfo.hpp> #include <dbtup/Dbtup.hpp> +#define JONAS 0 Tsman::Tsman(const Configuration & conf, class Pgman* pg, class Lgman* lg) : SimulatedBlock(TSMAN, conf), @@ -148,7 +149,15 @@ Tsman::execCONTINUEB(Signal* signal){ release_extent_pages(signal, ptr); return; } + case TsmanContinueB::LOAD_EXTENT_PAGES: + { + Ptr<Datafile> ptr; + m_file_pool.getPtr(ptr, ptrI); + load_extent_pages(signal, ptr); + return; } + } + ndbrequire(false); } #ifdef VM_TRACE @@ -702,8 +711,9 @@ Tsman::open_file(Signal* signal, * Update file size */ pages = 1 + extent_pages + data_pages; - hi = (pages * File_formats::NDB_PAGE_SIZE) >> 32; - lo = (pages * File_formats::NDB_PAGE_SIZE) & 0xFFFFFFFF; + Uint64 bytes = pages * File_formats::NDB_PAGE_SIZE; + hi = bytes >> 32; + lo = bytes & 0xFFFFFFFF; req->file_size_hi = hi; req->file_size_lo = lo; @@ -1185,7 +1195,7 @@ Tsman::scan_extent_headers(Signal* signal, Ptr<Datafile> ptr) * Last extent header page... * set correct no of extent headers */ - extents= datapages / size; + extents= (datapages / size) % per_page; } for(Uint32 j = 0; j<extents; j++) { @@ -1712,9 +1722,13 @@ Tsman::unmap_page(Signal* signal, Local_key *key) /** * Toggle word */ + Uint32 old = header->get_free_bits(page_no_in_extent); unsigned bit = (header->get_free_bits(page_no_in_extent) & ((1 << (SZ - 1)) - 1)); header->update_free_bits(page_no_in_extent, bit); + if (JONAS) + ndbout_c("toggle page: (%d, %d, %d) from %x to %x", + key->m_page_no, extent, page_no_in_extent, old, bit); return 0; } @@ -1815,6 +1829,14 @@ Tsman::execALLOC_PAGE_REQ(Signal* signal) shift &= 31; } +#if 0 + printf("req.bits: %d bits: ", req.bits); + for(Uint32 i = 0; i<size; i++) + { + printf("%x", header->get_free_bits(i)); + } + ndbout_c(""); +#endif err= AllocPageReq::NoPageFree; } @@ -1822,6 +1844,9 @@ Tsman::execALLOC_PAGE_REQ(Signal* signal) return; found: + if (JONAS) + ndbout_c("alloc page: (%d, %d, %d)", + data_off + extent * size + page_no, per_page + extent, page_no); src_bits |= (1 << (SZ - 1)); // high unlogged, allocated bit header->update_free_bits(page_no, src_bits); rep->bits= src_bits & ((1 << (SZ - 1)) - 1);