diff options
Diffstat (limited to 'storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp')
-rw-r--r-- | storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp b/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp new file mode 100644 index 00000000000..2176c93c5d5 --- /dev/null +++ b/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp @@ -0,0 +1,234 @@ +/* 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 */ + +#ifndef AsyncFile_H +#define AsyncFile_H + +//=========================================================================== +// +// .DESCRIPTION +// Asynchronous file, All actions are executed concurrently with other +// activity of the process. +// Because all action are performed in a seperated thread the result of +// of a action is send back tru a memory channel. +// For the asyncronise notivication of a finished request all the calls +// have a request as paramater, the user can use the userData pointer +// to add information it needs when the request is send back. +// +// +// .TYPICAL USE: +// Writing or reading data to/from disk concurrently to other activities. +// +//=========================================================================== +//============================================================================= +// +// .PUBLIC +// +//============================================================================= +/////////////////////////////////////////////////////////////////////////////// +// +// AsyncFile( ); +// Description: +// Initialisation of the class. +// Parameters: +// - +/////////////////////////////////////////////////////////////////////////////// +// +// ~AsyncFile( ); +// Description: +// Tell the thread to stop and wait for it to return +// Parameters: +// - +/////////////////////////////////////////////////////////////////////////////// +// +// doStart( ); +// Description: +// Spawns the new thread. +// Parameters: +// Base path of filesystem +// +/////////////////////////////////////////////////////////////////////////////// +// +// void execute(Request *request); +// Description: +// performens the requered action. +// Parameters: +// request: request to be called when open is finished. +// action= open|close|read|write|sync +// if action is open then: +// par.open.flags= UNIX open flags, see man open +// par.open.name= name of the file to open +// if action is read or write then: +// par.readWrite.buf= user provided buffer to read/write +// the data from/to +// par.readWrite.size= how many bytes must be read/written +// par.readWrite.offset= absolute offset in file in bytes +// return: +// return values are stored in the request error field: +// error= return state of the action, UNIX error see man open/errno +// userData= is untouched can be used be user. +// +/////////////////////////////////////////////////////////////////////////////// +// +// void reportTo( MemoryChannel<Request> *reportTo ); +// Description: +// set the channel where the file must report the result of the +// actions back to. +// Parameters: +// reportTo: the memory channel to use use MemoryChannelMultipleWriter +// if more +// than one file uses this channel to report back. +// +/////////////////////////////////////////////////////////////////////////////// + +#include <kernel_types.h> +#include "MemoryChannel.hpp" +#include "Filename.hpp" + +const int ERR_ReadUnderflow = 1000; + +const int WRITECHUNK = 262144; + +class AsyncFile; + +class Request +{ +public: + enum Action { + open, + close, + closeRemove, + read, // Allways leave readv directly after + // read because SimblockAsyncFileSystem depends on it + readv, + write,// Allways leave writev directly after + // write because SimblockAsyncFileSystem depends on it + writev, + writeSync,// Allways leave writevSync directly after + // writeSync because SimblockAsyncFileSystem depends on it + writevSync, + sync, + end, + append, + rmrf + }; + Action action; + union { + struct { + Uint32 flags; + } open; + struct { + int numberOfPages; + struct{ + char *buf; + size_t size; + off_t offset; + } pages[16]; + } readWrite; + struct { + const char * buf; + size_t size; + } append; + struct { + bool directory; + bool own_directory; + } rmrf; + } par; + int error; + + void set(BlockReference userReference, + Uint32 userPointer, + Uint16 filePointer); + BlockReference theUserReference; + Uint32 theUserPointer; + Uint16 theFilePointer; + // Information for open, needed if the first open action fails. + AsyncFile* file; + Uint32 theTrace; +}; + + +inline +void +Request::set(BlockReference userReference, + Uint32 userPointer, Uint16 filePointer) +{ + theUserReference= userReference; + theUserPointer= userPointer; + theFilePointer= filePointer; +} + +class AsyncFile +{ +public: + AsyncFile(); + ~AsyncFile(); + + void reportTo( MemoryChannel<Request> *reportTo ); + + void execute( Request* request ); + + void doStart(Uint32 nodeId, const char * fspath, const char * backup_path); + // its a thread so its always running + void run(); + + bool isOpen(); + + Filename theFileName; +private: + + void openReq(Request *request); + void readReq(Request *request); + void readvReq(Request *request); + void writeReq(Request *request); + void writevReq(Request *request); + + void closeReq(Request *request); + void syncReq(Request *request); + void removeReq(Request *request); + void appendReq(Request *request); + void rmrfReq(Request *request, char * path, bool removePath); + void endReq(); + + int readBuffer(char * buf, size_t size, off_t offset); + int writeBuffer(const char * buf, size_t size, off_t offset, + size_t chunk_size = WRITECHUNK); + + int extendfile(Request* request); + void createDirectories(); + +#ifdef NDB_WIN32 + HANDLE hFile; +#else + int theFd; +#endif + + MemoryChannel<Request> *theReportTo; + MemoryChannel<Request>* theMemoryChannelPtr; + + struct NdbThread* theThreadPtr; + NdbMutex* theStartMutexPtr; + NdbCondition* theStartConditionPtr; + bool theStartFlag; + int theWriteBufferSize; + char* theWriteBuffer; + + bool m_openedWithSync; + Uint32 m_syncCount; + Uint32 m_syncFrequency; +}; + +#endif |