1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-04-21 19:45:56 +03:00
2016-01-06 14:08:59 -06:00

4053 lines
159 KiB
C++

/* Copyright (C) 2014 InfiniDB, Inc.
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. */
#include <stdio.h>
#include <string>
#include <stdexcept>
#include <stdlib.h>
#include <bitset>
#include <map>
using namespace std;
#include <boost/scoped_ptr.hpp>
#include <boost/progress.hpp>
using namespace boost;
#include <cppunit/extensions/HelperMacros.h>
#include "we_indextree.h"
#include "we_freemgr.h"
#include "we_indexlist.h"
using namespace WriteEngine;
class IndexTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE( IndexTest );
//CPPUNIT_TEST( tmpTest );
//PUNIT_TEST( multimapdemo );
//PUNIT_TEST( sortvecdemo );
//PUNIT_TEST( sortarrdemo );
// CPPUNIT_TEST( spacehog );
//CPPUNIT_TEST( test1 );
// CPPUNIT_TEST( test2 );
// Index basic testing
CPPUNIT_TEST( testStructIO );
CPPUNIT_TEST( testAddTreeNode );
CPPUNIT_TEST( testSetupBittestArray );
// Index tree testing
CPPUNIT_TEST( testTreeGetTestbitValue );
CPPUNIT_TEST( testTreeGetTreeNodeInfo );
CPPUNIT_TEST( testTreeGetTreeMatchEntry );
CPPUNIT_TEST( testTreeMoveEntry );
CPPUNIT_TEST( testTreeBuildEmptyTree );
CPPUNIT_TEST( testTreeBuildExistTree1 );
CPPUNIT_TEST( testTreeBuildExistTree2 );
CPPUNIT_TEST( testTreeIntegration );
//
CPPUNIT_TEST( testIntegrationVolume );
CPPUNIT_TEST( testCreateAndUpdateIndex );
//
CPPUNIT_TEST( testDeleteIndex );
//
CPPUNIT_TEST( testResetIndex );
//
CPPUNIT_TEST( testUpdateMutiColIndex );
// Index free manager testing
CPPUNIT_TEST( testFreeMgrBRM );
CPPUNIT_TEST( testFreeMgrInit );
CPPUNIT_TEST( testFreeMgrInit2 );
CPPUNIT_TEST( testFreeMgrAssign );
CPPUNIT_TEST( testFreeMgrAssignList );
CPPUNIT_TEST( testFreeMgrAssignListCk );
CPPUNIT_TEST( testFreeMgrAssignListCk2 );
CPPUNIT_TEST( testFreeMgrAssignListLots );
CPPUNIT_TEST( testFreeMgrAssignListBlocks );
CPPUNIT_TEST( testFreeMgrAssignExtend );
CPPUNIT_TEST( testFreeMgrExtendLots );
CPPUNIT_TEST( testFreeMgrRelease );
CPPUNIT_TEST( testFreeMgrFragment );
CPPUNIT_TEST( testFreeMgrChain );
// Index list testing
CPPUNIT_TEST(testIndexListMultiKey);
CPPUNIT_TEST(testIndexListUpdate);
CPPUNIT_TEST(testIndexListDelete);
CPPUNIT_TEST(testIndexListReleaseMgrBack);
CPPUNIT_TEST(testIndexListMultipleAddHdr);
CPPUNIT_TEST(testIndexListMultipleUpdate);
CPPUNIT_TEST_SUITE_END();
private:
IndexTree m_index;
IndexList m_indexlist;
FreeMgr m_freeMgr;
public:
void setUp() {
m_index.setUseFreeMgr( false );
m_index.setUseListMgr( false );
m_index.setTransId( 124353 ); // a dummy transaction id
// init the 000.dir
// int rc = m_index.createIndex( 20, 21 );
// CPPUNIT_ASSERT( rc == NO_ERROR );
BRMWrapper::setUseBrm(true);
m_indexlist.setDebugLevel(DEBUG_0);
m_indexlist.setNarray(true);
}
void testInit() {
}
void tearDown() {
}
/*
void tmpTest() {
int rc, width = 32, i;
m_index.setUseFreeMgr( true );
m_index.setUseListMgr( true );
BRMWrapper::setUseBrm( true );
BRMWrapper::setUseVb( false );
Cache::setUseCache( true );
Cache::init();
m_index.setTransId( 12345678 );
m_index.dropIndex( 990, 991 );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
// m_index.m_freeMgr.setDebugLevel( DEBUG_1 );
FILE* pFile;
uint64_t key, curkey, lastkey;
RID rid, ridArray[5000];
int counter = 0, ridCounter = 0;
pFile = fopen( "test.txt", "r" );
CPPUNIT_ASSERT( pFile != NULL );
while( !feof( pFile ) && rc == NO_ERROR )
{
fscanf( pFile, "%lld %lld\n", &key, &rid );
curkey = key;
if( curkey == lastkey || counter == 0 || ridCounter == MAX_IDX_RID - 1 )
ridArray[ridCounter++] = rid;
else {
m_index.m_multiRid.setMultiRid( ridArray, ridCounter );
rc = m_index.updateIndex( lastkey, width, ridArray[0] );
ridCounter = 0;
ridArray[ridCounter++] = rid;
} // end of if( curkey == lastkey ) {
lastkey = curkey;
// printf( "%d %d\n", (int)key, (int)rid );
counter++;
if( counter%1000 == 0 )
printf( "\ncounter=%d", counter );
} // end of while
// last piece
if( rc == NO_ERROR && ridCounter > 0 ) {
m_index.m_multiRid.setMultiRid( ridArray, ridCounter );
rc = m_index.updateIndex( lastkey, width, ridArray[0] );
}
m_index.flushCache();
m_index.closeIndex();
Cache::freeMemory();
}
*/
#define NUMELEM 30000000
void multimapdemo() {
multimap < int, int >mul;
timer t1, t2;
unsigned int idx;
map < int, int > mm;
for( idx = 0; idx < NUMELEM; idx++){
mul.insert( pair<int, int>(idx, idx) );
if( idx%10000 == 0){
printf("\nMultimap: index is %06i and time is:%lf (elapsed is %lf)", idx, t1.elapsed(), t2.elapsed());
t1.restart();
}
}
mul.clear();
}
bool pairCompare( const pair<int, int> &lhs, const pair<int, int> &rhs){
return lhs.second > rhs.second;
}
void sortvecdemo() {
vector< pair<int, int> > idxvec;
timer t1, t2;
unsigned int idx;
for( idx = 0; idx < NUMELEM; idx++){
idxvec.push_back( pair<int, int>(idx, idx) );
if( idx%10000 == 0){
printf("Sortvec: index is %06i and time is:%lf (elapsed is %lf)\n", idx, t1.elapsed(), t2.elapsed());
t1.restart();
}
}
sort(idxvec.begin(), idxvec.end());
printf("Sortvec: time is:%lf (elapsed is %lf)\n", t1.elapsed(), t2.elapsed());
idxvec.clear();
}
void sortarrdemo() {
int *idxarr;
idxarr = (int*)malloc(sizeof(int)*NUMELEM);
if (idxarr==0){
printf("\nOOPs..\n");
exit(-1);
}
timer t1, t2;
unsigned int idx;
for( idx = 0; idx < NUMELEM; idx++){
idxarr[idx] = idx;
if( idx%10000 == 0){
printf("Sortarr: index is %06i and time is:%lf (elapsed is %lf)\n", idx, t1.elapsed(), t2.elapsed());
t1.restart();
}
}
sort(idxarr, idxarr+NUMELEM);
printf("Sortarr: time is:%lf (elapsed is %lf)\n", t1.elapsed(), t2.elapsed());
}
void spacehog() {
// test case to estimate space requirements
// generate an index with 200K entries, each unique
int rc;
uint64_t i;
printf("\nUT: Beginning Space Hog\n");
m_index.setUseFreeMgr( true );
m_index.setUseListMgr( true );
rc = m_index.createIndex( 123, 124 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.openIndex( 123, 124 );
CPPUNIT_ASSERT( rc == NO_ERROR );
for(i=0; i< 800*1000; i++)
{
if (i%(1000*10)==0){
printf("UT: I is now: %i\n", (int)i);
}
rc = m_index.updateIndex( i*10*rand(), 32, i );
if (rc != NO_ERROR)
{
printf("\nShock and horror! i=%llu rc=%i\n",i, rc);
}
CPPUNIT_ASSERT( rc == NO_ERROR );
}
m_index.setAssignFbo( 1 );
m_index.closeIndex();
rc = m_index.dropIndex( 123, 124 );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.setUseFreeMgr( false );
m_index.setUseListMgr( false );
printf("\nUT: Finishing Space Hog\n");
}
void test1() {
int rc, width = 64, i;
m_index.setUseFreeMgr( true );
m_index.setUseListMgr( true );
BRMWrapper::setUseBrm( true );
BRMWrapper::setUseVb( false );
// Cache::setUseCache( true );
// Cache::init();
m_index.setTransId( 12345678 );
m_index.dropIndex( 990, 991 );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
// m_index.m_freeMgr.setDebugLevel( DEBUG_1 );
DataBlock curBlock;
char buf[20];
uint64_t key;
timer t1, t2;
for( i = 0; i < 100000; i++ ) {
sprintf( buf, "%dSuccess", i );
memcpy( &key, buf, 8 );
if (i%(1000)==0){
printf("UT: I is now: %i, elapsed time %lf s, delta %lf s\n", (int)i, t1.elapsed(), t2.elapsed());
t2.restart();
}
rc = m_index.updateIndex( key, width, i );
if( rc != NO_ERROR )
printf( "\n i =%d rc=%d", i, rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
}
printf("UT: I is now: %i, elapsed time %lf s, delta %lf s\n", (int)i, t1.elapsed(), t2.elapsed());
curBlock = m_index.getRootBlock();
printf( "\n block 0 subblock 0 " );
m_index.printMemSubBlock( &curBlock, 0 );
printf( "\n block 0 subblock 1 " );
m_index.printMemSubBlock( &curBlock, 1 );
m_index.printSubBlock( 11, 10 );
m_index.closeIndex();
// rc = m_index.dropIndex( 990, 991 );
// CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.setUseFreeMgr( false );
m_index.setUseListMgr( false );
// Cache::freeMemory();
}
void test2() {
int rc, width = 16, i;
m_index.setUseFreeMgr( true );
m_index.setUseListMgr( true );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
DataBlock curBlock;
for( i = 10; i < 381; i++ ) {
curBlock = m_index.getRootBlock();
printf( "\n i=%d", i );
if (i==130){
printf("\n130");;
}
if( i==20 || i == 128 || i == 129 || i==64 || i==66) {
printf( "\n******* before call updateIndex (i=%i)", i );
m_index.printMemSubBlock( &curBlock, 0 );
m_index.printSubBlock( 63, 19 );
m_index.printSubBlock( 63, 31 );
}
rc = m_index.updateIndex( 2*i, width, i*100 );
if( rc != NO_ERROR )
printf( "\n i =%d rc=%d", i, rc );
if( i==20 || i == 128 || i == 129 || i==64 || i==66) {
printf( "\n******* after call updateIndex (i=%i)", i );
m_index.printMemSubBlock( &curBlock, 0 );
m_index.printSubBlock( 63, 19 );
m_index.printSubBlock( 63, 31 );
}
CPPUNIT_ASSERT( rc == NO_ERROR );
}
m_index.setAssignFbo( 1 );
m_index.closeIndex();
rc = m_index.dropIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.setUseFreeMgr( false );
m_index.setUseListMgr( false );
}
void testStructIO() {
DataBlock curBlock;
FILE* pFile;
int rc, fbo = 1, sbid = 2, entryNo = 5, width = 8, allocSize;
IdxBitmapPointerEntry bitmapPtr;
memset( &bitmapPtr, 0, 8 );
memset( curBlock.data, 0, sizeof( curBlock.data ) );
m_index.deleteFile( 999 );
CPPUNIT_ASSERT( m_index.exists( 999 ) == false );
CPPUNIT_ASSERT( m_index.createFile( 999, 10, allocSize ) == NO_ERROR );
pFile = m_index.openFile( 999 );
CPPUNIT_ASSERT( pFile != NULL );
rc = m_index.readSubBlockEntry( pFile, &curBlock, fbo, sbid, entryNo, width, &bitmapPtr );
CPPUNIT_ASSERT( rc == NO_ERROR );
bitmapPtr.type = 1;
bitmapPtr.fbo = 2;
bitmapPtr.sbid = 8;
bitmapPtr.entry = 7;
rc = m_index.writeSubBlockEntry( pFile, &curBlock, fbo, sbid, entryNo, width, &bitmapPtr );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.closeFile( pFile );
// reload the value
memset( &bitmapPtr, 0, 8 );
memset( curBlock.data, 0, sizeof( curBlock.data ) );
CPPUNIT_ASSERT( m_index.isAddrPtrEmpty( &bitmapPtr, EMPTY_PTR ) == true );
pFile = m_index.openFile( 999 );
CPPUNIT_ASSERT( pFile != NULL );
rc = m_index.readDBFile( pFile, curBlock.data, fbo );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.getSubBlockEntry( curBlock.data, sbid, entryNo, width, &bitmapPtr );
CPPUNIT_ASSERT( bitmapPtr.type == 1 );
CPPUNIT_ASSERT( bitmapPtr.fbo == 2 );
CPPUNIT_ASSERT( bitmapPtr.sbid == 8 );
CPPUNIT_ASSERT( bitmapPtr.entry == 7 );
CPPUNIT_ASSERT( m_index.isAddrPtrEmpty( &bitmapPtr, BITMAP_PTR/*EMPTY_PTR*/ ) == false );
uint64_t i;
for( i = 0; i < 15; i++ ) {
bitmapPtr.type = i%8;
bitmapPtr.fbo = 2 * i;
bitmapPtr.sbid = i;
bitmapPtr.entry = i + 6;
m_index.setSubBlockEntry( curBlock.data, i, 0, 8, &bitmapPtr );
}
rc = m_index.writeDBFile( pFile, curBlock.data, fbo );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.closeFile( pFile );
for( i = 0; i < 15; i++ ) {
m_index.getSubBlockEntry( curBlock.data, i, 0, 8, &bitmapPtr );
CPPUNIT_ASSERT( bitmapPtr.type == i%8 );
// CPPUNIT_ASSERT( bitmapPtr.oid == i );
CPPUNIT_ASSERT( bitmapPtr.fbo == 2 * i );
CPPUNIT_ASSERT( bitmapPtr.sbid == i );
CPPUNIT_ASSERT( bitmapPtr.entry == i + 6 );
}
}
void testAddTreeNode() {
uint64_t key = 123, rid = 1900, width = 8, testbitVal = 3;
IdxTree myTree;
IdxBitmapPointerEntry bitmapEntry;
m_index.clearTree( &myTree );
bitmapEntry.fbo = 6;
bitmapEntry.sbid = 1;
bitmapEntry.entry =9;
m_index.setTreeHeader( &myTree, key, rid, width, testbitVal, bitmapEntry);
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.key == key );
CPPUNIT_ASSERT( myTree.rid == rid );
CPPUNIT_ASSERT( myTree.maxLevel == ((width/5) + 1) );
CPPUNIT_ASSERT( myTree.node[0].level == 0 );
CPPUNIT_ASSERT( myTree.node[0].allocCount == ENTRY_PER_SUBBLOCK );
// CPPUNIT_ASSERT( myTree.node[0].group == ENTRY_32 );
CPPUNIT_ASSERT( myTree.node[0].used == true );
CPPUNIT_ASSERT( myTree.node[0].next.fbo == bitmapEntry.fbo );
CPPUNIT_ASSERT( myTree.node[0].next.sbid == bitmapEntry.sbid );
CPPUNIT_ASSERT( myTree.node[0].next.entry == bitmapEntry.entry );
}
void testSetupBittestArray() {
char charVal[] = "abcde";
short i8Val = 21;
uint16_t i16Val = 1098, curPos = 0;
uint32_t i32Val = 0x0A6E6D8E, compareVal;
uint64_t i64Val = 0xDE1B4213;
int width, testbitVal, rc, i, shiftPos;
// compare with old code to make sure we can still be consistent
// test 64 bit
width = 8;
rc = m_index.setBitsetColumn( &i64Val, 1, width*8, WriteEngine::WR_LONGLONG );
CPPUNIT_ASSERT( rc == NO_ERROR );
//cout << "bitArray = " << m_index.m_multiColKey.bitSet.to_string() << endl;
m_index.calculateBittestArray();
//cout << "\nMax level = " << m_index.m_multiColKey.maxLevel << endl;
for( i = 0; i < m_index.m_multiColKey.maxLevel; i++ ) {
rc = m_index.getTestbitValue( i64Val, width*8, i, &testbitVal );
CPPUNIT_ASSERT( rc == true );
printf( "\tOld Level[%d] bit test value : %d \n", i, testbitVal );
shiftPos = i == m_index.m_multiColKey.maxLevel - 1? 4 : 5;
compareVal = compareVal << shiftPos | testbitVal;
CPPUNIT_ASSERT( testbitVal == m_index.m_multiColKey.testbitArray[i] );
}
//cout << "\nNew bitset array value " << endl;
for( i = 0; i < m_index.m_multiColKey.maxLevel; i++ )
printf( "\tLevel[%d] bit test value : %d \n", i, m_index.m_multiColKey.testbitArray[i] );
// test 32 bit
width = 4;
m_index.m_multiColKey.clear();
rc = m_index.setBitsetColumn( &i32Val, 1, width*8, WriteEngine::WR_INT );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.calculateBittestArray();
CPPUNIT_ASSERT( rc == NO_ERROR );
for( i = 0; i < m_index.m_multiColKey.maxLevel; i++ ) {
rc = m_index.getTestbitValue( i32Val, width*8, i, &testbitVal );
CPPUNIT_ASSERT( rc == true );
CPPUNIT_ASSERT( testbitVal == m_index.m_multiColKey.testbitArray[i] );
}
// test 16 bit
width = 2;
m_index.m_multiColKey.clear();
rc = m_index.setBitsetColumn( &i16Val, 1, width*8, WriteEngine::WR_SHORT );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.calculateBittestArray();
CPPUNIT_ASSERT( rc == NO_ERROR );
for( i = 0; i < m_index.m_multiColKey.maxLevel; i++ ) {
rc = m_index.getTestbitValue( i16Val, width*8, i, &testbitVal );
CPPUNIT_ASSERT( rc == true );
CPPUNIT_ASSERT( testbitVal == m_index.m_multiColKey.testbitArray[i] );
}
// test 8 bit
width = 1;
m_index.m_multiColKey.clear();
rc = m_index.setBitsetColumn( &i8Val, 1, width*8, WriteEngine::WR_BYTE );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.calculateBittestArray();
CPPUNIT_ASSERT( rc == NO_ERROR );
for( i = 0; i < m_index.m_multiColKey.maxLevel; i++ ) {
rc = m_index.getTestbitValue( i8Val, width*8, i, &testbitVal );
CPPUNIT_ASSERT( rc == true );
CPPUNIT_ASSERT( testbitVal == m_index.m_multiColKey.testbitArray[i] );
}
// here is the real one for multi-column
m_index.m_multiColKey.clear();
width = 1;
rc = m_index.setBitsetColumn( &i8Val, curPos++, width*8, WriteEngine::WR_BYTE );
CPPUNIT_ASSERT( rc == NO_ERROR );
width = 5;
rc = m_index.setBitsetColumn( charVal, curPos++, width*8, WriteEngine::WR_CHAR );
CPPUNIT_ASSERT( rc == NO_ERROR );
width = 4;
rc = m_index.setBitsetColumn( &i32Val, curPos++, width*8, WriteEngine::WR_INT );
CPPUNIT_ASSERT( rc == NO_ERROR );
width = 9;
strcpy( charVal, "test12345" );
rc = m_index.setBitsetColumn( charVal, curPos++, width*8, WriteEngine::WR_CHAR );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.calculateBittestArray();
CPPUNIT_ASSERT( rc == NO_ERROR );
CPPUNIT_ASSERT( m_index.m_multiColKey.maxLevel == 31 );
CPPUNIT_ASSERT( m_index.m_multiColKey.totalBit == 152 );
//cout << "\nMulti-column bitset array value " << endl;
for( i = 0; i < m_index.m_multiColKey.maxLevel; i++ )
printf( "\tLevel[%d] bit test value : %d \n", i, m_index.m_multiColKey.testbitArray[i] );
}
void testCreateAndUpdateIndex() {
int rc;
bool bEmptyFlag;
BRMWrapper::setUseBrm(false);
m_index.dropIndex( 990, 991 );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
// check invalid file not exist
rc = m_index.openIndex( 990, 992 );
CPPUNIT_ASSERT( rc != NO_ERROR );
rc = m_index.openIndex( 992, 991 );
CPPUNIT_ASSERT( rc != NO_ERROR );
// here is the correct check
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
bEmptyFlag = m_index.isTreeEmpty();
CPPUNIT_ASSERT( bEmptyFlag == true );
rc = m_index.updateIndex( 123, 8, 1 );
CPPUNIT_ASSERT( rc == NO_ERROR );
bEmptyFlag = m_index.isTreeEmpty();
CPPUNIT_ASSERT( bEmptyFlag == false );
// test insert multiple rid
RID ridArray[6];
ridArray[0] = 23;
ridArray[1] = 26;
ridArray[2] = 27;
ridArray[3] = 31;
ridArray[4] = 39;
ridArray[5] = 40;
m_index.setUseMultiRid( true );
m_index.m_multiRid.setMultiRid( ridArray, 6 );
rc = m_index.updateIndex( 123, 8, ridArray[0] );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.m_multiRid.clearMultiRid();
m_index.closeIndex();
}
void testDeleteIndex() {
int rc;
rc = m_index.dropIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.setUseFreeMgr( true );
m_index.setUseListMgr( true );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
// 8 bit
rc = m_index.deleteIndex( 123, 8, 1 );
CPPUNIT_ASSERT( rc == ERR_IDX_LIST_INVALID_DELETE );
rc = m_index.updateIndex( 123, 8, 1 );
printf("383. rc %i \n", rc);
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.deleteIndex( 123, 8, 1 );
CPPUNIT_ASSERT( rc == NO_ERROR );
// 16 bit
rc = m_index.deleteIndex( 0xA1C9, 16, 3 );
CPPUNIT_ASSERT( rc != NO_ERROR );
rc = m_index.updateIndex( 0xA1C9, 16, 3 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.deleteIndex( 0xA1C9, 16, 3 );
CPPUNIT_ASSERT( rc == NO_ERROR );
// 32 bit
rc = m_index.updateIndex( 0xCA6E6D8E, 32, 3 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.deleteIndex( 0xCA6E6D8E, 32, 3 );
CPPUNIT_ASSERT( rc == NO_ERROR );
// repeat one more time, should fail
rc = m_index.deleteIndex( 0xCA6E6D8E, 32, 3 );
CPPUNIT_ASSERT( rc != NO_ERROR );
m_index.closeIndex();
}
void testResetIndex() {
int rc, width = 64, i;
m_index.setUseFreeMgr( true );
m_index.setUseListMgr( true );
BRMWrapper::setUseBrm( true );
BRMWrapper::setUseVb( false );
m_index.setTransId( 12345678 );
m_index.dropIndex( 990, 991 );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.closeIndex();
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
char buf[20];
uint64_t key;
for( i = 0; i < 10000; i++ ) {
sprintf( buf, "%dSuccess", i );
memcpy( &key, buf, 8 );
rc = m_index.updateIndex( key, width, i );
if( rc != NO_ERROR )
printf( "\n i =%d rc=%d", i, rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
}
m_index.closeIndex();
// reset index
// rc = m_index.openIndex( 990, 991 );
// CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.resetIndexFile( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
// m_index.closeIndex();
printf( "\nre-insert begin\n" );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
for( i = 0; i < 10000; i++ ) {
sprintf( buf, "%dSuccess", i );
memcpy( &key, buf, 8 );
rc = m_index.updateIndex( key, width, i );
if( rc != NO_ERROR )
printf( "\n i =%d rc=%d", i, rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
}
m_index.closeIndex();
rc = m_index.dropIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
}
void testUpdateMutiColIndex() {
uint16_t i16Val;
uint32_t i32Val;
uint64_t key;
int rc, width = 64, i, pos = 0, totalWidth = 0;
char charVal[50];
m_index.setUseFreeMgr( true );
m_index.setUseListMgr( true );
BRMWrapper::setUseBrm( true );
BRMWrapper::setUseVb( false );
m_index.setTransId( 12345678 );
m_index.dropIndex( 990, 991 );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.closeIndex();
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.setUseMultiCol( true );
printf( "\nBegin of multicol index insert\n" );
for( i = 0; i < 10000; i++ ) {
totalWidth = 0;
// init part
m_index.m_multiColKey.clear();
// multi colum inserts
// column 1
width = 4;
totalWidth += width;
i32Val = i;
rc = m_index.setBitsetColumn( &i32Val, pos++, width*8, WriteEngine::WR_INT );
CPPUNIT_ASSERT( rc == NO_ERROR );
// column 2
width = 4;
totalWidth += width;
i32Val = i*3;
rc = m_index.setBitsetColumn( &i32Val, pos++, width*8, WriteEngine::WR_INT );
CPPUNIT_ASSERT( rc == NO_ERROR );
// column 3
width = 2;
totalWidth += width;
i16Val = i;
rc = m_index.setBitsetColumn( &i16Val, pos++, width*8, WriteEngine::WR_SHORT );
CPPUNIT_ASSERT( rc == NO_ERROR );
// column 4
width = 15;
totalWidth += width;
sprintf( charVal, "%7d success", i );
rc = m_index.setBitsetColumn( charVal, pos++, width*8, WriteEngine::WR_CHAR );
CPPUNIT_ASSERT( rc == NO_ERROR );
// column 5
width = 7;
totalWidth += width;
sprintf( charVal, "%7d", i );
rc = m_index.setBitsetColumn( charVal, pos++, width*8, WriteEngine::WR_CHAR );
CPPUNIT_ASSERT( rc == NO_ERROR );
// final part
rc = m_index.calculateBittestArray();
CPPUNIT_ASSERT( rc == NO_ERROR );
memcpy( &key, m_index.m_multiColKey.keyBuf, 8 );
// printf( "\ntotalWidth = %d", totalWidth );
rc = m_index.updateIndex( key, totalWidth*8, i );
if( rc != NO_ERROR )
printf( "\n i =%d rc=%d", i, rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
if( i%500 == 0 )
printf( "\n process i=%d", i );
}
m_index.closeIndex();
printf( "\nEnd of multicol index insert\n" );
rc = m_index.dropIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
}
void testIntegrationVolume() {
int rc, width = 8, count = 3, i, j;
uint64_t key = 123;
RID rid = 1;
IdxTree myTree;
BRMWrapper::setUseBrm(false);
m_index.setUseFreeMgr( false );
m_index.setUseListMgr( true );
m_index.setDebugLevel( DEBUG_3 );
for( i = 0; i < 3; i++ ) {
switch( i ) {
case 0: key = 123; width = 8; rid = 1; break;
case 1: key = 0xA1C9; width = 16; rid = 100; break;
case 2: key = 0xCA6E6D8E; width = 32; rid = 1000; break;
}
rc = m_index.dropIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
for( j = 0; j < count; j++ ) {
printf( "\nj=%d", j );
rc = m_index.updateIndex( key+j, width, rid + j );
if( rc != NO_ERROR )
printf( "\nrc=%d", rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
m_index.setAssignFbo( 1 + j );
}
for( j = 0; j < count; j++ ) {
rc = m_index.deleteIndex( key+j, width, rid + j );
CPPUNIT_ASSERT( rc == NO_ERROR );
}
m_index.closeIndex();
}
}
void testTreeGetTestbitValue() {
uint64_t key;
int width, bittestVal;
bool bStatus;
BRMWrapper::setUseBrm(false);
// test 8 bit
width = 8;
key = 35;
bStatus = m_index.getTestbitValue( key, width, 0, &bittestVal );
CPPUNIT_ASSERT( bStatus == true );
CPPUNIT_ASSERT( bittestVal == 4 );
bStatus = m_index.getTestbitValue( key, width, 1, &bittestVal );
CPPUNIT_ASSERT( bStatus == true );
CPPUNIT_ASSERT( bittestVal == 3 );
bStatus = m_index.getTestbitValue( key, width, 2, &bittestVal );
CPPUNIT_ASSERT( bStatus == false );
// test 16 bit
width = 16;
key = 0xA1C9;
bStatus = m_index.getTestbitValue( key, width, 0, &bittestVal );
CPPUNIT_ASSERT( bStatus == true );
CPPUNIT_ASSERT( bittestVal == 20 );
bStatus = m_index.getTestbitValue( key, width, 1, &bittestVal );
CPPUNIT_ASSERT( bStatus == true );
CPPUNIT_ASSERT( bittestVal == 7 );
bStatus = m_index.getTestbitValue( key, width, 2, &bittestVal );
CPPUNIT_ASSERT( bStatus == true );
CPPUNIT_ASSERT( bittestVal == 4 );
bStatus = m_index.getTestbitValue( key, width, 3, &bittestVal );
CPPUNIT_ASSERT( bittestVal == 1 );
CPPUNIT_ASSERT( bStatus == true );
bStatus = m_index.getTestbitValue( key, width, 4, &bittestVal );
CPPUNIT_ASSERT( bStatus == false );
// test 32 bit
width = 32;
key = 0xCA6E6D8E;
bStatus = m_index.getTestbitValue( key, width, 0, &bittestVal );
CPPUNIT_ASSERT( bStatus == true );
CPPUNIT_ASSERT( bittestVal == 25 );
bStatus = m_index.getTestbitValue( key, width, 1, &bittestVal );
CPPUNIT_ASSERT( bStatus == true );
CPPUNIT_ASSERT( bittestVal == 9 );
bStatus = m_index.getTestbitValue( key, width, 2, &bittestVal );
CPPUNIT_ASSERT( bStatus == true );
CPPUNIT_ASSERT( bittestVal == 23 );
bStatus = m_index.getTestbitValue( key, width, 3, &bittestVal );
CPPUNIT_ASSERT( bittestVal == 6 );
CPPUNIT_ASSERT( bStatus == true );
bStatus = m_index.getTestbitValue( key, width, 4, &bittestVal );
CPPUNIT_ASSERT( bittestVal == 27 );
CPPUNIT_ASSERT( bStatus == true );
bStatus = m_index.getTestbitValue( key, width, 5, &bittestVal );
CPPUNIT_ASSERT( bittestVal == 3 );
CPPUNIT_ASSERT( bStatus == true );
bStatus = m_index.getTestbitValue( key, width, 6, &bittestVal );
CPPUNIT_ASSERT( bittestVal == 2 );
CPPUNIT_ASSERT( bStatus == true );
bStatus = m_index.getTestbitValue( key, width, 7, &bittestVal );
CPPUNIT_ASSERT( bStatus == false );
}
void testTreeGetTreeNodeInfo() {
int rc, fbo = 6, sbid = 1, entry = 2, testbitVal = 5;
int curSbid = 3, curEntry = 2, allocCount, realCount;
IdxTreeGroupType curGroup;
bool entryMap[ENTRY_PER_SUBBLOCK];
DataBlock block;
IdxBitTestEntry bittestEntry;
// test ENTRY_1
m_index.clearBlock( &block );
curGroup = ENTRY_1;
m_index.setBittestEntry( &bittestEntry, testbitVal, curGroup, fbo, sbid, entry );
m_index.setSubBlockEntry( block.data, curSbid, curEntry, 8, &bittestEntry );
m_index.setBittestEntry( &bittestEntry, testbitVal + 3, curGroup, fbo + 6, sbid +3, entry + 1 );
m_index.setSubBlockEntry( block.data, curSbid, curEntry + 1, 8, &bittestEntry );
rc = m_index.getTreeNodeInfo( &block, curSbid, curEntry, 8, curGroup, &allocCount, &realCount, entryMap );
CPPUNIT_ASSERT( rc == NO_ERROR );
CPPUNIT_ASSERT( allocCount == 1 );
CPPUNIT_ASSERT( realCount == 1 );
CPPUNIT_ASSERT( entryMap[0] == true );
// test ENTRY_2
m_index.clearBlock( &block );
curGroup = ENTRY_2;
m_index.setBittestEntry( &bittestEntry, testbitVal, curGroup, fbo, sbid, entry );
m_index.setSubBlockEntry( block.data, curSbid, curEntry, 8, &bittestEntry );
m_index.setBittestEntry( &bittestEntry, testbitVal + 3, curGroup, fbo + 6, sbid +3, entry + 1 );
m_index.setSubBlockEntry( block.data, curSbid, curEntry + 1, 8, &bittestEntry );
m_index.setBittestEntry( &bittestEntry, testbitVal, curGroup, fbo + 6, sbid +3, entry + 1 );
bittestEntry.type = EMPTY_LIST;
m_index.setSubBlockEntry( block.data, curSbid, curEntry + 2, 8, &bittestEntry );
rc = m_index.getTreeNodeInfo( &block, curSbid, curEntry, 8, curGroup, &allocCount, &realCount, entryMap );
CPPUNIT_ASSERT( rc == NO_ERROR );
CPPUNIT_ASSERT( allocCount == 2 );
CPPUNIT_ASSERT( realCount == 2 );
CPPUNIT_ASSERT( entryMap[0] == true );
CPPUNIT_ASSERT( entryMap[1] == true );
CPPUNIT_ASSERT( entryMap[2] == false );
// test ENTRY_8
m_index.clearBlock( &block );
curGroup = ENTRY_8;
m_index.setBittestEntry( &bittestEntry, testbitVal, curGroup, fbo, sbid, entry );
m_index.setSubBlockEntry( block.data, curSbid, curEntry, 8, &bittestEntry );
m_index.setBittestEntry( &bittestEntry, testbitVal, curGroup, fbo + 6, sbid +3, entry + 1 );
bittestEntry.type = EMPTY_LIST;
m_index.setSubBlockEntry( block.data, curSbid, curEntry + 3, 8, &bittestEntry );
rc = m_index.getTreeNodeInfo( &block, curSbid, curEntry, 8, curGroup, &allocCount, &realCount, entryMap );
CPPUNIT_ASSERT( rc == ERR_IDX_TREE_INVALID_TYPE );
m_index.setBittestEntry( &bittestEntry, testbitVal, curGroup, fbo + 6, sbid +3, entry + 1 );
m_index.setSubBlockEntry( block.data, curSbid, curEntry + 3, 8, &bittestEntry );
bittestEntry.type = EMPTY_ENTRY;
m_index.setSubBlockEntry( block.data, curSbid, curEntry + 2, 2, &bittestEntry );
rc = m_index.getTreeNodeInfo( &block, curSbid, curEntry, 8, curGroup, &allocCount, &realCount, entryMap );
CPPUNIT_ASSERT( rc == NO_ERROR );
CPPUNIT_ASSERT( allocCount == 8 );
CPPUNIT_ASSERT( realCount == 2 );
CPPUNIT_ASSERT( entryMap[0] == true );
CPPUNIT_ASSERT( entryMap[1] == false );
CPPUNIT_ASSERT( entryMap[2] == false );
CPPUNIT_ASSERT( entryMap[3] == true );
CPPUNIT_ASSERT( entryMap[4] == false );
}
void testTreeGetTreeMatchEntry() {
int rc, fbo = 6, sbid = 1, entry = 2, testbitVal = 5;
int curSbid = 3, curEntry = 2, allocCount, realCount, matchEntry;
IdxTreeGroupType curGroup;
bool entryMap[ENTRY_PER_SUBBLOCK];
DataBlock block;
IdxBitTestEntry bittestEntry, checkEntry;
bool bFound;
//ENTRY_8
m_index.clearBlock( &block );
curGroup = ENTRY_8;
m_index.setBittestEntry( &bittestEntry, testbitVal, curGroup, fbo, sbid, entry );
m_index.setSubBlockEntry( block.data, curSbid, curEntry, 8, &bittestEntry );
m_index.setBittestEntry( &bittestEntry, testbitVal + 5, curGroup, fbo + 9, sbid + 6, entry + 2 );
m_index.setSubBlockEntry( block.data, curSbid, curEntry + 4, 8, &bittestEntry );
m_index.setBittestEntry( &bittestEntry, testbitVal + 9, curGroup, fbo + 6, sbid +3, entry + 1 );
m_index.setSubBlockEntry( block.data, curSbid, curEntry + 3, 8, &bittestEntry );
bittestEntry.type = EMPTY_ENTRY;
m_index.setSubBlockEntry( block.data, curSbid, curEntry + 2, 2, &bittestEntry );
rc = m_index.getTreeNodeInfo( &block, curSbid, curEntry, 8, curGroup, &allocCount, &realCount, entryMap );
CPPUNIT_ASSERT( rc == NO_ERROR );
CPPUNIT_ASSERT( allocCount == 8 );
CPPUNIT_ASSERT( realCount == 3 );
CPPUNIT_ASSERT( entryMap[0] == true );
CPPUNIT_ASSERT( entryMap[1] == false );
CPPUNIT_ASSERT( entryMap[2] == false );
CPPUNIT_ASSERT( entryMap[3] == true );
CPPUNIT_ASSERT( entryMap[4] == true );
CPPUNIT_ASSERT( entryMap[5] == false );
memset( &checkEntry, 0, 8 );
checkEntry.type = BIT_TEST;
checkEntry.bitTest = testbitVal + 4;
bFound = m_index.getTreeMatchEntry( &block, curSbid, curEntry, 8, allocCount, entryMap, &matchEntry, &checkEntry );
CPPUNIT_ASSERT( bFound == false );
checkEntry.bitTest = testbitVal + 9;
bFound = m_index.getTreeMatchEntry( &block, curSbid, curEntry, 8, allocCount, entryMap, &matchEntry, &checkEntry );
CPPUNIT_ASSERT( bFound == true );
CPPUNIT_ASSERT( matchEntry == 3 );
m_index.setBittestEntry( &bittestEntry, testbitVal + 5, curGroup, fbo + 9, sbid + 6, entry + 2 );
checkEntry.bitTest = testbitVal + 5;
bFound = m_index.getTreeMatchEntry( &block, curSbid, curEntry, 8, allocCount, entryMap, &matchEntry, &checkEntry );
CPPUNIT_ASSERT( bFound == true );
CPPUNIT_ASSERT( matchEntry == 4 );
CPPUNIT_ASSERT( !memcmp( &checkEntry, &bittestEntry, 8 ) );
}
void testTreeMoveEntry() {
int rc, fbo = 6, sbid = 1, entry = 2, testbitVal = 5;
int curSbid = 3, curEntry = 2, allocCount, realCount, moveCount;
IdxTreeGroupType curGroup;
bool entryMap[ENTRY_PER_SUBBLOCK];
DataBlock oldBlock, newBlock, testBlock, blankBlock;
IdxBitTestEntry bittestEntry;
FILE* treeFile;
if( m_index.exists( 990 ) ) {
rc = m_index.dropIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
}
BRMWrapper::setUseBrm(false);
rc = m_index.createIndex( 990, 991, false );
CPPUNIT_ASSERT( rc == NO_ERROR );
treeFile = m_index.openFile( 990 );
CPPUNIT_ASSERT( treeFile != NULL );
//ENTRY_8
m_index.clearBlock( &oldBlock );
m_index.clearBlock( &newBlock );
m_index.clearBlock( &testBlock );
m_index.clearBlock( &blankBlock );
curGroup = ENTRY_8;
m_index.setBittestEntry( &bittestEntry, testbitVal, curGroup, fbo, sbid, entry );
m_index.setSubBlockEntry( oldBlock.data, curSbid, curEntry, 8, &bittestEntry );
m_index.setBittestEntry( &bittestEntry, testbitVal + 5, curGroup, fbo + 9, sbid + 6, entry + 2 );
m_index.setSubBlockEntry( oldBlock.data, curSbid, curEntry + 4, 8, &bittestEntry );
m_index.setBittestEntry( &bittestEntry, testbitVal + 9, curGroup, fbo + 6, sbid +3, entry + 1 );
m_index.setSubBlockEntry( oldBlock.data, curSbid, curEntry + 3, 8, &bittestEntry );
bittestEntry.type = EMPTY_ENTRY;
m_index.setSubBlockEntry( oldBlock.data, curSbid, curEntry + 2, 2, &bittestEntry );
rc = m_index.getTreeNodeInfo( &oldBlock, curSbid, curEntry, 8, curGroup, &allocCount, &realCount, entryMap );
CPPUNIT_ASSERT( rc == NO_ERROR );
CPPUNIT_ASSERT( allocCount == 8 );
CPPUNIT_ASSERT( realCount == 3 );
CPPUNIT_ASSERT( entryMap[0] == true );
CPPUNIT_ASSERT( entryMap[1] == false );
CPPUNIT_ASSERT( entryMap[2] == false );
CPPUNIT_ASSERT( entryMap[3] == true );
CPPUNIT_ASSERT( entryMap[4] == true );
CPPUNIT_ASSERT( entryMap[5] == false );
rc = m_index.writeDBFile( treeFile, &oldBlock, 3 );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.closeFile( treeFile );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.moveEntry( 3, curSbid, curEntry, 8,
5, curSbid + 10, curEntry + 1, curGroup, allocCount, entryMap, &moveCount );
CPPUNIT_ASSERT( rc == NO_ERROR );
CPPUNIT_ASSERT( moveCount == 3 );
m_index.closeIndex();
treeFile = m_index.openFile( 990 );
CPPUNIT_ASSERT( treeFile != NULL );
rc = m_index.readDBFile( treeFile, &testBlock, 3 );
CPPUNIT_ASSERT( rc == NO_ERROR );
CPPUNIT_ASSERT( !memcmp( testBlock.data, blankBlock.data, sizeof( testBlock.data )));
rc = m_index.readDBFile( treeFile, &testBlock, 5 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.getTreeNodeInfo( &testBlock, curSbid + 10, curEntry + 1, 8, curGroup, &allocCount, &realCount, entryMap );
CPPUNIT_ASSERT( rc == NO_ERROR );
CPPUNIT_ASSERT( allocCount == 8 );
CPPUNIT_ASSERT( realCount == 3 );
CPPUNIT_ASSERT( entryMap[0] == true );
CPPUNIT_ASSERT( entryMap[1] == true );
CPPUNIT_ASSERT( entryMap[2] == true );
CPPUNIT_ASSERT( entryMap[3] == false );
CPPUNIT_ASSERT( entryMap[4] == false );
CPPUNIT_ASSERT( entryMap[5] == false );
m_index.closeFile( treeFile );
}
void testTreeNodeAssert( IdxTree myTree, int curLevel, uint64_t curBitTest, uint16_t curGroup,
uint64_t curFbo, uint64_t curSbid, uint64_t curEntry, uint64_t nextFbo, uint64_t nextSbid, uint64_t nextEntry )
{
CPPUNIT_ASSERT( myTree.node[curLevel].current.bitTest == curBitTest );
CPPUNIT_ASSERT( myTree.node[curLevel].current.group == curGroup );
CPPUNIT_ASSERT( myTree.node[curLevel].current.fbo == curFbo );
CPPUNIT_ASSERT( myTree.node[curLevel].current.sbid == curSbid );
CPPUNIT_ASSERT( myTree.node[curLevel].current.entry == curEntry );
if( curLevel == 0 )
CPPUNIT_ASSERT( myTree.node[curLevel].current.type == BITMAP_PTR );
else
if( curLevel == myTree.maxLevel - 1 )
CPPUNIT_ASSERT( myTree.node[curLevel].current.type == LEAF_LIST );
else
CPPUNIT_ASSERT( myTree.node[curLevel].current.type == BIT_TEST );
CPPUNIT_ASSERT( myTree.node[curLevel].next.fbo == nextFbo );
CPPUNIT_ASSERT( myTree.node[curLevel].next.sbid == nextSbid );
CPPUNIT_ASSERT( myTree.node[curLevel].next.entry == nextEntry );
CPPUNIT_ASSERT( myTree.node[curLevel].allocCount == (0x1 << curGroup) );
CPPUNIT_ASSERT( myTree.node[curLevel].used == true );
}
void testTreeBuildEmptyTree() {
int rc, width = 8, rid = 3;
uint64_t key = 123;
IdxTree myTree;
BRMWrapper::setUseBrm(false);
rc = m_index.dropIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.buildEmptyTreePart( key, width, rid, 0 );
CPPUNIT_ASSERT( rc == ERR_IDX_TREE_INVALID_LEVEL );
rc = m_index.buildEmptyTreePart( key, 4, rid, 0 );
CPPUNIT_ASSERT( rc == ERR_IDX_TREE_INVALID_LEVEL );
rc = m_index.updateIndex( key, width, rid );
CPPUNIT_ASSERT( rc == NO_ERROR );
// width = 8
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 2 );
CPPUNIT_ASSERT( myTree.key == key );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) rid );
testTreeNodeAssert( myTree, 0, 15, ENTRY_32, 0, 1, 15,/* */ 1, 3, 4 );
testTreeNodeAssert( myTree, 1, 3, ENTRY_1, 1,3,4, /* */ 3, 3, 4 );
CPPUNIT_ASSERT( myTree.node[2].used == false );
// width = 16
key = 0xA1C9;
width = 16;
rc = m_index.updateIndex( key, width, rid );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 4 );
CPPUNIT_ASSERT( myTree.key == key );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) rid );
testTreeNodeAssert( myTree, 0, 20, ENTRY_32, 0, 1, 20,/* */ 1, 3, 4 );
testTreeNodeAssert( myTree, 1, 7, ENTRY_1, 1,3,4, /* */ 1, 4, 4 );
testTreeNodeAssert( myTree, 2, 4, ENTRY_1, 1,4,4, /* */ 1, 5, 4 );
testTreeNodeAssert( myTree, 3, 1, ENTRY_1, 1,5,4,/* */ 3, 3, 6 );
CPPUNIT_ASSERT( myTree.node[4].used == false );
// width = 32
key = 0xCA6E6D8E;
width = 32;
rc = m_index.updateIndex( key, width, rid );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 7 );
CPPUNIT_ASSERT( myTree.key == key );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) rid );
testTreeNodeAssert( myTree, 0, 25, ENTRY_32, 0, 1, 25,/* */ 1, 3, 4 );
testTreeNodeAssert( myTree, 1, 9, ENTRY_1, 1,3,4, /* */ 1, 4, 4 );
testTreeNodeAssert( myTree, 2, 23, ENTRY_1, 1,4,4, /* */ 1, 5, 4 );
testTreeNodeAssert( myTree, 3, 6, ENTRY_1, 1,5,4,/* */ 1, 6, 4 );
testTreeNodeAssert( myTree, 4, 27, ENTRY_1, 1,6,4, /* */ 1, 7, 4 );
testTreeNodeAssert( myTree, 5, 3, ENTRY_1, 1,7,4,/* */ 1, 8, 4 );
testTreeNodeAssert( myTree, 6, 2, ENTRY_1, 1,8,4,/* */ 3, 3, 9 );
CPPUNIT_ASSERT( myTree.node[7].used == false );
m_index.closeIndex();
}
void testTreeBuildExistTree1() {
int rc, width = 8, rid = 3;
uint64_t key = 123;
IdxTree myTree;
BRMWrapper::setUseBrm(false);
rc = m_index.dropIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.updateIndex( key, width, rid );
CPPUNIT_ASSERT( rc == NO_ERROR );
// width = 8
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 2 );
CPPUNIT_ASSERT( myTree.key == key );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) rid );
testTreeNodeAssert( myTree, 0, 15, ENTRY_32, 0, 1, 15,/* */ 1, 3, 4 );
testTreeNodeAssert( myTree, 1, 3, ENTRY_1, 1,3,4,/* */ 3, 3, 4 );
CPPUNIT_ASSERT( myTree.node[2].used == false );
// insert again
m_index.setAssignFbo( 1 );
rc = m_index.updateIndex( key, width, rid + 3 );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 2 );
CPPUNIT_ASSERT( myTree.key == key );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) (rid + 3) );
testTreeNodeAssert( myTree, 0, 15, ENTRY_32, 0, 1, 15,/* */ 1, 3, 4 );
testTreeNodeAssert( myTree, 1, 3, ENTRY_1, 1,3,4,/* */ 3, 3, 4 );
CPPUNIT_ASSERT( myTree.node[2].used == false );
// insert with a little different key
m_index.setAssignFbo( 2 );
rc = m_index.updateIndex( key + 1, width, rid + 4 );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 2 );
CPPUNIT_ASSERT( myTree.key == key + 1 );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) (rid + 4) );
testTreeNodeAssert( myTree, 0, 15, ENTRY_32, 0, 1, 15,/* */ 3, 4, 4 );
testTreeNodeAssert( myTree, 1, 4, ENTRY_2, 3, 4, 4,/* */ 3, 3, 4 );
CPPUNIT_ASSERT( myTree.node[2].used == false );
// insert with a different key and different rid
m_index.setAssignFbo( 3 );
rc = m_index.updateIndex( key + 2, width, rid + 5 );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 2 );
CPPUNIT_ASSERT( myTree.key == key + 2 );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) (rid + 5) );
testTreeNodeAssert( myTree, 0, 15, ENTRY_32, 0, 1, 15,/* */ 4, 4, 4 );
testTreeNodeAssert( myTree, 1, 5, ENTRY_4, 4, 4, 4,/* */ 3, 3, 4 );
CPPUNIT_ASSERT( myTree.node[1].useCount == 3 );
CPPUNIT_ASSERT( myTree.node[2].used == false );
// insert with a different key and different rid
m_index.setAssignFbo( 4 );
rc = m_index.updateIndex( key + 3, width, rid + 7 );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 2 );
CPPUNIT_ASSERT( myTree.key == key + 3 );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) (rid + 7) );
testTreeNodeAssert( myTree, 0, 15, ENTRY_32, 0, 1, 15,/* */ 4, 4, 4 );
testTreeNodeAssert( myTree, 1, 6, ENTRY_4, 4, 4, 4,/* */ 3, 3, 4 );
CPPUNIT_ASSERT( myTree.node[2].used == false );
m_index.closeIndex();
}
void testTreeBuildExistTree2() {
int rc, width = 16, rid = 3;
uint64_t key = 0xA1C9;
IdxTree myTree;
BRMWrapper::setUseBrm(false);
rc = m_index.dropIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.createIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.updateIndex( key, width, rid );
CPPUNIT_ASSERT( rc == NO_ERROR );
// width = 16
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 4 );
CPPUNIT_ASSERT( myTree.key == key );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) rid );
testTreeNodeAssert( myTree, 0, 20, ENTRY_32, 0, 1, 20,/* */ 1, 3, 4 );
testTreeNodeAssert( myTree, 1, 7, ENTRY_1, 1,3,4, /* */ 1, 4, 4 );
testTreeNodeAssert( myTree, 2, 4, ENTRY_1, 1,4,4, /* */ 1, 5, 4 );
testTreeNodeAssert( myTree, 3, 1, ENTRY_1, 1,5,4,/* */ 3, 3, 6 );
CPPUNIT_ASSERT( myTree.node[4].used == false );
// insert again
m_index.setAssignFbo( 1 );
rc = m_index.updateIndex( key, width, rid + 3 );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 4 );
CPPUNIT_ASSERT( myTree.key == key );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) (rid + 3));
testTreeNodeAssert( myTree, 0, 20, ENTRY_32, 0, 1, 20,/* */ 1, 3, 4 );
testTreeNodeAssert( myTree, 1, 7, ENTRY_1, 1,3,4, /* */ 1, 4, 4 );
testTreeNodeAssert( myTree, 2, 4, ENTRY_1, 1,4,4, /* */ 1, 5, 4 );
testTreeNodeAssert( myTree, 3, 1, ENTRY_1, 1,5,4,/* */ 3, 3, 6 );
CPPUNIT_ASSERT( myTree.node[4].used == false );
// insert with a little different key
m_index.setAssignFbo( 2 );
rc = m_index.updateIndex( key + 1, width, rid + 4 );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 4 );
CPPUNIT_ASSERT( myTree.key == key + 1 );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) (rid + 4));
testTreeNodeAssert( myTree, 0, 20, ENTRY_32, 0, 1, 20,/* */ 1, 3, 4 );
// testTreeNodeAssert( myTree, 1, 7, ENTRY_1, 1,3,4, /* */ 3, 5, 5 );
testTreeNodeAssert( myTree, 2, 5, ENTRY_2, 3,5,5, /* */ 3, 3, 4 );
testTreeNodeAssert( myTree, 3, 0, ENTRY_1, 3,3,4,/* */ 3, 3, 6 );
CPPUNIT_ASSERT( myTree.node[4].used == false );
// insert with a different key and different rid
m_index.setAssignFbo( 3 );
rc = m_index.updateIndex( key + 2, width, rid + 5 );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 4 );
CPPUNIT_ASSERT( myTree.key == key + 2 );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) (rid + 5));
testTreeNodeAssert( myTree, 0, 20, ENTRY_32, 0, 1, 20,/* */ 1, 3, 4 );
// testTreeNodeAssert( myTree, 1, 7, ENTRY_1, 1,3,4, /* */ 3, 5, 5 );
testTreeNodeAssert( myTree, 2, 5, ENTRY_2, 3,5,5, /* */ 4, 6, 4 );
testTreeNodeAssert( myTree, 3, 1, ENTRY_2, 4,6,4,/* */ 3, 3, 6 );
CPPUNIT_ASSERT( myTree.node[4].used == false );
// insert with a different key and different rid
m_index.setAssignFbo( 4 );
rc = m_index.updateIndex( key + 3, width, rid + 7 );
CPPUNIT_ASSERT( rc == NO_ERROR );
myTree = m_index.getTree();
CPPUNIT_ASSERT( myTree.maxLevel == 4 );
CPPUNIT_ASSERT( myTree.key == key + 3 );
CPPUNIT_ASSERT( myTree.width == width );
CPPUNIT_ASSERT( myTree.rid == (RID) (rid + 7));
testTreeNodeAssert( myTree, 0, 20, ENTRY_32, 0, 1, 20,/* */ 1, 3, 4 );
// testTreeNodeAssert( myTree, 1, 7, ENTRY_1, 1,3,4, /* */ 3, 5, 5 );
testTreeNodeAssert( myTree, 2, 6, ENTRY_4, 5,5,6, /* */ 5, 3, 4 );
testTreeNodeAssert( myTree, 3, 0, ENTRY_1, 5,3,4,/* */ 3, 3, 6 );
CPPUNIT_ASSERT( myTree.node[4].used == false );
m_index.closeIndex();
// set a blank entry
IdxBitTestEntry curEntry;
FILE* treeFile;
DataBlock curBlock;
treeFile = m_index.openFile( 990 );
CPPUNIT_ASSERT( treeFile != NULL );
rc = m_index.readSubBlockEntry( treeFile, &curBlock, 1, 3, 4, MAX_COLUMN_BOUNDARY, &curEntry );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.setBlankEntry( &curEntry );
rc = m_index.writeSubBlockEntry( treeFile, &curBlock, 1, 3, 4, MAX_COLUMN_BOUNDARY, &curEntry );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.closeFile( treeFile );
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.updateIndex( key, width, rid );
CPPUNIT_ASSERT( rc == ERR_STRUCT_EMPTY );
m_index.closeIndex();
}
void testTreeIntegration() {
IdxEmptyListEntry myEntry;
int rc;
BRMWrapper::setUseBrm(false);
rc = m_index.openIndex( 990, 991 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.assignSegment( ENTRY_1, &myEntry, 0 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.releaseSegment( ENTRY_1, &myEntry );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.setUseFreeMgr( true );
rc = m_index.assignSegment( ENTRY_1, &myEntry, 0 );
CPPUNIT_ASSERT( rc == NO_ERROR );
rc = m_index.releaseSegment( ENTRY_1, &myEntry );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_index.closeIndex();
}
void testFreeMgrBRM() {
int rc;
int allocSize;
CommBlock cb;
uint64_t lbid;
uint64_t fbo;
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("\nUT: Begin testFreeMgrBRM\n");
m_freeMgr.deleteFile( 777 );
m_freeMgr.createFile( 777, 80, allocSize );
m_freeMgr.createFile( 778, 80, allocSize );
cb.file.oid = 777 ;
fbo =0;
lbid = m_freeMgr.mapLBID( cb, fbo, rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
printf("OID: %u FBO: %llu LBID: %llu\n", cb.file.oid, fbo, lbid);
cb.file.oid = 777 ;
fbo =10;
lbid = m_freeMgr.mapLBID( cb, fbo, rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
printf("OID: %u FBO: %llu LBID: %llu\n", cb.file.oid, fbo, lbid);
cb.file.oid = 777 ;
fbo =1023;
lbid = m_freeMgr.mapLBID( cb, fbo, rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
printf("OID: %u FBO: %llu LBID: %llu\n", cb.file.oid, fbo, lbid);
cb.file.oid = 777 ;
fbo =1020;
lbid = m_freeMgr.mapLBID( cb, fbo, rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
printf("OID: %u FBO: %llu LBID: %llu\n", cb.file.oid, fbo, lbid);
cb.file.oid = 778 ;
fbo = 0;
lbid = m_freeMgr.mapLBID( cb, fbo, rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
printf("OID: %u FBO: %llu LBID: %llu\n", cb.file.oid, fbo, lbid);
cb.file.oid = 778 ;
fbo = 1000;
lbid = m_freeMgr.mapLBID( cb, fbo, rc );
CPPUNIT_ASSERT( rc == NO_ERROR );
printf("OID: %u FBO: %llu LBID: %llu\n", cb.file.oid, fbo, lbid);
CPPUNIT_ASSERT( rc == NO_ERROR );
}
void testFreeMgrInit() {
FILE* indexFile;
DataBlock blockZero;
IdxEmptyListEntry emptyMap, assignPtr;
CommBlock cb;
int allocSize, rc;
uint64_t lbid;
m_freeMgr.setDebugLevel( DEBUG_1 );
printf("\nUT: Begin testFreeMgrInit\n");
assignPtr.fbo = 0;
assignPtr.sbid = 0;
assignPtr.entry = 0;
assignPtr.type= 0;
cb.file.pFile = NULL;
CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == ERR_INVALID_PARAM );
m_freeMgr.deleteFile( 777 );
m_freeMgr.deleteFile( 778 );
m_freeMgr.createFile( 778, 8, allocSize ); // create a second file to try and force lbid range to not collide with fbo
m_freeMgr.createFile( 777, 8, allocSize );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
// m_indexlist.createFile(777,800, allocSize);
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, 1234 ) == ERR_INVALID_PARAM );
// init a freemgr for a tree
CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb.file.pFile, blockZero.data, lbid );
m_freeMgr.getSubBlockEntry( blockZero.data, 0, 1+ENTRY_32, 8, &emptyMap );
// check the entries are as expected
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_32 );
// CPPUNIT_ASSERT( emptyMap.fbo == 1 );
// CPPUNIT_ASSERT( emptyMap.entry == 31 ); // points to last entry in sub-block
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_16, 8, &emptyMap);
// check the entries are as expected
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_16 );
// printf("UT: fbo: %llu sbid: %i entry: %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
CPPUNIT_ASSERT( emptyMap.fbo == 0 );
CPPUNIT_ASSERT( emptyMap.entry == 0 );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_8, 8, &emptyMap);
// check the entries are as expected
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_8 );
CPPUNIT_ASSERT( emptyMap.fbo == 0 );
CPPUNIT_ASSERT( emptyMap.entry == 0 );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_4, 8, &emptyMap);
// check the entries are as expected
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_4 );
CPPUNIT_ASSERT( emptyMap.fbo == 0 );
CPPUNIT_ASSERT( emptyMap.entry == 0 );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_2, 8, &emptyMap);
// check the entries are as expected
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_2 );
CPPUNIT_ASSERT( emptyMap.fbo == 0 );
CPPUNIT_ASSERT( emptyMap.entry == 0 );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_1, 8, &emptyMap);
// check the entries are as expected
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_1 );
CPPUNIT_ASSERT( emptyMap.fbo == 0 );
CPPUNIT_ASSERT( emptyMap.entry == 0 );
// assign a segment and check that entries in sb0 change
printf("UT: Init: Assign ENTRY_32 fbo: %llu sbid: %i entry: %i\n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
CPPUNIT_ASSERT( assignPtr.entry == 0 ); // points to start of sub-block
// CPPUNIT_ASSERT( assignPtr.fbo == 1 ); //
CPPUNIT_ASSERT( assignPtr.group == ENTRY_32 );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &emptyMap);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_32 );
// CPPUNIT_ASSERT( emptyMap.fbo == 1 );
// CPPUNIT_ASSERT( emptyMap.entry == 30 ); // points to second to last entry in sub-block
// release segment and see if head pointer moves
rc = m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr );
CPPUNIT_ASSERT( rc == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &emptyMap);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_32 );
// CPPUNIT_ASSERT( emptyMap.fbo == 1 );
// CPPUNIT_ASSERT( emptyMap.sbid == 31 );
// CPPUNIT_ASSERT( emptyMap.entry == 31 ); // points to last entry in sub-block
// release to wrong list
printf("UT: Put sub-block segment on list of 16 (expect error)\n");
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == ERR_FM_RELEASE_ERR );
// tweak type then try to release
// printf("UT: Release EMPTY_LIST entry\n");
// assignPtr.type = EMPTY_LIST;
// CPPUNIT_ASSERT( freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == ERR_FM_BAD_TYPE );
printf("UT: assign ENTRY_16 segment\n");
// assign ENTRY_16 segment
CPPUNIT_ASSERT_MESSAGE( "Failed assigning ENTRY_16 segment", m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_16, 8, &emptyMap);
CPPUNIT_ASSERT_MESSAGE( "Empty map type should be EMPTY_LIST", emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_16 );
// CPPUNIT_ASSERT( emptyMap.fbo == 1 );
// CPPUNIT_ASSERT( emptyMap.sbid == 0 );
// CPPUNIT_ASSERT( emptyMap.entry == 1 ); // points to last entry in sub-block
// release ENTRY_16 segment
printf("UT: Release ENTRY_16 segment\n");
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
// legal segment size but list is empty - causes list to be populated
printf("UT: Assign from ENTRY_4 list - which is empty\n");
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_4, &assignPtr ) == NO_ERROR );
printf("UT: After Assign ENTRY_4 fbo: %llu sbid: %i entry: %i\n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry);
//Check ENTRY_4 in map
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_4, 8, &emptyMap);
printf("UT: fbo: %llu sbid: %i entry: %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
// ENTRY_4 segment size
printf("UT: Assign from ENTRY_4 list - which is no longer empty\n");
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_4, &assignPtr ) == NO_ERROR );
printf("UT: Assign from ENTRY_4 fbo: %llu sbid: %i entry: %i\n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry);
// cleanup
m_freeMgr.writeDBFile( indexFile, blockZero.data, lbid );
m_freeMgr.closeFile( indexFile );
}
// list tests
void testFreeMgrInit2() {
FILE* indexFile;
CommBlock cb;
DataBlock blockZero;
IdxEmptyListEntry emptyMap, assignPtr;
int allocSize, rc;
uint64_t lbid;
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("\nUT: Begin testFreeMgrInit2\n");
assignPtr.fbo = 0;
assignPtr.sbid = 0;
assignPtr.entry = 0;
assignPtr.type= 0;
m_freeMgr.deleteFile( 776 );
rc = m_freeMgr.createFile( 776, 80, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 776 );
cb.file.oid = 776;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, LIST ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readSubBlockEntry( cb, &blockZero, lbid, 0, 1+ENTRY_BLK, 8, &emptyMap );
// check the entries are as expected
printf("UT: fbo: %llu sbid: %i entry: %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_BLK );
CPPUNIT_ASSERT( emptyMap.fbo != 0 );
// CPPUNIT_ASSERT( emptyMap.entry == 31 ); // points to last entry in sub-block
// assign a segment and check that entries in sb0 change
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_BLK, &assignPtr ) == NO_ERROR );
CPPUNIT_ASSERT( assignPtr.group == ENTRY_BLK ); // right group
// CPPUNIT_ASSERT( assignPtr.entry == 0 ); // right position
// CPPUNIT_ASSERT( assignPtr.sbid == 31 ); // right position
// CPPUNIT_ASSERT( assignPtr.fbo == 1 ); // right block
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_BLK, 8, &emptyMap);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_BLK );
// CPPUNIT_ASSERT( emptyMap.fbo == 1 );
// CPPUNIT_ASSERT( emptyMap.sbid == 0 );
// CPPUNIT_ASSERT( emptyMap.entry == 30 ); // points to second to last entry in sub-block
// illegal segment size
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_16, &assignPtr ) == ERR_INVALID_PARAM );
// illegal segment size
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_8, &assignPtr ) == ERR_INVALID_PARAM );
// illegal segment size
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_2, &assignPtr ) == ERR_INVALID_PARAM );
// illegal segment size
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_1, &assignPtr ) == ERR_INVALID_PARAM );
// legal segment size but list is empty
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_4, &assignPtr ) == NO_ERROR );
CPPUNIT_ASSERT( assignPtr.group == ENTRY_4 ); // points to start of sub-block
CPPUNIT_ASSERT( assignPtr.entry == 28 );
// CPPUNIT_ASSERT( assignPtr.sbid == 29 );
// CPPUNIT_ASSERT( assignPtr.fbo == 1 );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_4, 8, &emptyMap);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_4 );
// CPPUNIT_ASSERT( emptyMap.fbo == 1 );
// CPPUNIT_ASSERT( emptyMap.sbid == 30 );
CPPUNIT_ASSERT( emptyMap.entry == 7 ); // eight segments in list
// CPPUNIT_ASSERT( emptyMap.entry == 31 ); // 32 segments if using blocks for buckets
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_4, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_4, 8, &emptyMap);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_4 );
// CPPUNIT_ASSERT( emptyMap.fbo == 1 );
// CPPUNIT_ASSERT( emptyMap.sbid == 30 );
CPPUNIT_ASSERT( emptyMap.entry == 8 ); // eight segments in list
// CPPUNIT_ASSERT( (int)emptyMap.entry == 32 ); // 32 segments if using blocks for buckets
m_freeMgr.writeDBFile( cb, blockZero.data, lbid );
m_freeMgr.closeFile( indexFile );
}
void testFreeMgrAssign() {
/**
* Assign tests
*/
FILE* indexFile;
CommBlock cb;
DataBlock blockZero;
IdxEmptyListEntry assignPtr, assignPtr2;
IdxEmptyListEntry assignPtr3, assignPtr4;
IdxEmptyListEntry emptyMap;
int idx, result;
int allocSize, rc;
IdxEmptyListEntry entries[1500];
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("\nUT: Begin testFreeMgrAssign\n");
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 8, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
/* m_freeMgr.readDBFile( indexFile, blockZero.data, 0 );
m_index.printMemSubBlock( &blockZero , 0 );*/
uint64_t lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( indexFile, blockZero.data, lbid );
// m_index.printMemSubBlock( &blockZero , 0 );
printf("\nUT: Cont testFreeMgrAssign\n");
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, 0, TREE, ENTRY_32, &assignPtr ) == ERR_INVALID_PARAM );
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, 0 ) == ERR_INVALID_PARAM );
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, 1234, ENTRY_32, &assignPtr ) == ERR_INVALID_PARAM );
// Assign a segment
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
// Assign a second segment and make sure that we get different pointers
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr2 ) == NO_ERROR );
printf("UT: sbid: %i sbid2: %i\n", (unsigned int)assignPtr.sbid, (unsigned int)assignPtr2.sbid);
CPPUNIT_ASSERT( assignPtr.sbid != assignPtr2.sbid); // assigned from sb list so cannot have same sbid
CPPUNIT_ASSERT( assignPtr.type = EMPTY_PTR );
CPPUNIT_ASSERT( assignPtr2.type = EMPTY_PTR );
// release in 'wrong' order ..
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr2 ) == NO_ERROR );
// .. then check that the list issues them in the return order
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr3 ) == NO_ERROR );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr4 ) == NO_ERROR );
// CPPUNIT_ASSERT( assignPtr2.sbid == assignPtr3.sbid);
// CPPUNIT_ASSERT( assignPtr.sbid == assignPtr4.sbid);
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr3 ) == NO_ERROR );
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr4 ) == NO_ERROR );
//assign lots of sub-blocks
printf("UT: Assign lots of sub-blocks\n");
for (idx=0; idx<39; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &entries[idx] ) == NO_ERROR );
printf("UT: Visit: %03i fbo: %llu sbid: %02i entry: %02i in 'Assign lots of sub-blocks, assigning'\n", idx, entries[idx].fbo, (unsigned int)(entries[idx].sbid), (unsigned int)(entries[idx].entry));
}
printf("UT: Releasing\n");
for (idx --; idx>-1; idx--){
// printf("UT: Visit: %i\n", idx);
printf("UT: Visit: %03i fbo: %llu sbid: %02i entry: %02i in 'Assign lots of sub-blocks, releasing'\n", idx, entries[idx].fbo, (unsigned int)(entries[idx].sbid), (unsigned int)(entries[idx].entry));
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &entries[idx] ) == NO_ERROR );
}
for (idx=0; idx<39; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &entries[idx] ) == NO_ERROR );
printf("UT: Visit: %03i fbo: %llu sbid: %02i entry: %02i in 'Assign lots of sub-blocks, assigning'\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
}
//assign lots of smaller segments
printf("UT: Assign lots of smaller segments\n");
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
printf("UT: fbo: %llu sbid: %i entry: %i \n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
printf("UT: fbo: %llu sbid: %i entry: %i \n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
printf("UT: fbo: %llu sbid: %i entry: %i \n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
printf("UT: fbo: %llu sbid: %i entry: %i \n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR );
printf("UT: fbo: %llu sbid: %i entry: %i \n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR );
printf("UT: fbo: %llu sbid: %i entry: %i \n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR );
printf("UT: fbo: %llu sbid: %i entry: %i \n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR );
printf("UT: fbo: %llu sbid: %i entry: %i \n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_4, &assignPtr ) == NO_ERROR );
printf("UT: fbo: %llu sbid: %i entry: %i \n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_2, &assignPtr ) == NO_ERROR );
printf("UT: fbo: %llu sbid: %i entry: %i \n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
printf("UT: Assign lots of segments after init\n");
CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( indexFile, blockZero.data, lbid );
// use up 32 entries
// assign more than 32 entries, keeping track of them all, then release them causing the chain to extend over two blocks
printf("UT: Assign more than 32 segments\n");
for (idx=0; idx<39; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_4, &entries[idx] ) == NO_ERROR );
printf("UT: Visit: %i fbo: %llu sbid: %i entry: %i in 'Assign more than 32 segments'\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
}
printf("UT: Releasing\n");
for (idx --; idx>-1; idx--){
// printf("UT: Visit: %i\n", idx);
printf("UT: Visit: %i fbo: %llu sbid: %i entry: %i in 'Assign more than 32 segments, releasing'\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_4, &entries[idx] ) == NO_ERROR );
}
for (idx=0; idx<39; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_4, &entries[idx] ) == NO_ERROR );
printf("UT: Visit: %i fbo: %llu sbid: %i entry: %i in 'Assign more than 32 segments'\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
}
// commmenting this next bit breaks things
// CPPUNIT_ASSERT( freeMgr.init( indexFile, TREE ) == NO_ERROR );
// dbFileOp.readDBFile( indexFile, blockZero.data, 0 );
printf("UT: Use almost all free space\n");
for (idx=0; idx<215; idx++){
result = m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr );
printf("UT: Visit: %i fbo: %llu sbid: %i entry: %i, result = %i\n", idx, assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry, result);
CPPUNIT_ASSERT ( result == NO_ERROR );
}
// assign one more than is available, expect error
CPPUNIT_ASSERT( (result = m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr2 )) != ERR_FM_NO_SPACE );
// release last assigned segment
CPPUNIT_ASSERT( (result = m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr )) == NO_ERROR );
// assign segment, expect no error
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
// assign segment after using up the list
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr2 ) != ERR_FM_NO_SPACE );
//release the segment, expect to become first bucket
printf("UT: Putting sub-block back\n");
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &emptyMap);
printf("UT: After putting one sb back fbo: %llu sbid: %i entry: %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_32 );
// CPPUNIT_ASSERT( emptyMap.fbo == 7 );
// CPPUNIT_ASSERT( emptyMap.sbid == 0 );
// CPPUNIT_ASSERT( emptyMap.entry == 1 ); // points to second to last entry in sub-block
printf("UT: Request space after using all space\n");
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) != ERR_FM_NO_SPACE );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) != ERR_FM_NO_SPACE );
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_4, &assignPtr ) == NO_ERROR + 1);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_2, &assignPtr ) != ERR_FM_NO_SPACE );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_1, &assignPtr ) != ERR_FM_NO_SPACE );
m_freeMgr.writeDBFile( indexFile, blockZero.data, lbid );
m_freeMgr.closeFile( indexFile );
printf("UT: End testFreeMgrAssign\n");
}
void testFreeMgrAssignList() {
/**
* Assign tests
*/
FILE* indexFile;
DataBlock blockZero;
IdxEmptyListEntry assignPtr, assignPtr2;
IdxEmptyListEntry assignPtr3, assignPtr4;
IdxEmptyListEntry emptyMap;
int rc;
int allocSize;
CommBlock cb;
uint64_t lbid;
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("UT: Begin testFreeMgrAssignList\n");
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 8, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, LIST ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, 0, LIST, ENTRY_32, &assignPtr ) == ERR_INVALID_PARAM );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, 0 ) == ERR_INVALID_PARAM );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, 1234, ENTRY_32, &assignPtr ) == ERR_INVALID_PARAM );
// Assign a segment
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr ) == NO_ERROR );
// Assign a second segment and make sure that we get different pointers
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr2 ) == NO_ERROR );
printf("UT: sbid: %i sbid2: %i\n", (unsigned int)assignPtr.sbid, (unsigned int)assignPtr2.sbid);
CPPUNIT_ASSERT( assignPtr.sbid != assignPtr2.sbid); // assigned from sb list so cannot have same sbid
CPPUNIT_ASSERT( assignPtr.type = EMPTY_PTR );
CPPUNIT_ASSERT( assignPtr2.type = EMPTY_PTR );
// release in 'wrong' order ..
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr ) == NO_ERROR );
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr2 ) == NO_ERROR );
// .. then check that the list issues them in the return order
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr3 ) == NO_ERROR );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr4 ) == NO_ERROR );
// CPPUNIT_ASSERT( assignPtr2.sbid == assignPtr3.sbid);
// CPPUNIT_ASSERT( assignPtr.sbid == assignPtr4.sbid);
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr3 ) == NO_ERROR );
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr4 ) == NO_ERROR );
//assign lots of sub-blocks
printf("UT: Assign lots of sub-blocks\n");
int idx;
IdxEmptyListEntry entries[40];
for (idx=0; idx<39; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &entries[idx] ) == NO_ERROR );
}
printf("UT: Releasing\n");
for (idx --; idx>-1; idx--){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_32, &entries[idx] ) == NO_ERROR );
}
for (idx=0; idx<39; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &entries[idx] ) == NO_ERROR );
}
//assign lots of smaller segments
printf("UT: Assign lots of smaller segments\n");
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_4, &assignPtr ) == NO_ERROR );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_4, &assignPtr ) == NO_ERROR );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_4, &assignPtr ) == NO_ERROR );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_4, &assignPtr ) == NO_ERROR );
printf("UT: Assign lots of segments after init\n");
CPPUNIT_ASSERT( m_freeMgr.init( cb, LIST ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( indexFile, blockZero.data, lbid );
// use up 32 entries
// assign more than 32 entries, keeping track of them all, then release them causing the chain to extend over two blocks
printf("UT: Assign more than 32 segments\n");
for (idx=0; idx<39; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_4, &entries[idx] ) == NO_ERROR );
}
printf("UT: Releasing\n");
for (idx --; idx>-1; idx--){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_4, &entries[idx] ) == NO_ERROR );
}
for (idx=0; idx<39; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_4, &entries[idx] ) == NO_ERROR );
}
// printf("UT: sbid: %i entry: %i \n", (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr ) == NO_ERROR );
printf("UT: sbid: %i entry: %i \n", (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry );
// now use up almost all free space
for (idx=0; idx<215; idx++){
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr ) == NO_ERROR );
printf("UT: Visit: %i fbo: %llu sbid: %i entry: %i\n", idx, assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry);
}
// assign one more than is available, expect error
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr ) != ERR_FM_NO_SPACE );
//check empty map
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &emptyMap);
// check the entries are as expected
printf("UT: Empty - fbo: %llu sbid: %i entry: %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_32 );
// CPPUNIT_ASSERT( emptyMap.fbo == 7 );
// CPPUNIT_ASSERT( emptyMap.entry == 0 ); // points to last entry in sub-block
// release last assigned segment
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_16, &assignPtr ) == ERR_FM_RELEASE_ERR );
assignPtr.group = ENTRY_16;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_16, &assignPtr ) == ERR_INVALID_PARAM );
assignPtr.group = ENTRY_32;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &emptyMap);
// check the entries are as expected
printf("UT: Empty - fbo: %llu sbid: %i entry: %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_32 );
// CPPUNIT_ASSERT( emptyMap.fbo == 7 );
// CPPUNIT_ASSERT( emptyMap.entry == 1 ); // points to last entry in sub-block
// assign segment, expect no error
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr ) == NO_ERROR );
// assign segment after using up the list
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr2 ) != ERR_FM_NO_SPACE);
//release the segment, expect to become first bucket
printf("UT: Putting sub-block back\n");
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_32, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &emptyMap);
printf("UT: After putting one sb back fbo: %llu sbid: %i entry: %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_32 );
// CPPUNIT_ASSERT( emptyMap.fbo == 7 );
// CPPUNIT_ASSERT( emptyMap.sbid == 0 );
// CPPUNIT_ASSERT( emptyMap.entry == 1 ); // points to second to last entry in sub-block
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_16, &assignPtr ) == ERR_INVALID_PARAM );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_8, &assignPtr ) == ERR_INVALID_PARAM );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_2, &assignPtr ) == ERR_INVALID_PARAM );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_1, &assignPtr ) == ERR_INVALID_PARAM );
m_freeMgr.writeDBFile( cb, blockZero.data, lbid );
m_freeMgr.closeFile( indexFile );
printf("UT: End testFreeMgrAssignList\n");
}
void testFreeMgrAssignListCk() {
/**
* Assign tests
*/
FILE* indexFile;
CommBlock cb;
int rc, allocSize;
DataBlock blockZero;
int idx;
IdxEmptyListEntry entries[100];
uint64_t lbid;
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("UT: Begin testFreeMgrAssignListCk\n");
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 8, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, LIST ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
printf("UT: Assign lots of segments\n");
CPPUNIT_ASSERT( m_freeMgr.init( cb, LIST ) == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
// use up 32 entries
// assign more than 32 entries, keeping track of them all, then release them causing the chain to extend over two blocks
printf("UT: Assign more than 32 segments\n");
for (idx=0; idx<39; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_4, &entries[idx] ) == NO_ERROR );
printf("UT: Visit: %i fbo: %llu sbid: %i entry: %i\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
}
printf("UT: Releasing segments\n");
for (idx --; idx>-1; idx--){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, ENTRY_4, &entries[idx] ) == NO_ERROR );
}
printf("UT: Assign again\n");
for (idx=0; idx<39; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, ENTRY_4, &entries[idx] ) == NO_ERROR );
printf("UT: Visit: %i fbo: %llu sbid: %i entry: %i\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
}
printf("UT: End testFreeMgrAssignListCk\n");
}
void testFreeMgrAssignListLots() {
/**
* Assign tests
*/
FILE* indexFile;
DbFileOp dbFileOp;
DataBlock blockZero;
DataBlock tempBlock;
int idx, rc, allocSize;
IdxEmptyListEntry entries[4000];
IdxEmptyListEntry map;
CommBlock cb;
uint64_t lbid;
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("UT: Begin testFreeMgrAssignListLots\n");
int freemgr_type = LIST;
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 8, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, freemgr_type ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
printf("UT: Assign lots of segments\n");
// use up 32 entries
// assign more than 32 entries, keeping track of them all, then release them causing the chain to extend over two blocks
printf("UT: Assign more than 32 segments\n");
int iters = 172;
IdxTreeGroupType entryType = ENTRY_32;
for (idx=0; idx<iters; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, freemgr_type, entryType, &entries[idx] ) == NO_ERROR );
printf("UT: Visit: %i fbo %llu sbid %02i entry %02i (assigning)\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
rc = m_freeMgr.readDBFile( cb, tempBlock.data, entries[idx].fbo );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &map);
printf("UT: Map is now: %i fbo %llu sbid %02i entry %02i (assigning)\n", idx, map.fbo, (unsigned int)map.sbid, (unsigned int)map.entry);
}
printf("UT: Releasing segments\n");
for (idx=0; idx<iters; idx++){
// for (idx=iters-1; idx>-1; idx--){
printf("UT: Visit: %i fbo %llu sbid %02i entry %02i (releasing)\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, freemgr_type, entryType, &entries[idx] ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &map);
printf("UT: Map is now: %i fbo %llu sbid %02i entry %02i (releasing)\n", idx, map.fbo, (unsigned int)map.sbid, (unsigned int)map.entry);
}
printf("UT: Assign again\n");
for (idx=0; idx<iters; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, freemgr_type, entryType, &entries[idx] ) == NO_ERROR );
printf("UT: Visit: %i fbo %llu sbid %02i entry %02i (assigning again)\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &map);
printf("UT: Map is now: %i fbo %llu sbid %02i entry %02i (assigning again)\n", idx, map.fbo, (unsigned int)map.sbid, (unsigned int)map.entry);
}
// printf("UT: Releasing segments again\n");
//
// for (idx=0; idx<iters; idx++){
// // for (idx=iters-1; idx>-1; idx--){
// printf("UT: Visit: %i fbo %llu sbid %02i entry %02i (releasing again)\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
// CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, freemgr_type, entryType, &entries[idx] ) == NO_ERROR );
// getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &map);
// printf("UT: Map is now: %i fbo %llu sbid %02i entry %02i (releasing again )\n", idx, map.fbo, (unsigned int)map.sbid, (unsigned int)map.entry);
//
// }
printf("UT: End testFreeMgrAssignListLots\n");
}
void testFreeMgrAssignListBlocks() {
/**
* Assign tests
*/
FILE* indexFile;
DataBlock blockZero;
int rc, allocSize;
CommBlock cb;
int idx;
IdxEmptyListEntry entries[8000];
uint64_t lbid;
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("UT: Begin testFreeMgrAssignListBlocks\n");
m_freeMgr.deleteFile( 776 );
rc = m_freeMgr.createFile( 776, 80, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 776 );
cb.file.oid = 776;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, LIST ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
printf("UT: Assign blocks from list\n");
// use up 32 entries
// assign more than 32 entries, keeping track of them all, then release them causing the chain to extend over two blocks
int iters = 77;
IdxTreeGroupType entryType = ENTRY_BLK;
for (idx=0; idx<iters; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, entryType, &entries[idx] ) == NO_ERROR );
printf("UT: Visit: %i fbo %llu sbid %02i entry %02i (assigning)\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
}
printf("UT: Releasing segments\n");
for (idx=0; idx<iters; idx++){
// for (idx=iters-1; idx>-1; idx--){
printf("UT: Visit: %i fbo %llu sbid %02i entry %02i (releasing)\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, entryType, &entries[idx] ) == NO_ERROR );
entries[idx].fbo = 0;
}
printf("UT: Assign again\n");
for (idx=0; idx<iters; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, LIST, entryType, &entries[idx] ) == NO_ERROR );
printf("UT: Visit: %i fbo: %llu sbid: %02i entry: %02i (assigning again)\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
}
for (idx=0; idx<iters; idx++){
// for (idx=iters-1; idx>-1; idx--){
printf("UT: Visit: %i fbo %llu sbid %02i entry %02i (releasing again)\n", idx, entries[idx].fbo, (unsigned int)entries[idx].sbid, (unsigned int)entries[idx].entry);
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, LIST, entryType, &entries[idx] ) == NO_ERROR );
entries[idx].fbo = 0;
}
printf("UT: End testFreeMgrAssignListBlocks\n");
}
void testFreeMgrAssignListCk2() {
/**
* Assign tests
*/
FILE* indexFile;
DataBlock blockZero;
int rc, allocSize;
CommBlock cb;
uint64_t lbid;
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("UT: Begin testFreeMgrAssignListCk2\n");
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 8, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
int idx;
IdxEmptyListEntry e1[3400];
IdxEmptyListEntry e32[3400];
printf("UT: Assign lots of segments\n");
CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
// use up 32 entries
// assign more than 32 entries, keeping track of them all, then release them causing the chain to extend over two blocks
printf("UT: Assign more than 32 segments\n");
for (idx=0; idx<340; idx++){
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_1, &e1[idx] ) == NO_ERROR );
printf("UT: Visit: %i fbo %llu sbid %i entry %i\n", idx, e1[idx].fbo, (unsigned int)e1[idx].sbid, (unsigned int)e1[idx].entry);
if(idx%10==0){
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &e32[idx] ) == NO_ERROR );
}
e1[idx].type= 7;
}
printf("UT: Releasing segments\n");
for (idx = 0; idx<340; idx++){
// printf("UT: Visit: %i\n", idx);
rc = m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_1, &e1[idx] );
CPPUNIT_ASSERT( rc == NO_ERROR );
if(idx%10==0){
rc = m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &e1[idx] );
}
}
printf("UT: Assign again\n");
for (idx=0; idx<340; idx++){
rc = m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_1, &e1[idx] );
CPPUNIT_ASSERT( rc == NO_ERROR );
printf("UT: Visit: %i fbo %llu sbid %i entry %i\n", idx, e1[idx].fbo, (unsigned int)e1[idx].sbid, (unsigned int)e1[idx].entry);
}
printf("UT: Releasing segments\n");
for (idx = 0; idx<340; idx++){
// printf("UT: Visit: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_1, &e1[idx] ) == NO_ERROR );
}
//
printf("UT: End testFreeMgrAssignListCk2\n");
}
void testFreeMgrAssignExtend() {
/**
* Test the Extend method
**/
FILE* indexFile;
int allocSize;
int rc;
DataBlock blockZero;
CommBlock cb;
uint64_t lbid;
DbFileOp db;
printf("UT: Begin testFreeMgrAssignExtend\n");
m_indexlist.deleteFile( 777 );
m_freeMgr.setDebugLevel( DEBUG_1 );
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 800, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, LIST ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
CPPUNIT_ASSERT( m_freeMgr.extendFreespace( cb, &blockZero, LIST ) == NO_ERROR );
int currSize = db.getFileSize( indexFile )/BYTE_PER_BLOCK ;
lbid = m_freeMgr.mapLBID( cb, currSize-1, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
}
void testFreeMgrExtendLots() {
/**
* Test the Extend method
**/
FILE* indexFile;
int allocSize;
int idx, rc;
DataBlock blockZero;
CommBlock cb;
uint64_t lbid;
DbFileOp db;
printf("UT: Begin testFreeMgrExtendLots\n");
m_indexlist.deleteFile( 777 );
m_freeMgr.setDebugLevel( DEBUG_1 );
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 800, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
// CPPUNIT_ASSERT( m_freeMgr.init( cb, LIST ) == NO_ERROR );
// lbid = m_freeMgr.mapLBID( cb, 0, rc);
// CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
for (idx=0; idx<5; idx++){
printf("Loop count: %i\n", idx);
CPPUNIT_ASSERT( m_freeMgr.extendFreespace( cb, &blockZero, LIST ) == NO_ERROR );
}
//int currSize = db.getFileSize( indexFile )/BYTE_PER_BLOCK ;
//lbid = m_freeMgr.mapLBID( cb, currSize-1, rc);
// CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
printf("UT: End testFreeMgrExtendLots\n");
}
void testFreeMgrRelease() {
FILE* indexFile;
DataBlock blockZero;
IdxEmptyListEntry assignPtr, emptyMap;
CommBlock cb;
int rc, allocSize;
uint64_t lbid;
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("UT: Begin testFreeMgrRelease\n");
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 80, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, 0, TREE, ENTRY_32, &assignPtr ) == ERR_INVALID_PARAM );
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, 0 ) == ERR_INVALID_PARAM );
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &emptyMap);
// check the entries are as expected
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_32 );
// CPPUNIT_ASSERT( emptyMap.fbo == 1 );
// CPPUNIT_ASSERT( emptyMap.entry == 31 ); // points to last entry in sub-block
//CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
m_freeMgr.writeDBFile( cb, blockZero.data, 0 );
m_freeMgr.closeFile( indexFile );
printf("UT: End testFreeMgrRelease\n");
}
void testFreeMgrFragment() {
FILE* indexFile;
CommBlock cb;
int rc, idx, allocSize;
DataBlock blockZero;
IdxEmptyListEntry assignPtr, emptyMap;
// test if possible to split a list of segments and populate smaller lists
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("UT: Begin testFreeMgrFragment\n");
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 80, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
m_freeMgr.readSubBlockEntry( cb, &blockZero, 0, 0, 1+ENTRY_1, 8, &emptyMap);
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
printf("UT: fbo %llu sbid %i entry %i\n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_16;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_16, 8, &emptyMap);
printf("UT: fbo %llu sbid %i entry %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_8;
assignPtr.entry = 16;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_8, 8, &emptyMap);
printf("UT: fbo %llu sbid %i entry %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_4;
assignPtr.entry = 24;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_4, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_4, 8, &emptyMap);
printf("UT: fbo %llu sbid %i entry %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_2;
assignPtr.entry = 28;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_2, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_2, 8, &emptyMap);
printf("UT: fbo %llu sbid %i entry %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_1;
assignPtr.entry = 30;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_1, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_1, 8, &emptyMap);
printf("UT: fbo %llu sbid %i entry %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_1;
assignPtr.entry = 31;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_1, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_1, 8, &emptyMap);
// check the entries are as expected
printf("UT: fbo %llu sbid %i entry %i\n", emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
CPPUNIT_ASSERT( emptyMap.type == EMPTY_LIST );
CPPUNIT_ASSERT( emptyMap.group == ENTRY_1 );
// CPPUNIT_ASSERT( emptyMap.fbo == 1 );
CPPUNIT_ASSERT( emptyMap.entry == 2 ); // points to second entry in sub-block
/**
* Now do it many times
**/
for (idx = 0; idx < 185; idx++)
{
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
// printf("\nVisit: %i\n", idx);
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &emptyMap);
// printf("UT: Chain: %i fbo: %llu sbid: %i entry: %i\n", (unsigned int)assignPtr.group, emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_16;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_16, 8, &emptyMap);
// printf("UT: Chain: %i fbo %llu sbid %i entry %i\n", (unsigned int)assignPtr.group, emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_8;
assignPtr.entry = 16;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_8, 8, &emptyMap);
// printf("UT: Chain: %i ffbo %llu sbid %i entry %i\n", (unsigned int)assignPtr.group, emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_4;
assignPtr.entry = 24;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_4, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_4, 8, &emptyMap);
// printf("UT: Chain: %i fbo %llu sbid %i entry %i\n", (unsigned int)assignPtr.group, emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_2;
assignPtr.entry = 28;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_2, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_2, 8, &emptyMap);
// printf("UT: Chain: %i fbo %llu sbid %i entry %i\n", (unsigned int)assignPtr.group, emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_1;
assignPtr.entry = 30;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_1, &assignPtr ) == NO_ERROR );
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_1, 8, &emptyMap);
// printf("UT: Chain: %i fbo: %llu sbid: %i entry: %i\n", (unsigned int)assignPtr.group, emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
assignPtr.type = EMPTY_PTR;
assignPtr.group = ENTRY_1;
assignPtr.entry = 31;
CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_1, &assignPtr ) == NO_ERROR );
}
//CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
m_freeMgr.writeDBFile( indexFile, blockZero.data, 0 );
m_freeMgr.closeFile( indexFile );
printf("UT: End testFreeMgrFragment\n");
}
void testFreeMgrChain() {
FILE* indexFile;
DataBlock blockZero;
IdxEmptyListEntry assignPtr, emptyMap;
int rc, allocSize;
CommBlock cb;
uint64_t lbid;
// test if possible to split a list of segments and populate smaller lists
m_freeMgr.setDebugLevel( DEBUG_0 );
printf("UT: Begin testFreeMgrChain\n");
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 80, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
/**
* Now do it many times
**/
int idx;
for (idx = 0; idx < 208; idx++)
{
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
// printf("\nVisit: %i\n", idx);
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &emptyMap);
// printf("UT: ENTRY_32: %i fbo: %llu sbid: %i entry: %i\n", (unsigned int)assignPtr.group, emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_16, 8, &emptyMap);
// printf("UT: ENTRY_16: %i fbo: %llu sbid: %i entry: %i\n", (unsigned int)assignPtr.group, emptyMap.fbo, (unsigned int)emptyMap.sbid, (unsigned int)emptyMap.entry);
}
m_freeMgr.deleteFile( 777 );
rc = m_freeMgr.createFile( 777, 10, allocSize );
CPPUNIT_ASSERT( rc == NO_ERROR );
cb.file.pFile = m_freeMgr.openFile( 777 );
cb.file.oid = 777;
indexFile = cb.file.pFile;
CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
lbid = m_freeMgr.mapLBID( cb, 0, rc);
CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
m_freeMgr.readDBFile( cb, blockZero.data, lbid );
printf("UT: Assigning from ENTRY_16 chain\n");
for (idx = 0; idx < 420; idx++)
{
CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
// printf("Visit: %i\n", idx);
m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_16, 8, &emptyMap);
printf("UT: ENTRY_16: fbo: %llu sbid: %i entry: %i\n", assignPtr.fbo, (unsigned int)assignPtr.sbid, (unsigned int)assignPtr.entry);
}
m_freeMgr.writeDBFile( cb, blockZero.data, 0 );
m_freeMgr.closeFile( indexFile );
printf("UT: End testFreeMgrChain\n");
}
// void testFreeMgrEvil() {
//
// FILE* indexFile;
// int rc, allocSize;
// DataBlock blockZero, workBlock;
// IdxEmptyListEntry assignPtr, emptyPtr, emptyEntry;
// CommBlock cb;
// uint64_t lbid;
//
// /**
// * Forget Google.. be evil
// **/
//
// test if possible to split a list of segments and populate smaller lists
// m_freeMgr.setDebugLevel( DEBUG_0 );
// printf("UT: Begin testFreeMgrEvil\n");
//
//
// m_freeMgr.deleteFile( 777 );
// rc = m_freeMgr.createFile( 777, 80, allocSize );
// CPPUNIT_ASSERT( rc == NO_ERROR );
// cb.file.pFile = m_freeMgr.openFile( 777 );
// cb.file.oid = 777;
// indexFile = cb.file.pFile;
//
// CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
// lbid = m_freeMgr.mapLBID( cb, 0, rc);
// CPPUNIT_ASSERT_MESSAGE( "Error using mapLBID", rc == NO_ERROR );
//
// m_freeMgr.readDBFile( cb, blockZero.data, lbid );
//
// m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_32, 8, &emptyPtr);
//
// check the entries are as expected
// CPPUNIT_ASSERT( emptyPtr.type == EMPTY_LIST );
// CPPUNIT_ASSERT( emptyPtr.group == ENTRY_32 );
// CPPUNIT_ASSERT( emptyPtr.fbo == 1 );
// CPPUNIT_ASSERT( emptyPtr.entry == 31 ); // points to last entry in sub-block
//
// printf("UT: Mess up fbo in emptyMap for ENTRY_32\n");
// emptyPtr.fbo =999999999;
// m_freeMgr.writeSubBlockEntry( cb, &blockZero, 0, 0, 1+ENTRY_32, 8, &emptyPtr);
//
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == ERR_FM_BAD_FBO );
// emptyPtr.fbo =7;
// m_freeMgr.writeSubBlockEntry( cb, &blockZero, 0, 0, 1+ENTRY_32, 8, &emptyPtr);
//
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
//
// CPPUNIT_ASSERT( assignPtr.fbo == 7 );
// assignPtr.fbo =1234;
// first release with bad fbo then with good
// CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == ERR_FM_BAD_FBO );
//
// assignPtr.fbo =7;
// CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_32, &assignPtr ) == NO_ERROR );
//
//
// printf("UT: Mess up fbo in emptyMap for ENTRY_16\n");
// m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_16, 8, &emptyPtr);
// CPPUNIT_ASSERT( emptyPtr.fbo == 0 ); // zero because nothing in list yet
//
// emptyPtr.fbo =999999999;
// m_freeMgr.writeSubBlockEntry( cb, &blockZero, 0, 0, 1+ENTRY_16, 8, &emptyPtr);
//
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == ERR_FM_BAD_FBO );
// emptyPtr.fbo =0;
// m_freeMgr.writeSubBlockEntry( cb, &blockZero, 0, 0, 1+ENTRY_16, 8, &emptyPtr);
//
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
//
// CPPUNIT_ASSERT( assignPtr.fbo == 7 );
// assignPtr.fbo =1234;
// first release with bad fbo then with good
// CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == ERR_FM_BAD_FBO );
//
// assignPtr.fbo =7;
// CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
//
// Mess with type field
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
//
// m_freeMgr.getSubBlockEntry( blockZero.data, 0, 1+ENTRY_16, 8, &emptyPtr );
// m_freeMgr.readDBFile( cb, &workBlock, emptyPtr.fbo );
// m_freeMgr.getSubBlockEntry( &workBlock, emptyPtr.sbid, emptyPtr.entry, 8, &emptyEntry );
//
// CPPUNIT_ASSERT( emptyEntry.type == 2 ); //check is EMPTY_PTR
// CPPUNIT_ASSERT( emptyEntry.fbo == 7 ); //check is last sb
// emptyEntry.type = 7; // set to garbage
// m_freeMgr.writeSubBlockEntry( cb, &workBlock, emptyPtr.fbo, emptyPtr.sbid, emptyPtr.entry, 8, &emptyEntry);
// check assign fails
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == ERR_FM_BAD_TYPE );
//
// emptyEntry.type = 2;
// emptyEntry.fbo = 0;
// m_freeMgr.writeSubBlockEntry( cb, &workBlock, emptyPtr.fbo, emptyPtr.sbid, emptyPtr.entry, 8, &emptyEntry);
// check assign fails
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == ERR_FM_BAD_TYPE );
//
//
// fix type field and re-try assign
// emptyEntry.type = 2;
// emptyEntry.fbo = 7;
// m_freeMgr.writeSubBlockEntry( cb, &workBlock, emptyPtr.fbo, emptyPtr.sbid, emptyPtr.entry, 8, &emptyEntry);
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
// CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_16, &assignPtr ) == NO_ERROR );
//
//
// printf("UT: Zero fbo in emptyMap for ENTRY_8\n");
// //start 8 list
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR );
// CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR );
//
// m_freeMgr.getSubBlockEntry( &blockZero, 0, 1+ENTRY_8, 8, &emptyPtr);
// CPPUNIT_ASSERT( emptyPtr.fbo == 7 );
// CPPUNIT_ASSERT( emptyPtr.type == 2 );
//
// emptyPtr.fbo = 0;
// m_freeMgr.writeSubBlockEntry( indexFile, &blockZero, 0, 0, 1+ENTRY_8, 8, &emptyPtr);
//
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR + 1 );
// //cleanup
// emptyPtr.fbo = 7;
// m_freeMgr.writeSubBlockEntry( indexFile, &blockZero, 0, 0, 1+ENTRY_8, 8, &emptyPtr);
//
// check that assign and release works ok
// CPPUNIT_ASSERT( m_freeMgr.assignSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR );
// CPPUNIT_ASSERT( m_freeMgr.releaseSegment( cb, &blockZero, TREE, ENTRY_8, &assignPtr ) == NO_ERROR );
//
// m_freeMgr.writeDBFile( indexFile, blockZero.data, 0 );
// CPPUNIT_ASSERT( m_freeMgr.init( cb, TREE ) == NO_ERROR );
// m_freeMgr.closeFile( indexFile );
//
// printf("UT: End testFreeMgrEvil\n");
//
// }
void testIndexListMultiKey() {
DataBlock curBlock;
FILE* pFile =NULL;
int rc, allocSize;
uint64_t key=0x123;
int rowId;
int file_number=20000;
int fbo , sbid , entry ;
IdxEmptyListEntry newIdxListHdrPtr;
IdxRidListHdr newIdxRidListHdr;
printf("\nRunning multiple keys for adding header \n");
BRMWrapper::setUseBrm(true);
//Then increment the rowId as it goes
rowId = 0x567 ;
/*******************************************************
* TEST with FreeMgr for coverage
* Start here for add header and delete header entries
*
*******************************************************/
m_indexlist.deleteFile(file_number);
m_indexlist.createFile(file_number,10, allocSize);
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
CommBlock cb;
File file;
file.oid = file_number;
file.pFile = pFile;
cb.file = file;
m_indexlist.init(cb,LIST);
int loop;
for (loop = 0; loop < 10 ; loop++)
{
rc = m_indexlist.addIndexListHdr(cb, rowId, key, &newIdxListHdrPtr);
if (rc!= NO_ERROR)
printf("196. error code:%i \n", rc);
//printf("The fbo is:%i sbid is %i entry is %i \n",(int)newIdxListHdrPtr.fbo, (int)newIdxListHdrPtr.sbid, (int)newIdxListHdrPtr.entry);
CPPUNIT_ASSERT( rc == NO_ERROR );
fbo = newIdxListHdrPtr.fbo; //fbo=? from the free manager
sbid = newIdxListHdrPtr.sbid;//sbid =? from the free manager
entry = newIdxListHdrPtr.entry;//entry=? from the free manager
memset( curBlock.data, 0, sizeof(curBlock.data));
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, LIST_HDR_SIZE,
&newIdxRidListHdr );
//cout<< "rowId->" << rowId << " key->" << key << " size->" <<
//newIdxRidListHdr.idxRidListSize.size << endl;
rowId++;
key++;
}
//cout << " \n Successfully ran testIndexListMultiKey \n" << endl;
return;
}//testIndexListMultiKey
void testIndexListUpdate() {
DataBlock curBlock;
FILE* pFile =NULL;
int rc, fbo , sbid , entry ;
uint64_t key=123;
int count =40000;
int rowId;
int i;
int file_number=8001;
IdxEmptyListEntry newIdxListHdrPtr;
IdxRidListHdr newIdxRidListHdr;
//bool found = false;
//int p_sbid, p_entry,
//uint64_t p_fbo;
int allocSize;
BRMWrapper::setUseBrm(true);
printf("\nRunning testIndexListUpdate\n");
memset( curBlock.data, 0, sizeof(curBlock.data));
m_indexlist.deleteFile(file_number);
m_indexlist.createFile(file_number,10, allocSize);
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
//Free Manager
CommBlock cb;
File file;
file.oid = file_number;
file.pFile = pFile;
cb.file = file;
m_indexlist.init(cb,LIST);
//Initialize first rowId to 0
rowId = 0 ;
rc = m_indexlist.addIndexListHdr(cb, rowId, key, &newIdxListHdrPtr);
if (rc!= NO_ERROR)
//printf("245. error code:%i \n", rc);
CPPUNIT_ASSERT( rc == NO_ERROR );
fbo = newIdxListHdrPtr.fbo; //fbo=? from the free manager
sbid = newIdxListHdrPtr.sbid;//sbid =? from the free manager
entry = newIdxListHdrPtr.entry;//entry=? from the free manager
memset( curBlock.data, 0, sizeof(curBlock.data));
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, LIST_HDR_SIZE,
&newIdxRidListHdr );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == 1 );
rowId++;
//cout << " Single Insert->start Timer :inserting " << count << " rowId " << endl;
m_indexlist.startfTimer();
for (i=0; i<count; i++)
{
////cout << " count number-> " << i << endl;
rc =m_indexlist.updateIndexList(cb, rowId, key,&newIdxListHdrPtr);
if (rc != NO_ERROR)
{
//cout << "error code->" << rc << " i->" << i << endl;
return;
}
rowId++;
}
m_indexlist.stopfTimer();
//cout << " Single Insert ->End Timer :inserting " << count << " rowId " << endl;
//cout << " Total used time (msec) " << m_indexlist.getTotalfRunTime() << endl;
m_indexlist.closeFile(pFile);
//
memset( curBlock.data, 0, sizeof(curBlock.data));
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, LIST_HDR_SIZE,
&newIdxRidListHdr );
//cout<< " key->" << key << " size->" <<
//newIdxRidListHdr.idxRidListSize.size << endl;
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == (uint64_t)(count+1));
RID ridArray[count+1];
int size;
m_indexlist.getRIDArrayFromListHdr(pFile, key,
&newIdxListHdrPtr,
ridArray, size);
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == (uint64_t)size);
//cout << "size=" << size << endl;
//cout << " newIdxRidListHdr.idxRidListSize.size=" << newIdxRidListHdr.idxRidListSize.size << endl;
//for (int i=0; i< size ; i++)
////cout<< " ridArray[i]->" << ridArray[i] << " i->" << i << endl;
uint64_t firstLbid;
rc = m_indexlist.findFirstBlk(pFile, key, &newIdxListHdrPtr, firstLbid);
//cout << " Single RID insert->FirstLbid is ->" << firstLbid << endl;
//cout << " This will print level and counts for Children " << endl;
//if (m_indexlist.getUseNarray())
// m_indexlist.printBlocks(firstLbid);
CPPUNIT_ASSERT(rc==NO_ERROR);
m_indexlist.closeFile(pFile);
printf("\nSuccessfully Running testIndexListUpdate\n");
}//testIndexListUpdate
void testIndexListDelete() {
DataBlock curBlock;
FILE* pFile =NULL;
int rc, fbo , sbid , entry , width = 32, allocSize;
uint64_t key=123;
int count =2890;
int rowId;
int i;
int k=count+1;
int delete_count;
int file_number=8002;
IdxEmptyListEntry newIdxListHdrPtr;
IdxRidListHdr newIdxRidListHdr;
bool found = false;
int p_sbid, p_entry;
uint64_t p_fbo;
//Initialize first rowId to 0
//Then increment the rowId as it goes
printf("\nRunning testIndexListDelete\n");
rowId = 0 ;
delete_count =0;
BRMWrapper::setUseBrm(true);
/*******************************************************
* TEST with FreeMgr for coverage
* Start here for add header and delete header entries
*
*******************************************************/
memset( curBlock.data, 0, sizeof(curBlock.data));
m_indexlist.deleteFile( file_number);
m_indexlist.createFile(file_number,10, allocSize);
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
CommBlock cb;
File file;
file.oid = file_number;
file.pFile = pFile;
cb.file = file;
m_indexlist.init(cb,LIST);
rc = m_indexlist.addIndexListHdr(cb, rowId, key, &newIdxListHdrPtr);
if (rc!= NO_ERROR)
//printf("388. error code:%i \n", rc);
CPPUNIT_ASSERT( rc == NO_ERROR );
rowId++;
rc=m_indexlist.deleteIndexList( pFile, 0, key, &newIdxListHdrPtr);
CPPUNIT_ASSERT( rc == NO_ERROR );
delete_count++;
//delete the same item again, should not be there, return an error
rc=m_indexlist.deleteIndexList( pFile, 0, key, &newIdxListHdrPtr);
CPPUNIT_ASSERT( rc != NO_ERROR );
// delete an rowId which does not exist in the index list
// return a error
rc=m_indexlist.deleteIndexList( pFile, 1, key, &newIdxListHdrPtr);
CPPUNIT_ASSERT( rc != NO_ERROR );
//
rc =m_indexlist.updateIndexList(pFile, 5, key, &newIdxListHdrPtr);
CPPUNIT_ASSERT( rc == NO_ERROR );
rc =m_indexlist.updateIndexList(pFile, 6, key, &newIdxListHdrPtr);
CPPUNIT_ASSERT( rc == NO_ERROR );
rc=m_indexlist.deleteIndexList( pFile, 5, key, &newIdxListHdrPtr);
CPPUNIT_ASSERT( rc == NO_ERROR );
rc=m_indexlist.deleteIndexList( pFile, 6, key, &newIdxListHdrPtr);
CPPUNIT_ASSERT( rc == NO_ERROR );
fbo = newIdxListHdrPtr.fbo; //fbo=? from free manager
sbid = newIdxListHdrPtr.sbid;//sbid =?
entry = newIdxListHdrPtr.entry;//entry=?
//printf("Index List Header: fbo: %i sbid: %i entry: %i\n", (int)fbo, (int)sbid, (int)entry);
m_indexlist.closeFile(pFile);
// Reading the Header out
memset( curBlock.data, 0, sizeof(curBlock.data));
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, 32, &newIdxRidListHdr );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == 0 );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.type == 0 );
CPPUNIT_ASSERT( newIdxRidListHdr.key == key );
CPPUNIT_ASSERT( newIdxRidListHdr.firstIdxRidListEntry.type == 7 );
CPPUNIT_ASSERT( newIdxRidListHdr.firstIdxRidListEntry.rid == (RID)0 );
CPPUNIT_ASSERT( newIdxRidListHdr.nextIdxRidListPtr.type == 7 );
CPPUNIT_ASSERT( newIdxRidListHdr.nextIdxRidListPtr.llp == 0x0 );
m_indexlist.closeFile(pFile);
//Add Header again and also Update the index list
rowId =0;
delete_count =0;
//
memset( curBlock.data, 0, sizeof(curBlock.data));
m_indexlist.deleteFile( file_number);
m_indexlist.createFile(file_number,10, allocSize);
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
file.oid = file_number;
file.pFile = pFile;
cb.file = file;
m_indexlist.init(cb,LIST);
rc = m_indexlist.addIndexListHdr(pFile, rowId, key, &newIdxListHdrPtr);
found = m_indexlist.findRowId(pFile, rowId,key,&newIdxListHdrPtr, p_fbo, p_sbid, p_entry);
//printf("Find RowId: %i in : fbo: %i sbid: %i entry: %i\n", (int) rowId, (int)p_fbo, (int)p_sbid, (int)p_entry);
//cout << " RowId->" << rowId <<" Fbo->" << p_fbo << " Sbid->" << p_sbid << " Entry->" << p_entry << endl;
rowId++;
CPPUNIT_ASSERT( rc == NO_ERROR );
fbo = newIdxListHdrPtr.fbo; //fbo=? from the free manager
sbid = newIdxListHdrPtr.sbid;//sbid =? from the free manager
entry = newIdxListHdrPtr.entry;//entry=? from the free manager
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, width, &newIdxRidListHdr );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == 1 );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.type == 0 );
CPPUNIT_ASSERT( newIdxRidListHdr.key == key );
CPPUNIT_ASSERT( newIdxRidListHdr.firstIdxRidListEntry.rid == (RID)rowId-1 );
CPPUNIT_ASSERT( newIdxRidListHdr.firstIdxRidListEntry.type == 3 );
CPPUNIT_ASSERT( newIdxRidListHdr.nextIdxRidListPtr.llp == 0x0 );
CPPUNIT_ASSERT( newIdxRidListHdr.nextIdxRidListPtr.type == 7 );
for (i=0; i<count; i++)
{
//printf("Index List Count: i: %i Row Id: %i \n", i, rowId);
rc =m_indexlist.updateIndexList(pFile, rowId, key,&newIdxListHdrPtr);
rowId++;
// if (rc != NO_ERROR)
// printf("ERROR ->2940 i %i \n rowID %i \n", i, rowId);
//CPPUNIT_ASSERT( rc == NO_ERROR );
}
for (i=0; i<count; i++)
{
found = m_indexlist.findRowId(pFile, i,key,&newIdxListHdrPtr, p_fbo, p_sbid, p_entry);
//printf("Find RowId: %i in : fbo: %i sbid: %i entry: %i\n", (int) rowId, (int)p_fbo, (int)p_sbid, (int)p_entry);
//if (found)
//cout << " Found RowId->" << i <<" Fbo->" << p_fbo << " Sbid->" << p_sbid << " Entry->" << p_entry << endl;
//else
//cout << " Not Found RowId->" << i << endl;
//Check Header again, we need to read the block again
//since it is changed
}
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, width, &newIdxRidListHdr );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == (uint64_t)k );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.type == 0 );
CPPUNIT_ASSERT( newIdxRidListHdr.key == key );
CPPUNIT_ASSERT( newIdxRidListHdr.firstIdxRidListEntry.rid == (RID)0 );
CPPUNIT_ASSERT( newIdxRidListHdr.firstIdxRidListEntry.type == 3 );
CPPUNIT_ASSERT( newIdxRidListHdr.nextIdxRidListPtr.type == 4 );
//printf("Index List Header: fbo: %i sbid: %i entry: %i\n", (int)fbo, (int)sbid, (int)entry);
m_indexlist.closeFile(pFile);
//Delete test
//Read now
//Check Header
delete_count =0;
fbo = newIdxListHdrPtr.fbo; //fbo=?
sbid = newIdxListHdrPtr.sbid;//sbid =?
entry = newIdxListHdrPtr.entry;//entry=?
memset( &newIdxRidListHdr, 0, 32 );
memset( curBlock.data, 0, sizeof( curBlock.data ) );
//Delete action
pFile = m_indexlist.openFile( file_number);
CPPUNIT_ASSERT( pFile != NULL );
rc = m_indexlist.deleteIndexList( pFile, 0, key, &newIdxListHdrPtr);//rowId 0 deleted
if (rc == NO_ERROR)
delete_count++;
else
{
//cout << "cannot find rowId->" << 0 << endl;
}
rc = m_indexlist.deleteIndexList( pFile, 100, key, &newIdxListHdrPtr);//rowId 100 deleted
if (rc == NO_ERROR)
delete_count++;
else
{
//cout << "cannot find rowId->" << 100 << endl;
}
rc = m_indexlist.deleteIndexList( pFile, 975, key, &newIdxListHdrPtr);//rowId 975 deleted
if (rc == NO_ERROR)
delete_count++;
else
{
//cout << "cannot find rowId->" << 975 << endl;
}
rc = m_indexlist.deleteIndexList( pFile, 2000, key, &newIdxListHdrPtr);//rowId 2000 deleted
if (rc == NO_ERROR)
delete_count++;
else
{
//cout << "cannot find rowId->" << 2000 << endl;
}
m_indexlist.closeFile(pFile);
//Check Answers Read File at block fbo=0;
memset( curBlock.data, 0, sizeof(curBlock.data));
pFile = m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo);
width =32;
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, width, &newIdxRidListHdr );
k=k-delete_count;
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == (uint64_t)k );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.type == 0 );
CPPUNIT_ASSERT( newIdxRidListHdr.key == key );
CPPUNIT_ASSERT( newIdxRidListHdr.firstIdxRidListEntry.type == 7 );
CPPUNIT_ASSERT( newIdxRidListHdr.firstIdxRidListEntry.rid == 0 );
m_indexlist.closeFile(pFile);
printf("\nSuccessfully Running testIndexListDelete\n");
}//testIndexListDelete
void testIndexListReleaseMgrBack() {
FILE* pFile =NULL;
int rc, allocSize;
int file_number=8006;
DataBlock BlockZero;
int i;
IdxEmptyListEntry newIdxListHdrPtr;
IdxRidListHdr idxRidListHdr;
int rowId =0;
int newCnt = 2000;
CommBlock cb;
File file;
file.oid = file_number;
file.pFile = pFile;
cb.file = file;
BRMWrapper::setUseBrm(true);
m_indexlist.init(cb,LIST);
int key=123;
printf("\nRunning testIndexListReleaseMgrBack\n");
memset( BlockZero.data, 0, sizeof(BlockZero.data));
m_indexlist.deleteFile( file_number);
m_indexlist.createFile(file_number,10, allocSize);
pFile= m_indexlist.openFile( file_number );
file.oid = file_number;
file.pFile = pFile;
cb.file = file;
CPPUNIT_ASSERT( pFile != NULL );
m_indexlist.init(cb, LIST);
rc = m_indexlist.addIndexListHdr(cb, rowId, key, &newIdxListHdrPtr);
/*
if (rc != NO_ERROR)
{
//cout << "rc -> " << rc << endl;
//cout << "i->"<< i << endl;
//cout << "rowId->" << rowId << endl;
//cout << "key->" << key << endl;
}
*/
CPPUNIT_ASSERT( rc==NO_ERROR);
rc = m_indexlist.getHdrInfo(&newIdxListHdrPtr, &idxRidListHdr );
//if (rc!= NO_ERROR)
//printf("724. error code:%i \n", rc);
CPPUNIT_ASSERT( rc==NO_ERROR);
rowId++;
rc =m_indexlist.updateIndexList(pFile, rowId, key+1, &newIdxListHdrPtr);
/*
if (rc != NO_ERROR)
{
//cout << "rc -> " << rc << endl;
//cout << "rowId->" << rowId << endl;
//cout << "key+1->" << key+1 << endl;
}
*/
CPPUNIT_ASSERT( rc!=NO_ERROR);
rc = m_indexlist.getHdrInfo(&newIdxListHdrPtr, &idxRidListHdr );
/*
if (rc != NO_ERROR)
{
//cout <<" getHdrInfo has error-> rc " << rc << endl;
}
*/
CPPUNIT_ASSERT( rc==NO_ERROR);
for (i=0; i<newCnt; i++)
{
rc =m_indexlist.updateIndexList(pFile, rowId, key,&newIdxListHdrPtr);
/*
if (rc != NO_ERROR)
{
//cout <<" updateIndexList has error->" << endl;
//cout << "rc -> " << rc << endl;
//cout << "i->"<< i << endl;
//cout << "rowId->" << rowId << endl;
//cout << "key->" << key << endl;
}
*/
CPPUNIT_ASSERT( rc==NO_ERROR);
rc = m_indexlist.getHdrInfo(&newIdxListHdrPtr, &idxRidListHdr );
/*
if (rc != NO_ERROR)
{
//cout <<" getHdrInfo has error->" << endl;
//cout << "rc -> " << rc << endl;
//cout << "i->"<< i << endl;
//cout << "rowId->" << rowId << endl;
//cout << "key->" << key << endl;
}
*/
CPPUNIT_ASSERT( rc==NO_ERROR);
rowId++;
}
rowId--;
rc = m_indexlist.getHdrInfo(&newIdxListHdrPtr, &idxRidListHdr );
rc = m_indexlist.deleteIndexList( pFile, rowId,
key+1, &newIdxListHdrPtr);
CPPUNIT_ASSERT( rc!=NO_ERROR);
rc = m_indexlist.getHdrInfo(&newIdxListHdrPtr, &idxRidListHdr );
for (i=newCnt; i>=0; i--)
{
rc = m_indexlist.deleteIndexList( pFile, rowId,
key, &newIdxListHdrPtr);
rc = m_indexlist.getHdrInfo(&newIdxListHdrPtr, &idxRidListHdr );
CPPUNIT_ASSERT( rc==NO_ERROR);
rowId--;
}
rowId++;
for (i=0; i<newCnt; i++)
{
rc =m_indexlist.updateIndexList(pFile, rowId, key, &newIdxListHdrPtr);
rc = m_indexlist.getHdrInfo(&newIdxListHdrPtr, &idxRidListHdr );
/*
if (rc!=NO_ERROR)
{
//cout << " tindex 3099-> i " << i << " rc " << rc << endl;
}
*/
CPPUNIT_ASSERT( rc==NO_ERROR);
rowId++;
}
m_indexlist.closeFile(pFile);
printf("\nSuccessfully Running testIndexListReleaseMgrBack\n");
return;
}
void testIndexListMultipleAddHdr() {
DataBlock curBlock;
DataBlock curBlock2;
DataBlock curBlock3;
DataBlock curBlock4;
FILE* pFile =NULL;
int rc, fbo , sbid , entry ;
int fbo2, sbid2, entry2;
int fbo3, sbid3, entry3;
int fbo4, sbid4, entry4;
uint64_t key = 1;
uint64_t key2 = 2;
uint64_t key3 = 3;
uint64_t key4 = 4;
int count =2000;
int i =0;
int delete_count;
int file_number=8010;
RID rowIdArray[count+1];
RID rowIdArray2[count+1];
RID rowIdArray3[count+1];
RID rowIdArray4[count+1];
int j, k,l;
RID rowId;
IdxEmptyListEntry newIdxListHdrPtr;
IdxRidListHdr newIdxRidListHdr;
IdxEmptyListEntry newIdxListHdrPtr2;
IdxRidListHdr newIdxRidListHdr2;
IdxEmptyListEntry newIdxListHdrPtr3;
IdxRidListHdr newIdxRidListHdr3;
IdxEmptyListEntry newIdxListHdrPtr4;
IdxRidListHdr newIdxRidListHdr4;
bool found = false;
int p_sbid, p_entry, allocSize;
uint64_t p_fbo;
BRMWrapper::setUseBrm(true);
m_indexlist.setUseSortFlag(false);
printf("\nRunning testIndexListMultipleAddHdr\n");
delete_count =0;
memset( curBlock.data, 0, sizeof(curBlock.data));
m_indexlist.deleteFile( file_number);
m_indexlist.createFile(file_number,10, allocSize);
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
CommBlock cb;
File file;
file.oid = file_number;
file.pFile = pFile;
cb.file = file;
m_indexlist.init(cb,LIST);
for (i=0; i<count+1; i++)
{
rowIdArray[i]=i;
}
for (j=0; j<count+1; j++)
{
rowIdArray2[j]= i;
i++;
}
for (k=0; k<count+1; k++)
{
rowIdArray3[k]=i;
i++;
}
for (l=0; l<count+1; l++)
{
rowIdArray4[l]= i;
i++;
}
i = count+1;
//Initialize first rowId to 0
//cout << " start Timer :inserting " << count << " rowId " << endl;
m_indexlist.startfTimer();
int count_size = count+1;
rc = m_indexlist.addIndexListHdr(cb, &rowIdArray[0], count_size, key, &newIdxListHdrPtr);
rc = m_indexlist.addIndexListHdr(cb, &rowIdArray2[0],count_size, key2, &newIdxListHdrPtr2);
rc = m_indexlist.addIndexListHdr(cb, &rowIdArray3[0],count_size, key3, &newIdxListHdrPtr3);
rc = m_indexlist.addIndexListHdr(cb, &rowIdArray4[0],count_size, key4, &newIdxListHdrPtr4);
m_indexlist.stopfTimer();
//cout << " End Timer :inserting " << count << " rowId " << endl;
//cout << " Total used time (msec) " << m_indexlist.getTotalfRunTime() << endl;
//if (rc!= NO_ERROR)
// printf("245. error code:%i \n", rc);
CPPUNIT_ASSERT( rc == NO_ERROR );
fbo = newIdxListHdrPtr.fbo; //fbo=? from the free manager
sbid = newIdxListHdrPtr.sbid;//sbid =? from the free manager
entry = newIdxListHdrPtr.entry;//entry=? from the free manager
fbo2 = newIdxListHdrPtr2.fbo; //fbo=? from the free manager
sbid2 = newIdxListHdrPtr2.sbid;//sbid =? from the free manager
entry2 = newIdxListHdrPtr2.entry;//entry=? from the free manager
fbo3 = newIdxListHdrPtr3.fbo; //fbo=? from the free manager
sbid3 = newIdxListHdrPtr3.sbid;//sbid =? from the free manager
entry3 = newIdxListHdrPtr3.entry;//entry=? from the free manager
fbo4 = newIdxListHdrPtr4.fbo; //fbo=? from the free manager
sbid4 = newIdxListHdrPtr4.sbid;//sbid =? from the free manager
entry4 = newIdxListHdrPtr4.entry;//entry=? from the free manager
memset( curBlock.data, 0, sizeof(curBlock.data));
memset( curBlock2.data, 0, sizeof(curBlock2.data));
memset( curBlock3.data, 0, sizeof(curBlock.data));
memset( curBlock4.data, 0, sizeof(curBlock2.data));
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, 32, &newIdxRidListHdr );
RID ridArray[count+1];
int ridSize;
rc= m_indexlist.getRIDArrayFromListHdr(pFile,
key,
&newIdxListHdrPtr,
ridArray, ridSize);
//cout << "ridSize ->" << ridSize << endl;
CPPUNIT_ASSERT( ridSize == (int)newIdxRidListHdr.idxRidListSize.size);
rc = m_indexlist.readDBFile( pFile, curBlock2.data, fbo2 );
m_indexlist.getSubBlockEntry( curBlock2.data, sbid2, entry2, 32, &newIdxRidListHdr2 );
RID ridArray2[count+1];
int ridSize2;
rc= m_indexlist.getRIDArrayFromListHdr(pFile,
key2,
&newIdxListHdrPtr2,
ridArray2, ridSize2);
//cout << "ridSize2 ->" << ridSize2 << endl;
CPPUNIT_ASSERT( ridSize2 == (int)newIdxRidListHdr2.idxRidListSize.size);
rc = m_indexlist.readDBFile( pFile, curBlock3.data, fbo3 );
m_indexlist.getSubBlockEntry( curBlock3.data, sbid3, entry3, 32, &newIdxRidListHdr3 );
RID ridArray3[count+1];
int ridSize3;
rc= m_indexlist.getRIDArrayFromListHdr(pFile,
key3,
&newIdxListHdrPtr3,
ridArray3, ridSize3);
//cout << "ridSize3 ->" << ridSize3 << endl;
CPPUNIT_ASSERT( ridSize3 == (int)newIdxRidListHdr3.idxRidListSize.size);
rc = m_indexlist.readDBFile( pFile, curBlock4.data, fbo4 );
m_indexlist.getSubBlockEntry( curBlock4.data, sbid4, entry4, 32, &newIdxRidListHdr4 );
RID ridArray4[count+1];
int ridSize4;
rc= m_indexlist.getRIDArrayFromListHdr(pFile,
key4,
&newIdxListHdrPtr4,
ridArray4, ridSize4);
//cout << "ridSize4 ->" << ridSize4 << endl;
CPPUNIT_ASSERT( ridSize4 == (int)newIdxRidListHdr4.idxRidListSize.size);
//m_indexlist.stopTimer();
////cout << " Total used time (sec) " << m_indexlist.getTotalRunTime() << endl;
uint64_t firstLbid;
uint64_t firstLbid2;
uint64_t firstLbid3;
uint64_t firstLbid4;
rc = m_indexlist.findFirstBlk(pFile, key,&newIdxListHdrPtr, firstLbid);
rc = m_indexlist.findFirstBlk(pFile, key2,&newIdxListHdrPtr2, firstLbid2);
rc = m_indexlist.findFirstBlk(pFile, key3,&newIdxListHdrPtr3, firstLbid3);
rc = m_indexlist.findFirstBlk(pFile, key4,&newIdxListHdrPtr4, firstLbid4);
//cout << " Multiple RIDS Header insert->FirstLbid is ->" << firstLbid << endl;
//cout << " Multiple RIDS Header insert->FirstLbid2 is ->" << firstLbid2 << endl;
//cout << " Multiple RIDS Header insert->FirstLbid3 is ->" << firstLbid3 << endl;
//cout << " Multiple RIDS Header insert->FirstLbid4 is ->" << firstLbid4 << endl;
//cout << " This will print level and counts for Children " << endl;
/*
if (m_indexlist.getUseNarray())
{
m_indexlist.printBlocks(firstLbid);
m_indexlist.printBlocks(firstLbid2);
m_indexlist.printBlocks(firstLbid3);
m_indexlist.printBlocks(firstLbid4);
}
*/
CPPUNIT_ASSERT(rc==NO_ERROR);
m_indexlist.closeFile(pFile);
//
memset( curBlock.data, 0, sizeof(curBlock.data));
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
/*
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, 32, &newIdxRidListHdr );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == (uint64_t)(count+1));
int arraySize=0;
arraySize = newIdxRidListHdr.idxRidListSize.size;
if (arraySize >0)
{
RID ridArray[arraySize];
int ridSize;
rc= m_indexlist.getRIDArrayFromListHdr(pFile,
key,
&newIdxListHdrPtr,
ridArray, ridSize);
//cout << "ridSize->" << ridSize << endl;
CPPUNIT_ASSERT(ridSize==arraySize);
if (rc!= NO_ERROR)
{
printf("ERROR CODE :%i \n", rc);
}
}
*/
//uint64_t p2_fbo ;
//int p2_sbid, p2_entry;
rowId =0;
int rowId2=count+1;
int rowId3=2*(count+1);
int rowId4=3*(count+1);
for (i=0; i<count; i++)
{
found = m_indexlist.findRowId(pFile, rowId, key,&newIdxListHdrPtr, p_fbo, p_sbid, p_entry);
/*
if (!found)
{
printf(" \n Not Found tindex 3659->i %i rowId %i Not Found \n", i, (int)rowId);
}
else
{
//cout << " findRowId-> count in findRowId line 3663-> " << i <<" rowId " << rowId << endl;
//cout << " p_fbo " << p_fbo << " p_sbid " << p_sbid << " p_entry " << p_entry << endl;
}
*/
CPPUNIT_ASSERT( found == true );
/*rc = m_indexlist.deleteIndexList( pFile, rowId,
key, &newIdxListHdrPtr,
p2_fbo, p2_sbid, p2_entry);
*/
// //cout << " deleteIndexList-> p2_fbo " << p2_fbo << " p2_sbid " << p2_sbid << " p2_entry " << p2_entry << endl;
//CPPUNIT_ASSERT( rc == NO_ERROR );
found = m_indexlist.findRowId(pFile, rowId2, key2,&newIdxListHdrPtr2, p_fbo, p_sbid, p_entry);
/*
if (!found)
{
printf(" \n Not Found tindex 3678->i %i rowId2 %i Not Found \n", i, (int)rowId2);
}
else
{
//cout << " findRowId-> count in findRowId line 3682-> " << i <<" rowId2 " << rowId2 << endl;
//cout << " p_fbo " << p_fbo << " p_sbid " << p_sbid << " p_entry " << p_entry << endl;
}
*/
CPPUNIT_ASSERT( found == true );
found = m_indexlist.findRowId(pFile, rowId3, key3,&newIdxListHdrPtr3, p_fbo, p_sbid, p_entry);
/*
if (!found)
{
printf(" \n Not Found tindex 3691->i %i rowId3 %i Not Found \n", i, (int)rowId3);
}
else
{
//cout << " findRowId-> count in findRowId line 3695-> " << i <<" rowId3 " << rowId3 << endl;
//cout << " p_fbo " << p_fbo << " p_sbid " << p_sbid << " p_entry " << p_entry << endl;
}
*/
CPPUNIT_ASSERT( found == true );
found = m_indexlist.findRowId(pFile, rowId4, key4,&newIdxListHdrPtr4, p_fbo, p_sbid, p_entry);
/*
if (!found)
{
printf(" \n Not Found tindex 3704->i %i rowId4 %i Not Found \n", i, (int)rowId4);
}
else
{
//cout << " findRowId-> count in findRowId line 3708-> " << i <<" rowId4 " << rowId4 << endl;
//cout << " p_fbo " << p_fbo << " p_sbid " << p_sbid << " p_entry " << p_entry << endl;
}
*/
CPPUNIT_ASSERT( found == true );
rowId++;
rowId2++;
rowId3++;
rowId4++;
}
/*
rc = m_indexlist.deleteIndexList( pFile, rowId,
key, &newIdxListHdrPtr,
p_fbo, p_sbid, p_entry);
////cout << " p_fbo " << p_fbo << " p_sbid " << p_sbid << " p_entry " << p_entry << endl;
CPPUNIT_ASSERT( rc == NO_ERROR );
m_indexlist.closeFile(pFile);
//
memset( curBlock.data, 0, sizeof(curBlock.data));
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, 32, &newIdxRidListHdr );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == 0 );
*/
m_indexlist.closeFile(pFile);
printf("\nSuccessfully Running testIndexListMultipleAddHdr\n");
}//testIndexListMultipleAddHdr
void testIndexListMultipleUpdate() {
DataBlock curBlock;
FILE* pFile =NULL;
int rc, fbo , sbid , entry ;
uint64_t key=123;
int count =10000;
int rowId;
int i;
int delete_count;
int file_number=8012;
RID rowIdArray[count+1];
IdxEmptyListEntry newIdxListHdrPtr;
IdxRidListHdr newIdxRidListHdr;
bool found = false;
int p_sbid, p_entry, allocSize;
uint64_t p_fbo;
BRMWrapper::setUseBrm(true);
m_indexlist.setUseSortFlag(false);
printf("\nRunning testIndexListMultipleUpdate\n");
rowId = 0 ;
delete_count =0;
memset( curBlock.data, 0, sizeof(curBlock.data));
m_indexlist.deleteFile( file_number);
m_indexlist.createFile(file_number,10, allocSize);
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
//Free Manager
CommBlock cb;
File file;
file.oid = file_number;
file.pFile = pFile;
cb.file = file;
m_indexlist.init(cb,LIST);
for (int i=0; i<count+1; i++)
{
rowIdArray[i]=i;
}
rowId =0;
//Initialize first rowId to 0
rc = m_indexlist.addIndexListHdr(cb, rowId, key, &newIdxListHdrPtr);
/*
if (rc!= NO_ERROR)
printf("245. error code:%i \n", rc);
*/
CPPUNIT_ASSERT( rc == NO_ERROR );
fbo = newIdxListHdrPtr.fbo; //fbo=? from the free manager
sbid = newIdxListHdrPtr.sbid;//sbid =? from the free manager
entry = newIdxListHdrPtr.entry;//entry=? from the free manager
memset( curBlock.data, 0, sizeof(curBlock.data));
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, 32, &newIdxRidListHdr );
RID ridArray2[count+5];
int ridSize2;
rc= m_indexlist.getRIDArrayFromListHdr(pFile,
key,
&newIdxListHdrPtr,
ridArray2, ridSize2);
CPPUNIT_ASSERT( ridSize2 == 1 );
//Then increment the rowId as it goes
string timeStr;
m_indexlist.startfTimer();
//cout << " line 3571->startTimer for inserting "<< count <<" rowId " << endl;
rc =m_indexlist.updateIndexList(cb, &rowIdArray[1], count, key,&newIdxListHdrPtr);
/*
if (rc != NO_ERROR)
{
printf("rc %i i %i \n", rc, i);
}
*/
m_indexlist.stopfTimer();
//cout << " End Time :inserting "<< count << "rowId " << endl;
//cout << " Total used time (msec) " << m_indexlist.getTotalfRunTime() << endl;
m_indexlist.closeFile(pFile);
//
memset( curBlock.data, 0, sizeof(curBlock.data));
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, 32, &newIdxRidListHdr );
//cout << "newIdxRidListHdr.idxRidListSize.size->" << newIdxRidListHdr.idxRidListSize.size << endl;
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == (uint64_t)(count+1));
//CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == (int64_t)ridSize2);
int arraySize=0;
rowId =0;
arraySize = newIdxRidListHdr.idxRidListSize.size;
if (arraySize >0)
{
RID ridArray[arraySize];
int ridSize;
rc= m_indexlist.getRIDArrayFromListHdr(pFile,
key,
&newIdxListHdrPtr,
ridArray, ridSize);
CPPUNIT_ASSERT(ridSize==arraySize);
/*
if (rc!= NO_ERROR)
{
printf("ERROR CODE :%i \n", rc);
}
*/
//for (int i=0; i< ridSize ; i++)
// //cout<< " line 3591->ridArray[i]->" << ridArray[i] << " i->" << i << endl;
}
uint64_t firstLbid;
rc = m_indexlist.findFirstBlk(pFile, key, &newIdxListHdrPtr, firstLbid);
//cout << " Multiple RIDS insert->FirstLbid is ->" << firstLbid << endl;
//cout << " This will print level and counts for Children " << endl;
/*
if (m_indexlist.getUseNarray())
m_indexlist.printBlocks(firstLbid);
*/
uint64_t p2_fbo ;
int p2_sbid, p2_entry;
rowId =0;
for (i=0; i<count+1; i++)
{
found = m_indexlist.findRowId(pFile, rowId,key,&newIdxListHdrPtr, p_fbo, p_sbid, p_entry);
/*
if (!found)
{
printf(" tindex 3600->i %i rowId %i Not Found \n", i, rowId);
//return;
}
else
{
////cout << " Found count in findRowId line 3605-> " << i <<" rowId " << rowId << endl;
////cout << " p_fbo " << p_fbo << " p_sbid " << p_sbid << " p_entry " << p_entry << endl;
}
*/
CPPUNIT_ASSERT( found == true );
rc = m_indexlist.deleteIndexList( pFile, rowId,
key, &newIdxListHdrPtr,
p2_fbo, p2_sbid, p2_entry);
////cout << " p2_fbo " << p2_fbo << " p2_sbid " << p2_sbid << " p2_entry " << p2_entry << endl;
CPPUNIT_ASSERT( rc == NO_ERROR );
rowId++;
}
rc = m_indexlist.deleteIndexList( pFile, rowId,
key, &newIdxListHdrPtr,
p_fbo, p_sbid, p_entry);
CPPUNIT_ASSERT( rc != NO_ERROR );
m_indexlist.closeFile(pFile);
//
memset( curBlock.data, 0, sizeof(curBlock.data));
pFile= m_indexlist.openFile( file_number );
CPPUNIT_ASSERT( pFile != NULL );
rc = m_indexlist.readDBFile( pFile, curBlock.data, fbo );
m_indexlist.getSubBlockEntry( curBlock.data, sbid, entry, 32, &newIdxRidListHdr );
CPPUNIT_ASSERT( newIdxRidListHdr.idxRidListSize.size == 0 );
m_indexlist.closeFile(pFile);
printf("\nSuccessfully Running testIndexListMultipleUpdate\n");
}//testIndexListMultipleUpdate
};
CPPUNIT_TEST_SUITE_REGISTRATION( IndexTest );
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
int main( int argc, char **argv)
{
CppUnit::TextUi::TestRunner runner;
CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry();
runner.addTest( registry.makeTest() );
bool wasSuccessful = runner.run( "", false );
return (wasSuccessful ? 0 : 1);
}