asyncfiletest.cpp
来自「MySQL数据库开发源码 值得一看哦」· C++ 代码 · 共 696 行 · 第 1/2 页
CPP
696 行
/* Copyright (C) 2003 MySQL AB 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; either version 2 of the License, or (at your option) any later version. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *///#define TESTDEBUG 1#include <ndb_global.h>#include <kernel_types.h>#include <Pool.hpp>#include "AsyncFile.hpp"#include "NdbOut.hpp"#include "NdbTick.h"#include "NdbThread.h"#include "NdbMain.h"// Test and benchmark functionality of AsyncFile// -n Number of files// -r Number of simultaneous requests// -s Filesize, number of pages// -l Number of iterations// -remove, remove files after close// -reverse, write files in reverse order, start with the last page#define MAXFILES 255#define DEFAULT_NUM_FILES 1#define MAXREQUESTS 256#define DEFAULT_NUM_REQUESTS 1#define MAXFILESIZE 4096#define DEFAULT_FILESIZE 2048#define FVERSION 0x01000000#define PAGESIZE 8192#define TIMER_START { Uint64 starttick = NdbTick_CurrentMillisecond()#define TIMER_PRINT(str, ops) Uint64 stoptick = NdbTick_CurrentMillisecond();\ Uint64 totaltime = (stoptick-starttick); \ ndbout << ops << " " << str << \ " total time " << (int)totaltime << "ms" << endl;\ char buf[255];\ sprintf(buf, "%d %s/sec\n",(int)((ops*1000)/totaltime), str);\ ndbout <<buf << endl;}static int numberOfFiles = DEFAULT_NUM_FILES;static int numberOfRequests = DEFAULT_NUM_REQUESTS;static int fileSize = DEFAULT_FILESIZE;static int removeFiles = 0;static int writeFilesReverse = 0;static int numberOfIterations = 1;Uint32 FileNameArray[4];Pool<AsyncFile>* files;AsyncFile* openFiles[MAXFILES];Pool<Request>* theRequestPool;MemoryChannelMultipleWriter<Request>* theReportChannel;char WritePages[MAXFILES][PAGESIZE];char ReadPages[MAXFILES][PAGESIZE];int readArguments(int argc, const char** argv);int openFile(int fileNum);int openFileWait();int closeFile(int fileNum);int closeFileWait();int writeFile( int fileNum, int pagenum);int writeFileWait();int writeSyncFile( int fileNum, int pagenum);int writeSyncFileWait();int readFile( int fileNum, int pagenum);int readFileWait();NDB_COMMAND(aftest, "aftest", "aftest [-n <Number of files>] [-r <Number of simultaneous requests>] [-s <Filesize, number of pages>] [-l <Number of iterations>] [-remove, remove files after close] [-reverse, write files in reverse order, start with the last page]", "Test the AsyncFile class of Ndb", 8192){ int s, numReq, numOps; readArguments(argc, argv); files = new Pool<AsyncFile>(numberOfFiles, 2); theRequestPool = new Pool<Request>; theReportChannel = new MemoryChannelMultipleWriter<Request>; ndbout << "AsyncFileTest starting" << endl; ndbout << " " << numberOfFiles << " files" << endl; ndbout << " " << numberOfRequests << " requests" << endl; ndbout << " " << fileSize << " * 8k files" << endl << endl; ndbout << " " << numberOfIterations << " iterations" << endl << endl; NdbThread_SetConcurrencyLevel(numberOfFiles+2); // initialize data to write to files for (int i = 0; i < MAXFILES; i++) { for (int j = 0; j < PAGESIZE; j++){ WritePages[i][j] = (64+i+j)%256; } // memset(&WritePages[i][0], i+64, PAGESIZE); } // Set file directory and name // /T27/F27/NDBFS/S27Pnn.data FileNameArray[0] = 27; // T27 FileNameArray[1] = 27; // F27 FileNameArray[2] = 27; // S27 FileNameArray[3] = FVERSION; // Version for (int l = 0; l < numberOfIterations; l++) { ndbout << "Opening files" << endl; // Open files for (int f = 0; f < numberOfFiles; f++) { openFile(f); } // Wait for answer openFileWait(); ndbout << "Files opened!" << endl<< endl; // Write to files ndbout << "Started writing" << endl; TIMER_START; s = 0; numReq = 0; numOps = 0; while ( s < fileSize) { for (int r = 0; r < numberOfRequests; r++) { for (int f = 0; f < numberOfFiles; f++) { writeFile(f, s); numReq++; numOps++; } s++; } while (numReq > 0) { writeFileWait(); numReq--; } } TIMER_PRINT("writes", numOps); ndbout << "Started reading" << endl; TIMER_START; // Read from files s = 0; numReq = 0; numOps = 0; while ( s < fileSize) { for (int r = 0; r < numberOfRequests; r++) { for (int f = 0; f < numberOfFiles; f++) { readFile(f, s); numReq++; numOps++; } s++; } while (numReq > 0) { readFileWait(); numReq--; } } TIMER_PRINT("reads", numOps); ndbout << "Started writing with sync" << endl; TIMER_START; // Write to files s = 0; numReq = 0; numOps = 0; while ( s < fileSize) { for (int r = 0; r < numberOfRequests; r++) { for (int f = 0; f < numberOfFiles; f++) { writeSyncFile(f, s); numReq++; numOps++; } s++; } while (numReq > 0) { writeSyncFileWait(); numReq--; } } TIMER_PRINT("writeSync", numOps); // Close files ndbout << "Closing files" << endl; for (int f = 0; f < numberOfFiles; f++) { closeFile(f); } // Wait for answer closeFileWait(); ndbout << "Files closed!" << endl<< endl; } // Deallocate memory delete files; delete theReportChannel; delete theRequestPool; return 0;}int forward( AsyncFile * file, Request* request ){ file->execute(request); ERROR_CHECK 0; return 1;}int openFile( int fileNum){ AsyncFile* file = (AsyncFile *)files->get(); FileNameArray[3] = fileNum | FVERSION; file->fileName().set( NDBFS_REF, &FileNameArray[0] ); ndbout << "openFile: " << file->fileName().c_str() << endl; if( ERROR_STATE ) { ERROR_RESET; files->put( file ); ndbout << "Failed to set filename" << endl; return 1; } file->reportTo(theReportChannel); Request* request = theRequestPool->get(); request->action= Request::open; request->error= 0; request->par.open.flags = 0x302; //O_RDWR | O_CREAT | O_TRUNC ; // 770 request->set(NDBFS_REF, 0x23456789, fileNum ); request->file = file; if (!forward(file,request)) { // Something went wrong ndbout << "Could not forward open request" << endl; theRequestPool->put(request); return 1; } return 0;}int closeFile( int fileNum){ AsyncFile* file = openFiles[fileNum]; Request* request = theRequestPool->get(); if (removeFiles == 1) request->action = Request::closeRemove; else request->action= Request::close; request->error= 0; request->set(NDBFS_REF, 0x23456789, fileNum ); request->file = file; if (!forward(file,request)) { // Something went wrong ndbout << "Could not forward close request" << endl; theRequestPool->put(request); return 1; } return 0;}int writeFile( int fileNum, int pagenum){ AsyncFile* file = openFiles[fileNum];#ifdef TESTDEBUG ndbout << "writeFile" << fileNum <<": "<<pagenum<<", " << file->fileName().c_str()<< endl;#endif Request *request = theRequestPool->get(); request->action = Request::write; request->error = 0; request->set(NDBFS_REF, pagenum, fileNum); request->file = openFiles[fileNum]; // Write only one page, choose the correct page for each file using fileNum request->par.readWrite.pages[0].buf = &WritePages[fileNum][0]; request->par.readWrite.pages[0].size = PAGESIZE; if (writeFilesReverse == 1) { // write the last page in the files first // This is a normal way for the Blocks in Ndb to write to a file request->par.readWrite.pages[0].offset = (fileSize - pagenum - 1) * PAGESIZE; } else { request->par.readWrite.pages[0].offset = pagenum * PAGESIZE; } request->par.readWrite.numberOfPages = 1; if (!forward(file,request)) { // Something went wrong ndbout << "Could not forward write request" << endl; theRequestPool->put(request); return 1; } return 0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?