summaryrefslogtreecommitdiff
path: root/storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp')
-rw-r--r--storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp285
1 files changed, 0 insertions, 285 deletions
diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp
deleted file mode 100644
index 6822deb8b19..00000000000
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupFixAlloc.cpp
+++ /dev/null
@@ -1,285 +0,0 @@
-/* Copyright (c) 2003, 2005-2007 MySQL AB
- Use is subject to license terms
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
-
-#define DBTUP_C
-#define DBTUP_FIXALLOC_CPP
-#include "Dbtup.hpp"
-#include <RefConvert.hpp>
-#include <ndb_limits.h>
-#include <pc.hpp>
-
-//
-// Fixed Allocator
-// This module is used to allocate and free fixed size tuples from the
-// set of pages attached to a fragment. The fixed size is preset per
-// fragment and their can only be one such value per fragment in the
-// current implementation.
-//
-// Public methods
-// bool
-// alloc_fix_rec(Fragrecord* const regFragPtr, # In
-// Tablerec* const regTabPtr, # In
-// Uint32 pageType, # In
-// Signal* signal, # In
-// Uint32& pageOffset, # Out
-// PagePtr& pagePtr) # In/Out
-// This method allocates a fixed size and the pagePtr is a reference
-// to the page and pageOffset is the offset in the page of the tuple.
-//
-// freeTh()
-// This method is used to free a tuple header in normal transaction
-// handling.
-//
-// getThAtPageSr()
-// This method is used to allocate a tuple on a set page as part of
-// undo log execution.
-//
-//
-// Private methods
-// getThAtPage()
-// This method gets a tuple from a page with free tuples.
-//
-// convertThPage()
-// Convert an empty page into a page of free tuples in a linked list.
-//
-// getEmptyPageTh()
-// A page recently taken from the set of empty pages on the fragment is
-// is made part of the set of free pages with fixed size tuples in the
-// fragment.
-//
-Uint32*
-Dbtup::alloc_fix_rec(Fragrecord* const regFragPtr,
- Tablerec* const regTabPtr,
- Local_key* key,
- Uint32 * out_frag_page_id)
-{
-/* ---------------------------------------------------------------- */
-/* EITHER NORMAL PAGE REQUESTED OR ALLOCATION FROM COPY PAGE */
-/* FAILED. TRY ALLOCATING FROM NORMAL PAGE. */
-/* ---------------------------------------------------------------- */
- PagePtr pagePtr;
- pagePtr.i = regFragPtr->thFreeFirst.firstItem;
- if (pagePtr.i == RNIL) {
-/* ---------------------------------------------------------------- */
-// No prepared tuple header page with free entries exists.
-/* ---------------------------------------------------------------- */
- pagePtr.i = getEmptyPage(regFragPtr);
- if (pagePtr.i != RNIL) {
- jam();
-/* ---------------------------------------------------------------- */
-// We found empty pages on the fragment. Allocate an empty page and
-// convert it into a tuple header page and put it in thFreeFirst-list.
-/* ---------------------------------------------------------------- */
- c_page_pool.getPtr(pagePtr);
-
- ndbassert(pagePtr.p->page_state == ZEMPTY_MM);
-
- convertThPage((Fix_page*)pagePtr.p, regTabPtr, MM);
-
- pagePtr.p->page_state = ZTH_MM_FREE;
-
- LocalDLFifoList<Page> free_pages(c_page_pool, regFragPtr->thFreeFirst);
- free_pages.addFirst(pagePtr);
- } else {
- jam();
-/* ---------------------------------------------------------------- */
-/* THERE ARE NO EMPTY PAGES. MEMORY CAN NOT BE ALLOCATED. */
-/* ---------------------------------------------------------------- */
- return 0;
- }
- } else {
- jam();
-/* ---------------------------------------------------------------- */
-/* THIS SHOULD BE THE COMMON PATH THROUGH THE CODE, FREE */
-/* COPY PAGE EXISTED. */
-/* ---------------------------------------------------------------- */
- c_page_pool.getPtr(pagePtr);
- }
-
- Uint32 page_offset= alloc_tuple_from_page(regFragPtr, (Fix_page*)pagePtr.p);
-
- *out_frag_page_id= pagePtr.p->frag_page_id;
- key->m_page_no = pagePtr.i;
- key->m_page_idx = page_offset;
- return pagePtr.p->m_data + page_offset;
-}
-
-void Dbtup::convertThPage(Fix_page* regPagePtr,
- Tablerec* regTabPtr,
- Uint32 mm)
-{
- Uint32 nextTuple = regTabPtr->m_offsets[mm].m_fix_header_size;
- /*
- ASSUMES AT LEAST ONE TUPLE HEADER FITS AND THEREFORE NO HANDLING
- OF ZERO AS EXTREME CASE
- */
- Uint32 cnt= 0;
- Uint32 pos= 0;
- Uint32 prev = 0xFFFF;
-#ifdef VM_TRACE
- memset(regPagePtr->m_data, 0xF1, 4*Fix_page::DATA_WORDS);
-#endif
- Uint32 gci_pos = 2;
- Uint32 gci_val = 0xF1F1F1F1;
- if (regTabPtr->m_bits & Tablerec::TR_RowGCI)
- {
- Tuple_header* ptr = 0;
- gci_pos = ptr->get_mm_gci(regTabPtr) - (Uint32*)ptr;
- gci_val = 0;
- }
- while (pos + nextTuple <= Fix_page::DATA_WORDS)
- {
- regPagePtr->m_data[pos] = (prev << 16) | (pos + nextTuple);
- regPagePtr->m_data[pos + 1] = Fix_page::FREE_RECORD;
- regPagePtr->m_data[pos + gci_pos] = gci_val;
- prev = pos;
- pos += nextTuple;
- cnt ++;
- }
-
- regPagePtr->m_data[prev] |= 0xFFFF;
- regPagePtr->next_free_index= 0;
- regPagePtr->free_space= cnt;
- regPagePtr->m_page_header.m_page_type = File_formats::PT_Tup_fixsize_page;
-}//Dbtup::convertThPage()
-
-Uint32
-Dbtup::alloc_tuple_from_page(Fragrecord* const regFragPtr,
- Fix_page* const regPagePtr)
-{
- ndbassert(regPagePtr->free_space);
- Uint32 idx= regPagePtr->alloc_record();
- if(regPagePtr->free_space == 0)
- {
- jam();
-/* ---------------------------------------------------------------- */
-/* THIS WAS THE LAST TUPLE HEADER IN THIS PAGE. REMOVE IT FROM*/
-/* THE TUPLE HEADER FREE LIST OR TH COPY FREE LIST. ALSO SET */
-/* A PROPER PAGE STATE. */
-/* */
-/* WE ALSO HAVE TO INSERT AN UNDO LOG ENTRY TO ENSURE PAGE */
-/* ARE MAINTAINED EVEN AFTER A SYSTEM CRASH. */
-/* ---------------------------------------------------------------- */
- ndbrequire(regPagePtr->page_state == ZTH_MM_FREE);
- LocalDLFifoList<Page> free_pages(c_page_pool, regFragPtr->thFreeFirst);
- free_pages.remove((Page*)regPagePtr);
- regPagePtr->page_state = ZTH_MM_FULL;
- }
-
- return idx;
-}//Dbtup::getThAtPage()
-
-
-void Dbtup::free_fix_rec(Fragrecord* regFragPtr,
- Tablerec* regTabPtr,
- Local_key* key,
- Fix_page* regPagePtr)
-{
- Uint32 free= regPagePtr->free_record(key->m_page_idx);
-
- if(free == 1)
- {
- jam();
- PagePtr pagePtr = { (Page*)regPagePtr, key->m_page_no };
- LocalDLFifoList<Page> free_pages(c_page_pool, regFragPtr->thFreeFirst);
- ndbrequire(regPagePtr->page_state == ZTH_MM_FULL);
- regPagePtr->page_state = ZTH_MM_FREE;
- free_pages.addLast(pagePtr);
- }
-}//Dbtup::freeTh()
-
-
-int
-Dbtup::alloc_page(Tablerec* tabPtrP, Fragrecord* fragPtrP,
- PagePtr * ret, Uint32 page_no)
-{
- Uint32 pages = fragPtrP->noOfPages;
-
- if (page_no >= pages)
- {
- Uint32 start = pages;
- while(page_no >= pages)
- pages += (pages >> 3) + (pages >> 4) + 2;
- allocFragPages(fragPtrP, pages - start);
- if (page_no >= (pages = fragPtrP->noOfPages))
- {
- terrorCode = ZMEM_NOMEM_ERROR;
- return 1;
- }
- }
-
- PagePtr pagePtr;
- c_page_pool.getPtr(pagePtr, getRealpid(fragPtrP, page_no));
-
- LocalDLList<Page> alloc_pages(c_page_pool, fragPtrP->emptyPrimPage);
- LocalDLFifoList<Page> free_pages(c_page_pool, fragPtrP->thFreeFirst);
- if (pagePtr.p->page_state == ZEMPTY_MM)
- {
- convertThPage((Fix_page*)pagePtr.p, tabPtrP, MM);
- pagePtr.p->page_state = ZTH_MM_FREE;
- alloc_pages.remove(pagePtr);
- free_pages.addFirst(pagePtr);
- }
-
- *ret = pagePtr;
- return 0;
-}
-
-Uint32*
-Dbtup::alloc_fix_rowid(Fragrecord* regFragPtr,
- Tablerec* regTabPtr,
- Local_key* key,
- Uint32 * out_frag_page_id)
-{
- Uint32 page_no = key->m_page_no;
- Uint32 idx= key->m_page_idx;
-
- PagePtr pagePtr;
- if (alloc_page(regTabPtr, regFragPtr, &pagePtr, page_no))
- {
- terrorCode = ZMEM_NOMEM_ERROR;
- return 0;
- }
-
- Uint32 state = pagePtr.p->page_state;
- LocalDLFifoList<Page> free_pages(c_page_pool, regFragPtr->thFreeFirst);
- switch(state){
- case ZTH_MM_FREE:
- if (((Fix_page*)pagePtr.p)->alloc_record(idx) != idx)
- {
- terrorCode = ZROWID_ALLOCATED;
- return 0;
- }
-
- if(pagePtr.p->free_space == 0)
- {
- jam();
- pagePtr.p->page_state = ZTH_MM_FULL;
- free_pages.remove(pagePtr);
- }
-
- *out_frag_page_id= page_no;
- key->m_page_no = pagePtr.i;
- key->m_page_idx = idx;
- return pagePtr.p->m_data + idx;
- case ZTH_MM_FULL:
- terrorCode = ZROWID_ALLOCATED;
- return 0;
- case ZEMPTY_MM:
- ndbrequire(false);
- }
- return 0; /* purify: deadcode */
-}