From 8499c2d29b082f35ac2eb55f7633e0d4103cefe5 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 7 Oct 2016 15:38:08 +0200 Subject: Avoid using the resource object to remove the data from disk. ...because creating it will potentially start transactions on the database we're about to remove. --- common/genericresource.cpp | 10 ---------- common/genericresource.h | 1 - common/listener.cpp | 5 ++++- common/resource.cpp | 4 ---- common/resource.h | 6 +----- examples/dummyresource/resourcefactory.cpp | 4 ++++ examples/dummyresource/resourcefactory.h | 1 + examples/imapresource/imapresource.cpp | 5 +++++ examples/imapresource/imapresource.h | 1 + examples/maildirresource/maildirresource.cpp | 5 +++++ examples/maildirresource/maildirresource.h | 1 + examples/mailtransportresource/mailtransportresource.cpp | 5 +++++ examples/mailtransportresource/mailtransportresource.h | 1 + 13 files changed, 28 insertions(+), 21 deletions(-) diff --git a/common/genericresource.cpp b/common/genericresource.cpp index f5b1775..ef6edc8 100644 --- a/common/genericresource.cpp +++ b/common/genericresource.cpp @@ -355,16 +355,6 @@ void GenericResource::setupChangereplay(const QSharedPointer &chan enableChangeReplay(true); } -void GenericResource::removeDataFromDisk() -{ - SinkLog() << "Removing the resource from disk: " << mResourceInstanceIdentifier; - //Ensure we have no transaction or databases open - mSynchronizer.clear(); - mChangeReplay.clear(); - mPipeline.clear(); - removeFromDisk(mResourceInstanceIdentifier); -} - void GenericResource::removeFromDisk(const QByteArray &instanceIdentifier) { Sink::Storage(Sink::storageLocation(), instanceIdentifier, Sink::Storage::ReadWrite).removeFromDisk(); diff --git a/common/genericresource.h b/common/genericresource.h index 97132c2..ec43939 100644 --- a/common/genericresource.h +++ b/common/genericresource.h @@ -55,7 +55,6 @@ public: int error() const; - void removeDataFromDisk() Q_DECL_OVERRIDE; static void removeFromDisk(const QByteArray &instanceIdentifier); static qint64 diskUsage(const QByteArray &instanceIdentifier); diff --git a/common/listener.cpp b/common/listener.cpp index db9b21b..1a8f392 100644 --- a/common/listener.cpp +++ b/common/listener.cpp @@ -294,8 +294,11 @@ void Listener::processCommand(int commandId, uint messageId, const QByteArray &c } break; case Sink::Commands::RemoveFromDiskCommand: { SinkLog() << QString("Received a remove from disk command from %1").arg(client.name); + //Close the resource to ensure no transactions are open m_resource.reset(nullptr); - loadResource().removeDataFromDisk(); + if (Sink::ResourceFactory *resourceFactory = Sink::ResourceFactory::load(m_resourceName)) { + resourceFactory->removeDataFromDisk(m_resourceInstanceIdentifier); + } m_exiting = true; } break; default: diff --git a/common/resource.cpp b/common/resource.cpp index 82c9fc8..f4c2ad4 100644 --- a/common/resource.cpp +++ b/common/resource.cpp @@ -61,10 +61,6 @@ void Resource::setLowerBoundRevision(qint64 revision) Q_UNUSED(revision) } -void Resource::removeDataFromDisk() -{ -} - class ResourceFactory::Private { diff --git a/common/resource.h b/common/resource.h index 1c35838..d468aca 100644 --- a/common/resource.h +++ b/common/resource.h @@ -55,11 +55,6 @@ public: */ virtual void setLowerBoundRevision(qint64 revision); - /** - * Remove the data from disk - */ - virtual void removeDataFromDisk(); - signals: void revisionUpdated(qint64); void notify(Notification); @@ -83,6 +78,7 @@ public: virtual Resource *createResource(const QByteArray &instanceIdentifier) = 0; virtual void registerFacades(FacadeFactory &factory) = 0; virtual void registerAdaptorFactories(AdaptorFactoryRegistry ®istry) {}; + virtual void removeDataFromDisk(const QByteArray &instanceIdentifier) = 0; private: class Private; diff --git a/examples/dummyresource/resourcefactory.cpp b/examples/dummyresource/resourcefactory.cpp index 221e20d..6d14721 100644 --- a/examples/dummyresource/resourcefactory.cpp +++ b/examples/dummyresource/resourcefactory.cpp @@ -201,3 +201,7 @@ void DummyResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegistry registry.registerFactory(PLUGIN_NAME); } +void DummyResourceFactory::removeDataFromDisk(const QByteArray &instanceIdentifier) +{ + DummyResource::removeFromDisk(instanceIdentifier); +} diff --git a/examples/dummyresource/resourcefactory.h b/examples/dummyresource/resourcefactory.h index 9192c68..0a29d53 100644 --- a/examples/dummyresource/resourcefactory.h +++ b/examples/dummyresource/resourcefactory.h @@ -51,5 +51,6 @@ public: Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; void registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) Q_DECL_OVERRIDE; + void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; }; diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index aa0fb94..c72579c 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -714,3 +714,8 @@ void ImapResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegistry registry.registerFactory(PLUGIN_NAME); registry.registerFactory(PLUGIN_NAME); } + +void ImapResourceFactory::removeDataFromDisk(const QByteArray &instanceIdentifier) +{ + ImapResource::removeFromDisk(instanceIdentifier); +} diff --git a/examples/imapresource/imapresource.h b/examples/imapresource/imapresource.h index 534a04e..236e695 100644 --- a/examples/imapresource/imapresource.h +++ b/examples/imapresource/imapresource.h @@ -65,5 +65,6 @@ public: Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; void registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) Q_DECL_OVERRIDE; + void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; }; diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp index e69d822..1ed7fc8 100644 --- a/examples/maildirresource/maildirresource.cpp +++ b/examples/maildirresource/maildirresource.cpp @@ -594,3 +594,8 @@ void MaildirResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegist registry.registerFactory(PLUGIN_NAME); } +void MaildirResourceFactory::removeDataFromDisk(const QByteArray &instanceIdentifier) +{ + MaildirResource::removeFromDisk(instanceIdentifier); +} + diff --git a/examples/maildirresource/maildirresource.h b/examples/maildirresource/maildirresource.h index 76aef77..490e1e6 100644 --- a/examples/maildirresource/maildirresource.h +++ b/examples/maildirresource/maildirresource.h @@ -67,5 +67,6 @@ public: Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; void registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) Q_DECL_OVERRIDE; + void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; }; diff --git a/examples/mailtransportresource/mailtransportresource.cpp b/examples/mailtransportresource/mailtransportresource.cpp index be4e4e0..3ce9476 100644 --- a/examples/mailtransportresource/mailtransportresource.cpp +++ b/examples/mailtransportresource/mailtransportresource.cpp @@ -205,3 +205,8 @@ void MailtransportResourceFactory::registerAdaptorFactories(Sink::AdaptorFactory { registry.registerFactory>(PLUGIN_NAME); } + +void MailtransportResourceFactory::removeDataFromDisk(const QByteArray &instanceIdentifier) +{ + MailtransportResource::removeFromDisk(instanceIdentifier); +} diff --git a/examples/mailtransportresource/mailtransportresource.h b/examples/mailtransportresource/mailtransportresource.h index cf6abf2..dcc33df 100644 --- a/examples/mailtransportresource/mailtransportresource.h +++ b/examples/mailtransportresource/mailtransportresource.h @@ -55,5 +55,6 @@ public: Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; void registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) Q_DECL_OVERRIDE; + void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; }; -- cgit v1.2.3