diff --git a/src/burp/BurpTasks.cpp b/src/burp/BurpTasks.cpp index 0f6411f114d..f9b6911dee4 100644 --- a/src/burp/BurpTasks.cpp +++ b/src/burp/BurpTasks.cpp @@ -43,7 +43,7 @@ const FB_SIZE_T MIN_IO_BUFFER_SIZE = 128 * 1024; /// class IOBuffer -IOBuffer::IOBuffer(void* item, FB_SIZE_T size) : +IOBuffer::IOBuffer(BurpTaskItem* item, FB_SIZE_T size) : m_item(item), m_memory(*getDefaultMemoryPool()), m_aligned(NULL), @@ -53,7 +53,6 @@ IOBuffer::IOBuffer(void* item, FB_SIZE_T size) : m_next(NULL), m_linked(false), m_locked(0) - { fb_assert(size >= MIN_IO_BUFFER_SIZE); m_aligned = m_memory.getBuffer(m_size); @@ -63,7 +62,7 @@ IOBuffer::IOBuffer(void* item, FB_SIZE_T size) : class BurpGblHolder { public: - BurpGblHolder(BurpGlobals* gbl, void* item) + BurpGblHolder(BurpGlobals* gbl, BurpTaskItem* item) { m_prev = BurpGlobals::getSpecific(); @@ -89,14 +88,13 @@ class BurpGblHolder } protected: BurpGlobals* m_prev; - void* m_prev_item; + BurpTaskItem* m_prev_item; }; /// class BackupRelationTask -BackupRelationTask::BackupRelationTask(BurpGlobals* tdgbl) : Task(), - m_masterGbl(tdgbl), +BackupRelationTask::BackupRelationTask(BurpGlobals* tdgbl) : BurpTask(tdgbl), m_relation(NULL), m_readers(0), m_readDone(false), @@ -104,8 +102,6 @@ BackupRelationTask::BackupRelationTask(BurpGlobals* tdgbl) : Task(), m_stop(false), m_error(false) { - fb_utils::init_status(m_status); - int workers = tdgbl->gbl_sw_par_workers; if (workers <= 0) workers = 1; @@ -164,7 +160,7 @@ void BackupRelationTask::SetRelation(burp_rel* relation) bool BackupRelationTask::handler(WorkItem& _item) { - Item* item = reinterpret_cast(&_item); + Item* item = static_cast(&_item); try { @@ -201,7 +197,7 @@ bool BackupRelationTask::handler(WorkItem& _item) bool BackupRelationTask::getWorkItem(BackupRelationTask::WorkItem** pItem) { - Item* item = reinterpret_cast (*pItem); + Item* item = static_cast(*pItem); MutexLockGuard guard(m_mutex, FB_FUNCTION); @@ -321,7 +317,7 @@ IOBuffer* BackupRelationTask::renewBuffer(BurpGlobals* tdgbl) { fb_assert(!tdgbl->master); - Item* item = reinterpret_cast (tdgbl->taskItem); + Item* item = static_cast(tdgbl->taskItem); fb_assert(item); if (!item) return NULL; @@ -398,7 +394,7 @@ void BackupRelationTask::releaseBuffer(Item& item) void BackupRelationTask::recordAdded(BurpGlobals* tdgbl) { - Item* item = reinterpret_cast (tdgbl->taskItem); + Item* item = static_cast(tdgbl->taskItem); if (!item) return; @@ -407,15 +403,6 @@ void BackupRelationTask::recordAdded(BurpGlobals* tdgbl) tdgbl->mvol_io_data = tdgbl->gbl_io_ptr; } -BackupRelationTask* BackupRelationTask::getBackupTask(BurpGlobals* tdgbl) -{ - Item* item = reinterpret_cast (tdgbl->taskItem); - if (item) - return item->getBackupTask(); - - return NULL; -} - IOBuffer* BackupRelationTask::getDirtyBuffer() { IOBuffer* buf = NULL; @@ -444,7 +431,7 @@ IOBuffer* BackupRelationTask::getDirtyBuffer() void BackupRelationTask::putCleanBuffer(IOBuffer* buf) { - Item* item = reinterpret_cast(buf->getItem()); + Item* item = static_cast(buf->getItem()); { MutexLockGuard guard(item->m_mutex, FB_FUNCTION); @@ -615,8 +602,7 @@ BackupRelationTask::Item::EnsureUnlockBuffer::~EnsureUnlockBuffer() /// class RestoreRelationTask -RestoreRelationTask::RestoreRelationTask(BurpGlobals* tdgbl) : Task(), - m_masterGbl(tdgbl), +RestoreRelationTask::RestoreRelationTask(BurpGlobals* tdgbl) : BurpTask(tdgbl), m_relation(NULL), m_lastRecord(rec_relation_data), m_writers(0), @@ -627,8 +613,6 @@ RestoreRelationTask::RestoreRelationTask(BurpGlobals* tdgbl) : Task(), m_verbRecs(0) { - fb_utils::init_status(m_status); - int workers = tdgbl->gbl_sw_par_workers; if (workers <= 0) workers = 1; @@ -690,7 +674,7 @@ void RestoreRelationTask::SetRelation(BurpGlobals* tdgbl, burp_rel* relation) bool RestoreRelationTask::handler(WorkItem& _item) { - Item* item = reinterpret_cast(&_item); + Item* item = static_cast(&_item); try { @@ -729,7 +713,7 @@ bool RestoreRelationTask::handler(WorkItem& _item) bool RestoreRelationTask::getWorkItem(WorkItem** pItem) { - Item* item = reinterpret_cast (*pItem); + Item* item = static_cast(*pItem); MutexLockGuard guard(m_mutex, FB_FUNCTION); @@ -778,7 +762,7 @@ bool RestoreRelationTask::getWorkItem(WorkItem** pItem) return (item && item->m_inuse); } -bool RestoreRelationTask::getResult(IStatus* status) +bool RestoreRelationTask::getResult(IStatus* /*status*/) { fb_assert(!m_error || m_dirtyBuffers.isEmpty()); @@ -790,15 +774,6 @@ int RestoreRelationTask::getMaxWorkers() return m_items.getCount(); } -RestoreRelationTask* RestoreRelationTask::getRestoreTask(BurpGlobals* tdgbl) -{ - Item* item = reinterpret_cast (tdgbl->taskItem); - if (item) - return item->getRestoreTask(); - - return NULL; -} - void RestoreRelationTask::verbRecs(FB_UINT64& records, bool total) { if (!total) @@ -1004,7 +979,7 @@ IOBuffer* RestoreRelationTask::renewBuffer(BurpGlobals* tdgbl) fb_assert(!tdgbl->master); - Item* item = reinterpret_cast (tdgbl->taskItem); + Item* item = static_cast(tdgbl->taskItem); fb_assert(item); if (!item) ExcReadDone::raise(); diff --git a/src/burp/BurpTasks.h b/src/burp/BurpTasks.h index a0329721554..5ee334888d5 100644 --- a/src/burp/BurpTasks.h +++ b/src/burp/BurpTasks.h @@ -232,10 +232,88 @@ class WriteRelationReq bool m_resync; }; -// forward declaration +// forward declarations class IOBuffer; +class BurpMaster; +class BurpTask; -class BackupRelationTask : public Firebird::Task + + +// Common base class for backup and restore task items +class BurpTaskItem : public Firebird::Task::WorkItem +{ +public: + BurpTaskItem(BurpTask* task); + + BurpTask* getBurpTask() const; +}; + +// Common base class for backup and restore tasks +class BurpTask : public Firebird::Task +{ +public: + BurpTask(BurpGlobals* tdgbl) : Firebird::Task(), + m_masterGbl(tdgbl) + { } + + static BurpTask* getBurpTask(BurpGlobals* tdgbl) + { + if (tdgbl->taskItem) + return tdgbl->taskItem->getBurpTask(); + + return nullptr; + } + + BurpGlobals* getMasterGbl() const + { + return m_masterGbl; + } + + bool isBackup() const + { + switch (m_masterGbl->action->act_action) + { + case ACT_backup: + case ACT_backup_split: + case ACT_backup_fini: + return true; + } + return false; + } + + bool isRestore() const + { + switch (m_masterGbl->action->act_action) + { + case ACT_restore: + case ACT_restore_join: + return true; + } + return false; + } + +protected: + BurpGlobals* const m_masterGbl; + +private: + friend class BurpMaster; + + Firebird::Mutex burpOutMutex; +}; + + +inline BurpTaskItem::BurpTaskItem(BurpTask* task) : + Firebird::Task::WorkItem(task) +{ +} + +inline BurpTask* BurpTaskItem::getBurpTask() const +{ + return static_cast(m_task); +} + + +class BackupRelationTask : public BurpTask { public: BackupRelationTask(BurpGlobals* tdgbl); @@ -248,10 +326,10 @@ class BackupRelationTask : public Firebird::Task bool getResult(Firebird::IStatus* status); int getMaxWorkers(); - class Item : public Firebird::Task::WorkItem + class Item : public BurpTaskItem { public: - Item(BackupRelationTask* task, bool writer) : WorkItem(task), + Item(BackupRelationTask* task, bool writer) : BurpTaskItem(task), m_inuse(false), m_writer(writer), m_ownAttach(!writer), @@ -266,7 +344,7 @@ class BackupRelationTask : public Firebird::Task BackupRelationTask* getBackupTask() const { - return reinterpret_cast (m_task); + return static_cast(m_task); } class EnsureUnlockBuffer @@ -295,11 +373,14 @@ class BackupRelationTask : public Firebird::Task Firebird::Condition m_cleanCond; }; - static BackupRelationTask* getBackupTask(BurpGlobals* tdgbl); - BurpGlobals* getMasterGbl() const + static BackupRelationTask* getBackupTask(BurpGlobals* tdgbl) { - return m_masterGbl; + auto task = BurpTask::getBurpTask(tdgbl); + fb_assert(!task || task->isBackup()); + + return static_cast(task); } + static void recordAdded(BurpGlobals* tdgbl); // reader static IOBuffer* renewBuffer(BurpGlobals* tdgbl); // reader @@ -308,7 +389,6 @@ class BackupRelationTask : public Firebird::Task return m_stop; } - Firebird::Mutex burpOutMutex; private: void initItem(BurpGlobals* tdgbl, Item& item); void freeItem(Item& item); @@ -323,7 +403,6 @@ class BackupRelationTask : public Firebird::Task IOBuffer* getDirtyBuffer(); // writer void putCleanBuffer(IOBuffer* buf); // writer - BurpGlobals* m_masterGbl; burp_rel* m_relation; ReadRelationMeta m_metadata; int m_readers; // number of active readers, could be less than items allocated @@ -332,7 +411,6 @@ class BackupRelationTask : public Firebird::Task Firebird::Mutex m_mutex; Firebird::HalfStaticArray m_items; - ISC_STATUS_ARRAY m_status; volatile bool m_stop; bool m_error; @@ -342,7 +420,7 @@ class BackupRelationTask : public Firebird::Task }; -class RestoreRelationTask : public Firebird::Task +class RestoreRelationTask : public BurpTask { public: RestoreRelationTask(BurpGlobals* tdgbl); @@ -355,10 +433,10 @@ class RestoreRelationTask : public Firebird::Task bool getResult(Firebird::IStatus* status); int getMaxWorkers(); - class Item : public Firebird::Task::WorkItem + class Item : public BurpTaskItem { public: - Item(RestoreRelationTask* task, bool reader) : WorkItem(task), + Item(RestoreRelationTask* task, bool reader) : BurpTaskItem(task), m_inuse(false), m_reader(reader), m_ownAttach(!reader), @@ -371,7 +449,7 @@ class RestoreRelationTask : public Firebird::Task RestoreRelationTask* getRestoreTask() const { - return reinterpret_cast (m_task); + return static_cast(m_task); } class EnsureUnlockBuffer @@ -406,10 +484,12 @@ class RestoreRelationTask : public Firebird::Task static void raise(); }; - static RestoreRelationTask* getRestoreTask(BurpGlobals* tdgbl); - BurpGlobals* getMasterGbl() const + static RestoreRelationTask* getRestoreTask(BurpGlobals* tdgbl) { - return m_masterGbl; + auto task = BurpTask::getBurpTask(tdgbl); + fb_assert(!task || task->isRestore()); + + return static_cast(BurpTask::getBurpTask(tdgbl)); } static IOBuffer* renewBuffer(BurpGlobals* tdgbl); // writer @@ -430,7 +510,6 @@ class RestoreRelationTask : public Firebird::Task // commit and detach all worker connections bool finish(); - Firebird::Mutex burpOutMutex; private: void initItem(BurpGlobals* tdgbl, Item& item); bool freeItem(Item& item, bool commit); @@ -450,7 +529,6 @@ class RestoreRelationTask : public Firebird::Task IOBuffer* read_blob(BurpGlobals* tdgbl, IOBuffer* ioBuf); IOBuffer* read_array(BurpGlobals* tdgbl, IOBuffer* ioBuf); - BurpGlobals* m_masterGbl; burp_rel* m_relation; rec_type m_lastRecord; // last backup record read for relation, usually rec_relation_end WriteRelationMeta m_metadata; @@ -459,7 +537,6 @@ class RestoreRelationTask : public Firebird::Task Firebird::Mutex m_mutex; Firebird::HalfStaticArray m_items; - ISC_STATUS_ARRAY m_status; volatile bool m_stop; bool m_error; Firebird::AtomicCounter m_records; // records restored for the current relation @@ -476,7 +553,7 @@ class RestoreRelationTask : public Firebird::Task class IOBuffer { public: - IOBuffer(void*, FB_SIZE_T size); + IOBuffer(BurpTaskItem*, FB_SIZE_T size); UCHAR* getBuffer() const { @@ -564,13 +641,13 @@ class IOBuffer return m_next; } - void* getItem() const + BurpTaskItem* getItem() const { return m_item; } private: - void* const m_item; + BurpTaskItem* const m_item; Firebird::Array m_memory; UCHAR* m_aligned; const FB_SIZE_T m_size; @@ -590,7 +667,7 @@ class BurpMaster BurpMaster() { m_tdgbl = BurpGlobals::getSpecific(); - m_task = BackupRelationTask::getBackupTask(m_tdgbl); + m_task = BurpTask::getBurpTask(m_tdgbl); if (!m_tdgbl->master) m_tdgbl = m_task->getMasterGbl(); @@ -611,7 +688,7 @@ class BurpMaster } private: - BackupRelationTask* m_task; + BurpTask* m_task; BurpGlobals* m_tdgbl; }; diff --git a/src/burp/burp.h b/src/burp/burp.h index b920b32d097..e980f4e6a5e 100644 --- a/src/burp/burp.h +++ b/src/burp/burp.h @@ -954,6 +954,12 @@ class GblPool } }; +// forward declarations +namespace Burp +{ + class BurpTaskItem; +}; + class BurpGlobals : public Firebird::ThreadData, public GblPool { public: @@ -1205,7 +1211,7 @@ class BurpGlobals : public Firebird::ThreadData, public GblPool Firebird::Array gbl_dpb_data; Firebird::UtilSvc* uSvc; bool master; // set for master thread only - void* taskItem; // current task item, if any + Burp::BurpTaskItem* taskItem; // current task item, if any. ULONG verboseInterval; // How many records should be backed up or restored before we show this message bool flag_on_line; // indicates whether we will bring the database on-line bool firstMap; // this is the first time we entered get_mapping()