// Matt Wells, copyright Apr 2001 // . non-blocking dump of an RdbTree to an RdbFile // . RdbFile can be used with RdbGet even in the middle of dumping // . uses a little mem for an RdbMap and some for write buffering // . frees the nodes as it dumps them to disk (flushes cache) // . can also do a non-key-ordered dump for quick saving of an RdbTree // . Then you can use RdbDump::load() to load it back to the tree #ifndef _RDBDUMP_H_ #define _RDBDUMP_H_ #include "BigFile.h" #include "Loop.h" #include "RdbTree.h" #include "RdbBuckets.h" #include "RdbMap.h" #include "RdbCache.h" #include "Msg5.h" class RdbDump { public: RdbDump() { m_isDumping = false; }; void reset ( ) ; bool isDumping () { return m_isDumping; }; // . set up for a dump of rdb records to a file // . returns false and sets errno on error bool set ( //char *coll , collnum_t collnum , BigFile *file , long id2 , // in Rdb::m_files[] array bool isTitledb , // are we dumping TitleRecs? RdbBuckets *buckets , // optional buckets to dump RdbTree *tree , // optional tree to dump RdbMap *map , RdbCache *cache , // for caching dumped tree long maxBufSize , bool orderedDump , // dump in order of keys? bool dedup , // for merging tree into cache long niceness , void *state , void (* callback ) ( void *state ) , bool useHalfKeys , long long startOffset , //key_t prevLastKey , char *prevLastKey , char keySize , class DiskPageCache *pc , long long maxFileSize , class Rdb *rdb ); // a niceness of 0 means to block on the dumping long getNiceness() { return m_niceness; }; // . dump the tree to the file // . returns false if blocked, true otherwise bool dumpTree ( bool recall ); bool dumpList ( RdbList *list , long niceness , bool isRecall ); void doneDumping ( ); bool doneReadingForVerify ( ) ; // . load the table from an RdbFile // . used for saved table recovery // . table must be empty/unused otherwise false will be returned // . returns true if "filename" does not exist // . overriden in LdbDumper to pass an LdbFile casted as an RdbFile // . this override makes the file's getSlot() return LdbSlots // which can be appropriately added to an RdbTable or LdbTable bool load ( class Rdb *rdb , long fixedDataSize , BigFile *file , class DiskPageCache *pc ); // . calls the callback specified in set() when done // . errno set to indicate error #, if any void close ( ); // must be public so wrapper can call it bool writeBuf ( ); // called when we've finished writing an RdbList to the file bool doneDumpingList ( bool addToMap ) ; //key_t getFirstKeyInQueue () { return m_firstKeyInQueue; }; //key_t getLastKeyInQueue () { return m_lastKeyInQueue; }; char *getFirstKeyInQueue () { return m_firstKeyInQueue; }; char *getLastKeyInQueue () { return m_lastKeyInQueue; }; // this is called only when dumping TitleRecs bool updateTfndbLoop ( ); void continueDumping(); // private: bool m_isDumping; // true if we're in the middle of dumping // true if the actual write thread is outstanding bool m_writing; RdbTree *m_tree ; RdbBuckets *m_buckets ; RdbMap *m_map ; RdbCache *m_cache ; long m_maxBufSize ; bool m_orderedDump ; bool m_dedup ; // used for merging/adding tree to cache void *m_state ; void (*m_callback)(void *state ) ; long long m_offset ; BigFile *m_file ; long m_id2 ; // secondary id of file we are dumping to RdbList *m_list ; // holds list to dump RdbList m_ourList ; // we use for dumping a tree, point m_list char *m_buf ; // points into list char *m_verifyBuf ; long m_verifyBufSize ; long m_bytesToWrite ; long m_bytesWritten ; char m_addToMap ; //key_t m_firstKeyInQueue; //key_t m_lastKeyInQueue; char m_firstKeyInQueue[MAX_KEY_BYTES]; char *m_lastKeyInQueue; //key_t m_prevLastKey ; char m_prevLastKey[MAX_KEY_BYTES]; long m_nextNode ; //key_t m_nextKey ; char m_nextKey[MAX_KEY_BYTES]; bool m_rolledOver ; // true if m_nextKey rolls back to 0 // . file descriptor of file #0 in the BigFile // . we're dumping to this guy int m_fd; // we pass this to BigFile::write() to do non-blocking writes FileState m_fstate; // a niceness of 0 means the dump will block, otherwise, will not long m_niceness; bool m_useHalfKeys; bool m_hacked; bool m_hacked12; long m_totalPosDumped; long m_totalNegDumped; // recall info long long m_t1; long m_numPosRecs; long m_numNegRecs; // are we dumping a list of TitleRecs? bool m_isTitledb; // for scanning db to dedup m_tmp //key_t m_startKey; // when the scanning is done //bool m_done; // use this to scan tfndb //Msg5 m_msg5; // scan the tfndb into ehre //RdbList m_ulist; // store tfndb key in here for updateTfndbLoop() //key_t m_tkey; char m_tkey[MAX_KEY_BYTES]; // for setting m_rdb->m_needsSave after deleting list from tree class Rdb *m_rdb; //char m_coll [ MAX_COLL_LEN + 1 ]; collnum_t m_collnum; bool m_doCollCheck; bool m_tried; bool m_isSuspended; char m_ks; long m_deduped1; long m_deduped2; long m_deduped3; long m_unforced; }; #endif