// A set of tests which test the functionality of the buffer code, independently from the DB. #include "main.h" #include "buffer.h" #include "xxhash32.h" #include #include void printBuffer(BufferPool* bf) { int globalD = bf->directory.getGlobalDepth(); std::cout << "current global depth " << globalD << "\n"; for (int i = 0; i < (1 << globalD); i++) { std::cout << "directory hash" << i << "\n"; for (PageFrame* frame : bf->directory.directoryVec[i]){ std::cout << " frame id: " << frame->pageId << "\n"; } } } int main() { // test was run on a chaining length of 2 (manually changed the max_chaining for simplicity) BufferPool* bf = new BufferPool(1, 2); int alignment = 4096; int size = 4096; char* p1 = nullptr; posix_memalign(reinterpret_cast(&p1), alignment, size); char* p2 = nullptr; posix_memalign(reinterpret_cast(&p2), alignment, size); char* p3 = nullptr; posix_memalign(reinterpret_cast(&p3), alignment, size); char* p4 = nullptr; posix_memalign(reinterpret_cast(&p4), alignment, size); char* p5 = nullptr; posix_memalign(reinterpret_cast(&p5), alignment, size); char* p6 = nullptr; posix_memalign(reinterpret_cast(&p6), alignment, size); char* p7 = nullptr; posix_memalign(reinterpret_cast(&p7), alignment, size); char* p8 = nullptr; posix_memalign(reinterpret_cast(&p8), alignment, size); char* p9 = nullptr; posix_memalign(reinterpret_cast(&p9), alignment, size); char* p10 = nullptr; posix_memalign(reinterpret_cast(&p10), alignment, size); for (int i=0; i < 4096; i++){ if (i != 4095){ p1[i] = 'a'; p2[i] = 'b'; p3[i] = 'c'; p4[i] = 'd'; p5[i] = 'e'; p6[i] = 'f'; p7[i] = 'g'; p8[i] = 'h'; p9[i] = 'i'; p10[i] = 'j'; } else{ p1[i] = '\0'; p2[i] = '\0'; p3[i] = '\0'; p4[i] = '\0'; p5[i] = '\0'; p6[i] = '\0'; p7[i] = '\0'; p8[i] = '\0'; p9[i] = '\0'; p10[i] = '\0'; } } bf->insertPage(1, p1); int ih1 = 1; uint32_t h1 = XXHash32::hash(&ih1, sizeof(int), 0); std::cout << "page 1 inserted with hash: " << std::bitset<32>(h1) << "\n"; bf->insertPage(2, p2); int ih2 = 2; uint32_t h2 = XXHash32::hash(&ih2, sizeof(int), 0); std::cout << "page 2 inserted with hash: " << std::bitset<32>(h2) << "\n"; printBuffer(bf); // char* res1 = bf->getPage(2); // std::cout << res1 << "\n"; // will print out 4096 chars bf->insertPage(3, p3); int ih3 = 3; uint32_t h3 = XXHash32::hash(&ih3, sizeof(int), 0); std::cout << "page 3 inserted with hash: " << std::bitset<32>(h3) << "\n"; printBuffer(bf); // char* res3 = bf->getPage(3); // std::cout << res3 << "\n"; // will print out 4096 chars bf->insertPage(4, p4); int ih4 = 4; uint32_t h4 = XXHash32::hash(&ih4, sizeof(int), 0); std::cout << "page 4 inserted with hash: " << std::bitset<32>(h4) << "\n"; bf->insertPage(5, p5); int ih5 = 5; uint32_t h5 = XXHash32::hash(&ih5, sizeof(int), 0); std::cout << "page 5 inserted with hash: " << std::bitset<32>(h5) << "\n"; printBuffer(bf); // shrink while items must be evicted to make space // bf->setMaxDirectoryDepth(1); // printBuffer(bf); bf->insertPage(6, p6); int ih6 = 6; uint32_t h6 = XXHash32::hash(&ih6, sizeof(int), 0); std::cout << "page 6 inserted with hash: " << std::bitset<32>(h6) << "\n"; printBuffer(bf); bf->insertPage(7, p7); int ih7 = 7; uint32_t h7 = XXHash32::hash(&ih7, sizeof(int), 0); std::cout << "page 7 inserted with hash: " << std::bitset<32>(h7) << "\n"; printBuffer(bf); char* nothing = bf->getPage(7); // should be null if (nothing == nullptr) { std::cout << "Correctly got the nullptr. \n"; } std::cout << "Shrinking to 0. \n"; bf->setMaxDirectoryDepth(0); printBuffer(bf); bf->insertPage(8, p8); std::cout << "page 8 inserted \n"; bf->insertPage(9, p9); std::cout << "page 9 inserted \n";\ bf->insertPage(10, p10); std::cout << "page 10 inserted \n"; printBuffer(bf); // not enough space as the max now is 2^1 bf->destroyBuffer(); }