From b2ad8f785e801a35cadf254d827f56d648be510c Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 22 Dec 2016 18:22:39 +0100 Subject: Introduced Log::Context To have hierarchical debug output we have to pass around something at run-time, there is no reasonable alternative. Log::Context provides the identifier to do just that and largely replaces the debug component idea. --- common/datastorequery.cpp | 16 +++---- common/datastorequery.h | 3 +- common/facade.cpp | 4 +- common/facade.h | 2 +- common/facadeinterface.h | 7 ++- common/log.h | 13 ++++++ common/pipeline.cpp | 2 +- common/queryrunner.cpp | 50 ++++++++++---------- common/queryrunner.h | 5 +- common/resourceaccess.h | 1 - common/resourcefacade.cpp | 43 ++++++++++-------- common/resourcefacade.h | 10 ++-- common/storage/entitystore.cpp | 53 ++++++++++++---------- common/storage/entitystore.h | 4 +- common/store.cpp | 48 +++++++++++--------- common/synchronizer.cpp | 13 +++--- common/synchronizer.h | 1 + common/test.cpp | 2 +- common/typeindex.cpp | 20 ++++---- common/typeindex.h | 4 +- examples/imapresource/imapresource.cpp | 2 +- examples/maildirresource/facade.cpp | 5 -- examples/maildirresource/facade.h | 1 - examples/maildirresource/maildirresource.cpp | 2 +- sinksh/syntax_modules/sink_list.cpp | 1 + tests/clientapitest.cpp | 18 ++++---- .../databasepopulationandfacadequerybenchmark.cpp | 2 +- tests/mailquerybenchmark.cpp | 3 +- 28 files changed, 181 insertions(+), 154 deletions(-) diff --git a/common/datastorequery.cpp b/common/datastorequery.cpp index de2d124..2a2f3f5 100644 --- a/common/datastorequery.cpp +++ b/common/datastorequery.cpp @@ -303,7 +303,7 @@ public: }; DataStoreQuery::DataStoreQuery(const Sink::QueryBase &query, const QByteArray &type, EntityStore &store) - : mQuery(query), mType(type), mStore(store) + : mQuery(query), mType(type), mStore(store), mLogCtx(store.logContext().subContext("datastorequery")) { setupQuery(); } @@ -417,7 +417,7 @@ void DataStoreQuery::setupQuery() for (const auto &k : baseFilters.keys()) { const auto comparator = baseFilters.value(k); if (comparator.value.canConvert()) { - SinkTrace() << "Executing subquery for property: " << k; + SinkTraceCtx(mLogCtx) << "Executing subquery for property: " << k; const auto result = executeSubquery(comparator.value.value()); baseFilters.insert(k, Query::Comparator(QVariant::fromValue(result), Query::Comparator::In)); } @@ -485,20 +485,20 @@ QVector DataStoreQuery::loadIncrementalResultSet(qint64 baseRevision mStore.readRevisions(baseRevision, mType, [&](const QByteArray &key) { changedKeys << key; }); - SinkTrace() << "Finished reading incremental result set:" << *revisionCounter; + SinkTraceCtx(mLogCtx) << "Finished reading incremental result set:" << *revisionCounter; return changedKeys; } ResultSet DataStoreQuery::update(qint64 baseRevision) { - SinkTrace() << "Executing query update"; + SinkTraceCtx(mLogCtx) << "Executing query update"; auto incrementalResultSet = loadIncrementalResultSet(baseRevision); - SinkTrace() << "Changed: " << incrementalResultSet; + SinkTraceCtx(mLogCtx) << "Changed: " << incrementalResultSet; mSource->add(incrementalResultSet); ResultSet::ValueGenerator generator = [this](const ResultSet::Callback &callback) -> bool { if (mCollector->next([this, callback](const ResultSet::Result &result) { - SinkTrace() << "Got incremental result: " << result.entity.identifier() << result.operation; + SinkTraceCtx(mLogCtx) << "Got incremental result: " << result.entity.identifier() << result.operation; callback(result); })) { @@ -512,12 +512,12 @@ ResultSet DataStoreQuery::update(qint64 baseRevision) ResultSet DataStoreQuery::execute() { - SinkTrace() << "Executing query"; + SinkTraceCtx(mLogCtx) << "Executing query"; ResultSet::ValueGenerator generator = [this](const ResultSet::Callback &callback) -> bool { if (mCollector->next([this, callback](const ResultSet::Result &result) { if (result.operation != Sink::Operation_Removal) { - SinkTrace() << "Got initial result: " << result.entity.identifier() << result.operation; + SinkTraceCtx(mLogCtx) << "Got initial result: " << result.entity.identifier() << result.operation; callback(ResultSet::Result{result.entity, Sink::Operation_Creation, result.aggregateValues}); } })) diff --git a/common/datastorequery.h b/common/datastorequery.h index 65503a8..a4c8c18 100644 --- a/common/datastorequery.h +++ b/common/datastorequery.h @@ -58,8 +58,7 @@ private: QSharedPointer mSource; Sink::Storage::EntityStore &mStore; - - SINK_DEBUG_COMPONENT(mType) + Sink::Log::Context mLogCtx; }; diff --git a/common/facade.cpp b/common/facade.cpp index 4f03073..7f2da56 100644 --- a/common/facade.cpp +++ b/common/facade.cpp @@ -102,10 +102,10 @@ KAsync::Job GenericFacade::remove(const DomainType &domainObje } template -QPair, typename ResultEmitter::Ptr> GenericFacade::load(const Sink::Query &query) +QPair, typename ResultEmitter::Ptr> GenericFacade::load(const Sink::Query &query, const Log::Context &ctx) { // The runner lives for the lifetime of the query - auto runner = new QueryRunner(query, mResourceContext, bufferTypeForDomainType()); + auto runner = new QueryRunner(query, mResourceContext, bufferTypeForDomainType(), ctx); runner->setResultTransformation(mResultTransformation); return qMakePair(KAsync::null(), runner->emitter()); } diff --git a/common/facade.h b/common/facade.h index c10886f..2149acd 100644 --- a/common/facade.h +++ b/common/facade.h @@ -66,7 +66,7 @@ public: KAsync::Job move(const DomainType &domainObject, const QByteArray &newResource) Q_DECL_OVERRIDE; KAsync::Job copy(const DomainType &domainObject, const QByteArray &newResource) Q_DECL_OVERRIDE; KAsync::Job remove(const DomainType &domainObject) Q_DECL_OVERRIDE; - virtual QPair, typename ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; + virtual QPair, typename ResultEmitter::Ptr> load(const Sink::Query &query, const Log::Context &) Q_DECL_OVERRIDE; protected: std::function mResultTransformation; diff --git a/common/facadeinterface.h b/common/facadeinterface.h index 5d12360..26a8407 100644 --- a/common/facadeinterface.h +++ b/common/facadeinterface.h @@ -29,6 +29,9 @@ namespace Sink { class Query; +namespace Log { + struct Context; +} /** * Interface for the store facade. @@ -86,7 +89,7 @@ public: /** * Load entities from the store. */ - virtual QPair, typename Sink::ResultEmitter::Ptr> load(const Query &query) = 0; + virtual QPair, typename Sink::ResultEmitter::Ptr> load(const Query &query, const Log::Context &) = 0; }; template @@ -119,7 +122,7 @@ public: return KAsync::error(-1, "Failed to create a facade"); } - QPair, typename Sink::ResultEmitter::Ptr> load(const Query &query) + QPair, typename Sink::ResultEmitter::Ptr> load(const Query &query, const Log::Context &) { return qMakePair(KAsync::null(), typename Sink::ResultEmitter::Ptr()); } diff --git a/common/log.h b/common/log.h index f47a3ae..9063ac8 100644 --- a/common/log.h +++ b/common/log.h @@ -6,6 +6,14 @@ namespace Sink { namespace Log { +struct Context { + Context() = default; + QByteArray name; + Context subContext(const QByteArray &sub) const { + return Context{name + "." + sub}; + } +}; + enum DebugLevel { Trace, @@ -91,6 +99,11 @@ static const char *getComponentName() { return nullptr; } #define SinkWarning() Sink::Log::debugStream(Sink::Log::DebugLevel::Warning, __LINE__, __FILE__, Q_FUNC_INFO, s_sinkDebugArea, getComponentName()) #define SinkError() Sink::Log::debugStream(Sink::Log::DebugLevel::Error, __LINE__, __FILE__, Q_FUNC_INFO, s_sinkDebugArea, getComponentName()) +#define SinkTraceCtx(CTX) Sink::Log::debugStream(Sink::Log::DebugLevel::Trace, __LINE__, __FILE__, Q_FUNC_INFO, CTX.name, getComponentName()) +#define SinkLogCtx(CTX) Sink::Log::debugStream(Sink::Log::DebugLevel::Log, __LINE__, __FILE__, Q_FUNC_INFO, CTX.name, getComponentName()) +#define SinkWarningCtx(CTX) Sink::Log::debugStream(Sink::Log::DebugLevel::Warning, __LINE__, __FILE__, Q_FUNC_INFO, CTX.name, getComponentName()) +#define SinkErrorCtx(CTX) Sink::Log::debugStream(Sink::Log::DebugLevel::Error, __LINE__, __FILE__, Q_FUNC_INFO, CTX.name, getComponentName()) + #define SINK_DEBUG_AREA(AREA) static constexpr const char* s_sinkDebugArea{AREA}; #define SINK_DEBUG_COMPONENT(COMPONENT) const char* getComponentName() const { return COMPONENT; }; #define SINK_DEBUG_COMPONENT_STATIC(COMPONENT) static const char* getComponentName() { return COMPONENT; }; diff --git a/common/pipeline.cpp b/common/pipeline.cpp index 0eb6df5..c9a8092 100644 --- a/common/pipeline.cpp +++ b/common/pipeline.cpp @@ -49,7 +49,7 @@ using namespace Sink::Storage; class Pipeline::Private { public: - Private(const ResourceContext &context) : resourceContext(context), entityStore(context), revisionChanged(false) + Private(const ResourceContext &context) : resourceContext(context), entityStore(context, {"pipeline"}), revisionChanged(false) { } diff --git a/common/queryrunner.cpp b/common/queryrunner.cpp index 377e3b9..ab4d60b 100644 --- a/common/queryrunner.cpp +++ b/common/queryrunner.cpp @@ -47,10 +47,8 @@ template class QueryWorker : public QObject { typedef std::function &aggregateValues)> ResultCallback; - // SINK_DEBUG_COMPONENT(mResourceInstanceIdentifier, mId) - SINK_DEBUG_COMPONENT(mResourceContext.resourceInstanceIdentifier) public: - QueryWorker(const Sink::Query &query, const ResourceContext &context, const QByteArray &bufferType, const QueryRunnerBase::ResultTransformation &transformation); + QueryWorker(const Sink::Query &query, const ResourceContext &context, const QByteArray &bufferType, const QueryRunnerBase::ResultTransformation &transformation, const Sink::Log::Context &logCtx); virtual ~QueryWorker(); ReplayResult executeIncrementalQuery(const Sink::Query &query, Sink::ResultProviderInterface &resultProvider); @@ -61,14 +59,14 @@ private: QueryRunnerBase::ResultTransformation mResultTransformation; ResourceContext mResourceContext; - QByteArray mId; //Used for identification in debug output + Sink::Log::Context mLogCtx; }; template -QueryRunner::QueryRunner(const Sink::Query &query, const Sink::ResourceContext &context, const QByteArray &bufferType) - : QueryRunnerBase(), mResourceContext(context), mResourceAccess(mResourceContext.resourceAccess()), mResultProvider(new ResultProvider), mBatchSize(query.limit()) +QueryRunner::QueryRunner(const Sink::Query &query, const Sink::ResourceContext &context, const QByteArray &bufferType, const Sink::Log::Context &logCtx) + : QueryRunnerBase(), mResourceContext(context), mResourceAccess(mResourceContext.resourceAccess()), mResultProvider(new ResultProvider), mBatchSize(query.limit()), mLogCtx(logCtx.subContext("queryrunner")) { - SinkTrace() << "Starting query. Is live:" << query.liveQuery() << " Limit: " << query.limit(); + SinkTraceCtx(mLogCtx) << "Starting query. Is live:" << query.liveQuery() << " Limit: " << query.limit(); if (query.limit() && query.sortProperty().isEmpty()) { SinkWarning() << "A limited query without sorting is typically a bad idea, because there is no telling what you're going to get."; } @@ -76,10 +74,10 @@ QueryRunner::QueryRunner(const Sink::Query &query, const Sink::Resou // We delegate loading of initial data to the result provider, so it can decide for itself what it needs to load. mResultProvider->setFetcher([=](const typename DomainType::Ptr &parent) { const QByteArray parentId = parent ? parent->identifier() : QByteArray(); - SinkTrace() << "Running fetcher. Offset: " << mOffset[parentId] << " Batchsize: " << mBatchSize; + SinkTraceCtx(mLogCtx) << "Running fetcher. Offset: " << mOffset[parentId] << " Batchsize: " << mBatchSize; auto resultProvider = mResultProvider; if (query.synchronousQuery()) { - QueryWorker worker(query, mResourceContext, bufferType, mResultTransformation); + QueryWorker worker(query, mResourceContext, bufferType, mResultTransformation, mLogCtx); const auto newRevisionAndReplayedEntities = worker.executeInitialQuery(query, parent, *resultProvider, mOffset[parentId], mBatchSize); mOffset[parentId] += newRevisionAndReplayedEntities.replayedEntities; resultProvider->setRevision(newRevisionAndReplayedEntities.newRevision); @@ -89,9 +87,10 @@ QueryRunner::QueryRunner(const Sink::Query &query, const Sink::Resou auto offset = mOffset[parentId]; auto batchSize = mBatchSize; auto resourceContext = mResourceContext; + auto logCtx = mLogCtx; //The lambda will be executed in a separate thread, so copy all arguments - async::run([resultTransformation, offset, batchSize, query, bufferType, resourceContext, resultProvider, parent]() { - QueryWorker worker(query, resourceContext, bufferType, resultTransformation); + async::run([resultTransformation, offset, batchSize, query, bufferType, resourceContext, resultProvider, parent, logCtx]() { + QueryWorker worker(query, resourceContext, bufferType, resultTransformation, logCtx); const auto newRevisionAndReplayedEntities = worker.executeInitialQuery(query, parent, *resultProvider, offset, batchSize); return newRevisionAndReplayedEntities; }) @@ -119,8 +118,9 @@ QueryRunner::QueryRunner(const Sink::Query &query, const Sink::Resou setQuery([=]() -> KAsync::Job { auto resultProvider = mResultProvider; auto resourceContext = mResourceContext; + auto logCtx = mLogCtx; return async::run([=]() { - QueryWorker worker(query, resourceContext, bufferType, mResultTransformation); + QueryWorker worker(query, resourceContext, bufferType, mResultTransformation, logCtx); const auto newRevisionAndReplayedEntities = worker.executeIncrementalQuery(query, *resultProvider); return newRevisionAndReplayedEntities; }) @@ -147,7 +147,7 @@ QueryRunner::QueryRunner(const Sink::Query &query, const Sink::Resou template QueryRunner::~QueryRunner() { - SinkTrace() << "Stopped query"; + SinkTraceCtx(mLogCtx) << "Stopped query"; } template @@ -164,16 +164,16 @@ typename Sink::ResultEmitter::Ptr QueryRunner QueryWorker::QueryWorker(const Sink::Query &query, const Sink::ResourceContext &resourceContext, - const QByteArray &bufferType, const QueryRunnerBase::ResultTransformation &transformation) - : QObject(), mResultTransformation(transformation), mResourceContext(resourceContext), mId(QUuid::createUuid().toByteArray()) + const QByteArray &bufferType, const QueryRunnerBase::ResultTransformation &transformation, const Sink::Log::Context &logCtx) + : QObject(), mResultTransformation(transformation), mResourceContext(resourceContext), mLogCtx(logCtx.subContext("worker")) { - SinkTrace() << "Starting query worker"; + SinkTraceCtx(mLogCtx) << "Starting query worker"; } template QueryWorker::~QueryWorker() { - SinkTrace() << "Stopped query worker"; + SinkTraceCtx(mLogCtx) << "Stopped query worker"; } template @@ -209,15 +209,15 @@ ReplayResult QueryWorker::executeIncrementalQuery(const Sink::Query time.start(); const qint64 baseRevision = resultProvider.revision() + 1; - auto entityStore = EntityStore{mResourceContext}; + auto entityStore = EntityStore{mResourceContext, mLogCtx}; auto preparedQuery = DataStoreQuery{query, ApplicationDomain::getTypeName(), entityStore}; auto resultSet = preparedQuery.update(baseRevision); - SinkTrace() << "Filtered set retrieved. " << Log::TraceTime(time.elapsed()); + SinkTraceCtx(mLogCtx) << "Filtered set retrieved. " << Log::TraceTime(time.elapsed()); auto replayResult = resultSet.replaySet(0, 0, [this, query, &resultProvider](const ResultSet::Result &result) { resultProviderCallback(query, resultProvider, result); }); - SinkTrace() << "Incremental query took: " << Log::TraceTime(time.elapsed()); + SinkTraceCtx(mLogCtx) << "Incremental query took: " << Log::TraceTime(time.elapsed()); return {entityStore.maxRevision(), replayResult.replayedEntities, replayResult.replayedAll}; } @@ -231,24 +231,24 @@ ReplayResult QueryWorker::executeInitialQuery( auto modifiedQuery = query; if (!query.parentProperty().isEmpty()) { if (parent) { - SinkTrace() << "Running initial query for parent:" << parent->identifier(); + SinkTraceCtx(mLogCtx) << "Running initial query for parent:" << parent->identifier(); modifiedQuery.filter(query.parentProperty(), Query::Comparator(QVariant::fromValue(Sink::ApplicationDomain::Reference{parent->identifier()}))); } else { - SinkTrace() << "Running initial query for toplevel"; + SinkTraceCtx(mLogCtx) << "Running initial query for toplevel"; modifiedQuery.filter(query.parentProperty(), Query::Comparator(QVariant{})); } } - auto entityStore = EntityStore{mResourceContext}; + auto entityStore = EntityStore{mResourceContext, mLogCtx}; auto preparedQuery = DataStoreQuery{modifiedQuery, ApplicationDomain::getTypeName(), entityStore}; auto resultSet = preparedQuery.execute(); - SinkTrace() << "Filtered set retrieved. " << Log::TraceTime(time.elapsed()); + SinkTraceCtx(mLogCtx) << "Filtered set retrieved. " << Log::TraceTime(time.elapsed()); auto replayResult = resultSet.replaySet(offset, batchsize, [this, query, &resultProvider](const ResultSet::Result &result) { resultProviderCallback(query, resultProvider, result); }); - SinkTrace() << "Initial query took: " << Log::TraceTime(time.elapsed()); + SinkTraceCtx(mLogCtx) << "Initial query took: " << Log::TraceTime(time.elapsed()); return {entityStore.maxRevision(), replayResult.replayedEntities, replayResult.replayedAll}; } diff --git a/common/queryrunner.h b/common/queryrunner.h index 7e3d688..66dc68f 100644 --- a/common/queryrunner.h +++ b/common/queryrunner.h @@ -53,7 +53,6 @@ protected slots: */ void revisionChanged(qint64 newRevision) { - SinkTrace() << "New revision: " << newRevision; run().exec(); } @@ -82,7 +81,7 @@ template class QueryRunner : public QueryRunnerBase { public: - QueryRunner(const Sink::Query &query, const Sink::ResourceContext &context, const QByteArray &bufferType); + QueryRunner(const Sink::Query &query, const Sink::ResourceContext &context, const QByteArray &bufferType, const Sink::Log::Context &logCtx); virtual ~QueryRunner(); /** @@ -95,11 +94,11 @@ public: private: Sink::ResourceContext mResourceContext; - SINK_DEBUG_COMPONENT(mResourceContext.resourceInstanceIdentifier) QSharedPointer mResourceAccess; QSharedPointer> mResultProvider; ResultTransformation mResultTransformation; QHash mOffset; int mBatchSize; QObject guard; + Sink::Log::Context mLogCtx; }; diff --git a/common/resourceaccess.h b/common/resourceaccess.h index c1b4253..e0e9545 100644 --- a/common/resourceaccess.h +++ b/common/resourceaccess.h @@ -149,7 +149,6 @@ private: class Private; Private *const d; - // SINK_DEBUG_COMPONENT(d->resourceInstanceIdentifier) }; /** diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index 861d37a..1c6b0c8 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp @@ -85,8 +85,8 @@ static bool matchesFilter(const QHash &filter, co } template -LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, const QByteArray &identifier, const QByteArray &typeName, ConfigNotifier &configNotifier) - : mResultProvider(new ResultProvider), mConfigStore(identifier, typeName), mGuard(new QObject) +LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, const QByteArray &identifier, const QByteArray &typeName, ConfigNotifier &configNotifier, const Sink::Log::Context &ctx) + : mResultProvider(new ResultProvider), mConfigStore(identifier, typeName), mGuard(new QObject), mLogCtx(ctx.subContext("config")) { QObject *guard = new QObject; mResultProvider->setFetcher([this, query, guard, &configNotifier](const QSharedPointer &) { @@ -95,7 +95,7 @@ LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, const auto type = entries.value(res); if (query.hasFilter(ApplicationDomain::SinkResource::ResourceType::name) && query.getFilter(ApplicationDomain::SinkResource::ResourceType::name).value.toByteArray() != type) { - SinkTrace() << "Skipping due to type."; + SinkTraceCtx(mLogCtx) << "Skipping due to type."; continue; } if (!query.ids().isEmpty() && !query.ids().contains(res)) { @@ -103,10 +103,10 @@ LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, } auto entity = readFromConfig(mConfigStore, res, type); if (!matchesFilter(query.getBaseFilters(), *entity)){ - SinkTrace() << "Skipping due to filter." << res; + SinkTraceCtx(mLogCtx) << "Skipping due to filter." << res; continue; } - SinkTrace() << "Found match " << res; + SinkTraceCtx(mLogCtx) << "Found match " << res; updateStatus(*entity); mResultProvider->add(entity); } @@ -118,7 +118,7 @@ LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, { auto ret = QObject::connect(&configNotifier, &ConfigNotifier::added, guard, [this](const ApplicationDomain::ApplicationDomainType::Ptr &entry) { auto entity = entry.staticCast(); - SinkTrace() << "A new resource has been added: " << entity->identifier(); + SinkTraceCtx(mLogCtx) << "A new resource has been added: " << entity->identifier(); updateStatus(*entity); mResultProvider->add(entity); }); @@ -165,7 +165,7 @@ void LocalStorageQueryRunner::setStatusUpdater(const std::function void LocalStorageQueryRunner::statusChanged(const QByteArray &identifier) { - SinkTrace() << "Status changed " << identifier; + SinkTraceCtx(mLogCtx) << "Status changed " << identifier; auto entity = readFromConfig(mConfigStore, identifier, ApplicationDomain::getTypeName()); updateStatus(*entity); mResultProvider->modify(entity); @@ -274,9 +274,10 @@ KAsync::Job LocalStorageFacade::remove(const DomainType &domai } template -QPair, typename ResultEmitter::Ptr> LocalStorageFacade::load(const Query &query) +QPair, typename ResultEmitter::Ptr> LocalStorageFacade::load(const Query &query, const Sink::Log::Context &parentCtx) { - auto runner = new LocalStorageQueryRunner(query, mIdentifier, mTypeName, sConfigNotifier); + auto ctx = parentCtx.subContext(ApplicationDomain::getTypeName()); + auto runner = new LocalStorageQueryRunner(query, mIdentifier, mTypeName, sConfigNotifier, ctx); return qMakePair(KAsync::null(), runner->emitter()); } @@ -294,15 +295,16 @@ KAsync::Job ResourceFacade::remove(const Sink::ApplicationDomain::SinkReso return Sink::Store::removeDataFromDisk(identifier).then(LocalStorageFacade::remove(resource)); } -QPair, typename Sink::ResultEmitter::Ptr> ResourceFacade::load(const Sink::Query &query) +QPair, typename Sink::ResultEmitter::Ptr> ResourceFacade::load(const Sink::Query &query, const Sink::Log::Context &parentCtx) { - auto runner = new LocalStorageQueryRunner(query, mIdentifier, mTypeName, sConfigNotifier); + auto ctx = parentCtx.subContext("resource"); + auto runner = new LocalStorageQueryRunner(query, mIdentifier, mTypeName, sConfigNotifier, ctx); auto monitoredResources = QSharedPointer>::create(); - runner->setStatusUpdater([runner, monitoredResources](ApplicationDomain::SinkResource &resource) { + runner->setStatusUpdater([runner, monitoredResources, ctx](ApplicationDomain::SinkResource &resource) { auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource.identifier(), ResourceConfig::getResourceType(resource.identifier())); if (!monitoredResources->contains(resource.identifier())) { - auto ret = QObject::connect(resourceAccess.data(), &ResourceAccess::notification, runner->guard(), [resource, runner, resourceAccess](const Notification ¬ification) { - SinkTrace() << "Received notification in facade: " << notification.type; + auto ret = QObject::connect(resourceAccess.data(), &ResourceAccess::notification, runner->guard(), [resource, runner, resourceAccess, ctx](const Notification ¬ification) { + SinkTraceCtx(ctx) << "Received notification in facade: " << notification.type; if (notification.type == Notification::Status) { runner->statusChanged(resource.identifier()); } @@ -324,22 +326,23 @@ AccountFacade::~AccountFacade() { } -QPair, typename Sink::ResultEmitter::Ptr> AccountFacade::load(const Sink::Query &query) +QPair, typename Sink::ResultEmitter::Ptr> AccountFacade::load(const Sink::Query &query, const Sink::Log::Context &parentCtx) { - auto runner = new LocalStorageQueryRunner(query, mIdentifier, mTypeName, sConfigNotifier); + auto ctx = parentCtx.subContext("accounts"); + auto runner = new LocalStorageQueryRunner(query, mIdentifier, mTypeName, sConfigNotifier, ctx); auto monitoredResources = QSharedPointer>::create(); - runner->setStatusUpdater([runner, monitoredResources](ApplicationDomain::SinkAccount &account) { + runner->setStatusUpdater([runner, monitoredResources, ctx](ApplicationDomain::SinkAccount &account) { Query query; query.filter(account.identifier()); const auto resources = Store::read(query); - SinkTrace() << "Found resource belonging to the account " << account.identifier() << " : " << resources; + SinkTraceCtx(ctx) << "Found resource belonging to the account " << account.identifier() << " : " << resources; auto accountIdentifier = account.identifier(); ApplicationDomain::Status status = ApplicationDomain::ConnectedStatus; for (const auto &resource : resources) { auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource.identifier(), ResourceConfig::getResourceType(resource.identifier())); if (!monitoredResources->contains(resource.identifier())) { - auto ret = QObject::connect(resourceAccess.data(), &ResourceAccess::notification, runner->guard(), [resource, runner, resourceAccess, accountIdentifier](const Notification ¬ification) { - SinkTrace() << "Received notification in facade: " << notification.type; + auto ret = QObject::connect(resourceAccess.data(), &ResourceAccess::notification, runner->guard(), [resource, runner, resourceAccess, accountIdentifier, ctx](const Notification ¬ification) { + SinkTraceCtx(ctx) << "Received notification in facade: " << notification.type; if (notification.type == Notification::Status) { runner->statusChanged(accountIdentifier); } diff --git a/common/resourcefacade.h b/common/resourcefacade.h index 4575e72..509b37a 100644 --- a/common/resourcefacade.h +++ b/common/resourcefacade.h @@ -25,6 +25,7 @@ #include "common/resultprovider.h" #include "common/domain/applicationdomaintype.h" #include "common/configstore.h" +#include "common/log.h" namespace Sink { class Query; @@ -59,7 +60,7 @@ template class LocalStorageQueryRunner { public: - LocalStorageQueryRunner(const Sink::Query &query, const QByteArray &identifier, const QByteArray &typeName, ConfigNotifier &configNotifier); + LocalStorageQueryRunner(const Sink::Query &query, const QByteArray &identifier, const QByteArray &typeName, ConfigNotifier &configNotifier, const Sink::Log::Context &); typename Sink::ResultEmitter::Ptr emitter(); void setStatusUpdater(const std::function &); void statusChanged(const QByteArray &identifier); @@ -71,6 +72,7 @@ private: QSharedPointer> mResultProvider; ConfigStore mConfigStore; std::unique_ptr mGuard; + Sink::Log::Context mLogCtx; }; template @@ -84,7 +86,7 @@ public: virtual KAsync::Job move(const DomainType &resource, const QByteArray &) Q_DECL_OVERRIDE; virtual KAsync::Job copy(const DomainType &resource, const QByteArray &) Q_DECL_OVERRIDE; virtual KAsync::Job remove(const DomainType &resource) Q_DECL_OVERRIDE; - virtual QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; + virtual QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query, const Sink::Log::Context &) Q_DECL_OVERRIDE; protected: QByteArray mIdentifier; @@ -98,7 +100,7 @@ public: ResourceFacade(); virtual ~ResourceFacade(); virtual KAsync::Job remove(const Sink::ApplicationDomain::SinkResource &resource) Q_DECL_OVERRIDE; - virtual QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; + virtual QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query, const Sink::Log::Context &) Q_DECL_OVERRIDE; }; class AccountFacade : public LocalStorageFacade @@ -106,7 +108,7 @@ class AccountFacade : public LocalStorageFacade, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; + virtual QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query, const Sink::Log::Context &) Q_DECL_OVERRIDE; }; class IdentityFacade : public LocalStorageFacade diff --git a/common/storage/entitystore.cpp b/common/storage/entitystore.cpp index 6d48c10..6fc82de 100644 --- a/common/storage/entitystore.cpp +++ b/common/storage/entitystore.cpp @@ -41,11 +41,12 @@ SINK_DEBUG_AREA("entitystore"); class EntityStore::Private { public: - Private(const ResourceContext &context) : resourceContext(context) {} + Private(const ResourceContext &context, const Sink::Log::Context &ctx) : resourceContext(context), logCtx(ctx.subContext("entitystore")) {} ResourceContext resourceContext; DataStore::Transaction transaction; QHash > indexByType; + Sink::Log::Context logCtx; bool exists() { @@ -76,7 +77,7 @@ public: if (indexByType.contains(type)) { return *indexByType.value(type); } - auto index = QSharedPointer::create(type); + auto index = QSharedPointer::create(type, logCtx); TypeHelper{type}.template operator()(*index); indexByType.insert(type, index); return *index; @@ -103,15 +104,15 @@ public: }; -EntityStore::EntityStore(const ResourceContext &context) - : d(new EntityStore::Private{context}) +EntityStore::EntityStore(const ResourceContext &context, const Log::Context &ctx) + : d(new EntityStore::Private{context, ctx}) { } void EntityStore::startTransaction(Sink::Storage::DataStore::AccessMode accessMode) { - SinkTrace() << "Starting transaction"; + SinkTraceCtx(d->logCtx) << "Starting transaction"; Sink::Storage::DataStore store(Sink::storageLocation(), d->resourceContext.instanceId(), accessMode); d->transaction = store.createTransaction(accessMode); Q_ASSERT(d->transaction.validateNamedDatabases()); @@ -119,14 +120,14 @@ void EntityStore::startTransaction(Sink::Storage::DataStore::AccessMode accessMo void EntityStore::commitTransaction() { - SinkTrace() << "Committing transaction"; + SinkTraceCtx(d->logCtx) << "Committing transaction"; d->transaction.commit(); d->transaction = Storage::DataStore::Transaction(); } void EntityStore::abortTransaction() { - SinkTrace() << "Aborting transaction"; + SinkTraceCtx(d->logCtx) << "Aborting transaction"; d->transaction.abort(); d->transaction = Storage::DataStore::Transaction(); } @@ -172,7 +173,7 @@ bool EntityStore::add(const QByteArray &type, const ApplicationDomain::Applicati auto entity = *ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation(entity_, entity_.availableProperties()); entity.setChangedProperties(entity.availableProperties().toSet()); - SinkTrace() << "New entity " << entity; + SinkTraceCtx(d->logCtx) << "New entity " << entity; preprocess(entity); d->typeIndex(type).add(entity.identifier(), entity, d->transaction); @@ -199,7 +200,7 @@ bool EntityStore::add(const QByteArray &type, const ApplicationDomain::Applicati [&](const DataStore::Error &error) { SinkWarning() << "Failed to write entity" << entity.identifier() << newRevision; }); DataStore::setMaxRevision(d->transaction, newRevision); DataStore::recordRevision(d->transaction, newRevision, entity.identifier(), type); - SinkTrace() << "Wrote entity: " << entity.identifier() << type << newRevision; + SinkTraceCtx(d->logCtx) << "Wrote entity: " << entity.identifier() << type << newRevision; return true; } @@ -214,6 +215,8 @@ bool EntityStore::modify(const QByteArray &type, const ApplicationDomain::Applic auto newEntity = *ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation(current, current.availableProperties()); + SinkTraceCtx(d->logCtx) << "Modified entity: " << newEntity; + // Apply diff //SinkTrace() << "Applying changed properties: " << changeset; for (const auto &property : changeset) { @@ -251,8 +254,7 @@ bool EntityStore::modify(const QByteArray &type, const ApplicationDomain::Applic auto metadataBuffer = metadataBuilder.Finish(); FinishMetadataBuffer(metadataFbb, metadataBuffer); } - SinkTrace() << "Modified entity: " << newEntity; - SinkTrace() << "Changed properties: " << changeset + newEntity.changedProperties(); + SinkTraceCtx(d->logCtx) << "Changed properties: " << changeset + newEntity.changedProperties(); newEntity.setChangedProperties(newEntity.availableProperties().toSet()); @@ -264,7 +266,7 @@ bool EntityStore::modify(const QByteArray &type, const ApplicationDomain::Applic [&](const DataStore::Error &error) { SinkWarning() << "Failed to write entity" << newEntity.identifier() << newRevision; }); DataStore::setMaxRevision(d->transaction, newRevision); DataStore::recordRevision(d->transaction, newRevision, newEntity.identifier(), type); - SinkTrace() << "Wrote modified entity: " << newEntity.identifier() << type << newRevision; + SinkTraceCtx(d->logCtx) << "Wrote modified entity: " << newEntity.identifier() << type << newRevision; return true; } @@ -300,7 +302,7 @@ bool EntityStore::remove(const QByteArray &type, const QByteArray &uid, bool rep preprocess(current); d->typeIndex(type).remove(current.identifier(), current, d->transaction); - SinkTrace() << "Removed entity " << current; + SinkTraceCtx(d->logCtx) << "Removed entity " << current; const qint64 newRevision = DataStore::maxRevision(d->transaction) + 1; @@ -328,7 +330,7 @@ void EntityStore::cleanupRevision(qint64 revision) { const auto uid = DataStore::getUidFromRevision(d->transaction, revision); const auto bufferType = DataStore::getTypeFromRevision(d->transaction, revision); - SinkTrace() << "Cleaning up revision " << revision << uid << bufferType; + SinkTraceCtx(d->logCtx) << "Cleaning up revision " << revision << uid << bufferType; DataStore::mainDatabase(d->transaction, bufferType) .scan(uid, [&](const QByteArray &key, const QByteArray &data) -> bool { @@ -369,7 +371,7 @@ bool EntityStore::cleanupRevisions(qint64 revision) const auto firstRevisionToCleanup = lastCleanRevision + 1; bool cleanupIsNecessary = firstRevisionToCleanup <= revision; if (cleanupIsNecessary) { - SinkTrace() << "Cleaning up from " << firstRevisionToCleanup << " to " << revision; + SinkTraceCtx(d->logCtx) << "Cleaning up from " << firstRevisionToCleanup << " to " << revision; for (qint64 rev = firstRevisionToCleanup; rev <= revision; rev++) { cleanupRevision(revision); } @@ -382,9 +384,9 @@ bool EntityStore::cleanupRevisions(qint64 revision) QVector EntityStore::fullScan(const QByteArray &type) { - SinkTrace() << "Looking for : " << type; + SinkTraceCtx(d->logCtx) << "Looking for : " << type; if (!d->exists()) { - SinkTrace() << "Database is not existing: " << type; + SinkTraceCtx(d->logCtx) << "Database is not existing: " << type; return QVector(); } //The scan can return duplicate results if we have multiple revisions, so we use a set to deduplicate. @@ -395,21 +397,21 @@ QVector EntityStore::fullScan(const QByteArray &type) const auto uid = DataStore::uidFromKey(key); if (keys.contains(uid)) { //Not something that should persist if the replay works, so we keep a message for now. - SinkTrace() << "Multiple revisions for key: " << key; + SinkTraceCtx(d->logCtx) << "Multiple revisions for key: " << key; } keys << uid; return true; }, [](const DataStore::Error &error) { SinkWarning() << "Error during query: " << error.message; }); - SinkTrace() << "Full scan retrieved " << keys.size() << " results."; + SinkTraceCtx(d->logCtx) << "Full scan retrieved " << keys.size() << " results."; return keys.toList().toVector(); } QVector EntityStore::indexLookup(const QByteArray &type, const QueryBase &query, QSet &appliedFilters, QByteArray &appliedSorting) { if (!d->exists()) { - SinkTrace() << "Database is not existing: " << type; + SinkTraceCtx(d->logCtx) << "Database is not existing: " << type; return QVector(); } return d->typeIndex(type).query(query, appliedFilters, appliedSorting, d->getTransaction()); @@ -418,7 +420,7 @@ QVector EntityStore::indexLookup(const QByteArray &type, const Query QVector EntityStore::indexLookup(const QByteArray &type, const QByteArray &property, const QVariant &value) { if (!d->exists()) { - SinkTrace() << "Database is not existing: " << type; + SinkTraceCtx(d->logCtx) << "Database is not existing: " << type; return QVector(); } return d->typeIndex(type).lookup(property, value, d->getTransaction()); @@ -427,7 +429,7 @@ QVector EntityStore::indexLookup(const QByteArray &type, const QByte void EntityStore::indexLookup(const QByteArray &type, const QByteArray &property, const QVariant &value, const std::function &callback) { if (!d->exists()) { - SinkTrace() << "Database is not existing: " << type; + SinkTraceCtx(d->logCtx) << "Database is not existing: " << type; return; } auto list = d->typeIndex(type).lookup(property, value, d->getTransaction()); @@ -595,7 +597,7 @@ bool EntityStore::contains(const QByteArray &type, const QByteArray &uid) qint64 EntityStore::maxRevision() { if (!d->exists()) { - SinkTrace() << "Database is not existing."; + SinkTraceCtx(d->logCtx) << "Database is not existing."; return 0; } return DataStore::maxRevision(d->getTransaction()); @@ -623,3 +625,8 @@ qint64 EntityStore::maxRevision() /* } */ /* return transaction; */ /* } */ + +Sink::Log::Context EntityStore::logContext() const +{ + return d->logCtx; +} diff --git a/common/storage/entitystore.h b/common/storage/entitystore.h index c626ebc..b8e1065 100644 --- a/common/storage/entitystore.h +++ b/common/storage/entitystore.h @@ -36,7 +36,7 @@ class SINK_EXPORT EntityStore { public: typedef QSharedPointer Ptr; - EntityStore(const ResourceContext &resourceContext); + EntityStore(const ResourceContext &resourceContext, const Sink::Log::Context &); typedef std::function PreprocessModification; typedef std::function PreprocessCreation; @@ -109,6 +109,8 @@ public: qint64 maxRevision(); + Sink::Log::Context logContext() const; + private: void copyBlobs(ApplicationDomain::ApplicationDomainType &entity, qint64 newRevision); class Private; diff --git a/common/store.cpp b/common/store.cpp index a70be05..8007626 100644 --- a/common/store.cpp +++ b/common/store.cpp @@ -107,20 +107,21 @@ static QMap getResources(const Sink::Query::Filter &quer template -KAsync::Job queryResource(const QByteArray resourceType, const QByteArray &resourceInstanceIdentifier, const Query &query, typename AggregatingResultEmitter::Ptr aggregatingEmitter) +KAsync::Job queryResource(const QByteArray resourceType, const QByteArray &resourceInstanceIdentifier, const Query &query, typename AggregatingResultEmitter::Ptr aggregatingEmitter, const Sink::Log::Context &ctx_) { + auto ctx = ctx_.subContext(resourceInstanceIdentifier); auto facade = FacadeFactory::instance().getFacade(resourceType, resourceInstanceIdentifier); if (facade) { - SinkTrace() << "Trying to fetch from resource " << resourceInstanceIdentifier; - auto result = facade->load(query); + SinkTraceCtx(ctx) << "Trying to fetch from resource " << resourceInstanceIdentifier; + auto result = facade->load(query, ctx); if (result.second) { aggregatingEmitter->addEmitter(result.second); } else { - SinkWarning() << "Null emitter for resource " << resourceInstanceIdentifier; + SinkWarningCtx(ctx) << "Null emitter for resource " << resourceInstanceIdentifier; } return result.first; } else { - SinkTrace() << "Couldn' find a facade for " << resourceInstanceIdentifier; + SinkTraceCtx(ctx) << "Couldn' find a facade for " << resourceInstanceIdentifier; // Ignore the error and carry on return KAsync::null(); } @@ -129,8 +130,9 @@ KAsync::Job queryResource(const QByteArray resourceType, const QByteArray template QSharedPointer Store::loadModel(Query query) { + Log::Context ctx{query.id()}; query.setType(ApplicationDomain::getTypeName()); - SinkTrace() << "Loading model: " << query; + SinkTraceCtx(ctx) << "Loading model: " << query; auto model = QSharedPointer>::create(query, query.requestedProperties); //* Client defines lifetime of model @@ -145,18 +147,19 @@ QSharedPointer Store::loadModel(Query query) model->setEmitter(aggregatingEmitter); if (query.liveQuery() && query.getResourceFilter().ids.isEmpty() && !ApplicationDomain::isGlobalType(ApplicationDomain::getTypeName())) { - SinkTrace() << "Listening for new resources"; + SinkTraceCtx(ctx) << "Listening for new resources"; + auto resourceCtx = ctx.subContext("resourceQuery"); auto facade = FacadeFactory::instance().getFacade(); Q_ASSERT(facade); Sink::Query resourceQuery; query.setFlags(Query::LiveQuery); - auto result = facade->load(resourceQuery); + auto result = facade->load(resourceQuery, resourceCtx); auto emitter = result.second; - emitter->onAdded([query, aggregatingEmitter](const ApplicationDomain::SinkResource::Ptr &resource) { - SinkTrace() << "Found new resources: " << resource->identifier(); + emitter->onAdded([query, aggregatingEmitter, resourceCtx](const ApplicationDomain::SinkResource::Ptr &resource) { + SinkTraceCtx(resourceCtx) << "Found new resources: " << resource->identifier(); const auto resourceType = ResourceConfig::getResourceType(resource->identifier()); Q_ASSERT(!resourceType.isEmpty()); - queryResource(resourceType, resource->identifier(), query, aggregatingEmitter).exec(); + queryResource(resourceType, resource->identifier(), query, aggregatingEmitter, resourceCtx).exec(); }); emitter->onModified([](const ApplicationDomain::SinkResource::Ptr &) { }); @@ -164,8 +167,8 @@ QSharedPointer Store::loadModel(Query query) }); emitter->onInitialResultSetComplete([](const ApplicationDomain::SinkResource::Ptr &, bool) { }); - emitter->onComplete([query, aggregatingEmitter]() { - SinkTrace() << "Resource query complete"; + emitter->onComplete([query, aggregatingEmitter, resourceCtx]() { + SinkTraceCtx(resourceCtx) << "Resource query complete"; }); model->setProperty("resourceEmitter", QVariant::fromValue(emitter)); @@ -173,9 +176,9 @@ QSharedPointer Store::loadModel(Query query) } KAsync::value(resources.keys()) - .template each([query, aggregatingEmitter, resources](const QByteArray &resourceInstanceIdentifier) { + .template each([query, aggregatingEmitter, resources, ctx](const QByteArray &resourceInstanceIdentifier) { const auto resourceType = resources.value(resourceInstanceIdentifier); - return queryResource(resourceType, resourceInstanceIdentifier, query, aggregatingEmitter); + return queryResource(resourceType, resourceInstanceIdentifier, query, aggregatingEmitter, ctx); }) .exec(); model->fetchMore(QModelIndex()); @@ -370,30 +373,31 @@ DomainType Store::readOne(const Sink::Query &query) template QList Store::read(const Sink::Query &q) { + Log::Context ctx{q.id()}; auto query = q; query.setFlags(Query::SynchronousQuery); QList list; auto resources = getResources(query.getResourceFilter(), ApplicationDomain::getTypeName()); auto aggregatingEmitter = AggregatingResultEmitter::Ptr::create(); - aggregatingEmitter->onAdded([&list](const typename DomainType::Ptr &value){ - SinkTrace() << "Found value: " << value->identifier(); + aggregatingEmitter->onAdded([&list, ctx](const typename DomainType::Ptr &value){ + SinkTraceCtx(ctx) << "Found value: " << value->identifier(); list << *value; }); for (const auto &resourceInstanceIdentifier : resources.keys()) { const auto resourceType = resources.value(resourceInstanceIdentifier); - SinkTrace() << "Querying resource: " << resourceType << resourceInstanceIdentifier; + SinkTraceCtx(ctx) << "Querying resource: " << resourceType << resourceInstanceIdentifier; auto facade = FacadeFactory::instance().getFacade(resourceType, resourceInstanceIdentifier); if (facade) { - SinkTrace() << "Trying to fetch from resource " << resourceInstanceIdentifier; - auto result = facade->load(query); + SinkTraceCtx(ctx) << "Trying to fetch from resource " << resourceInstanceIdentifier; + auto result = facade->load(query, ctx); if (result.second) { aggregatingEmitter->addEmitter(result.second); } else { - SinkWarning() << "Null emitter for resource " << resourceInstanceIdentifier; + SinkWarningCtx(ctx) << "Null emitter for resource " << resourceInstanceIdentifier; } result.first.exec(); } else { - SinkTrace() << "Couldn't find a facade for " << resourceInstanceIdentifier; + SinkTraceCtx(ctx) << "Couldn't find a facade for " << resourceInstanceIdentifier; // Ignore the error and carry on } } diff --git a/common/synchronizer.cpp b/common/synchronizer.cpp index d94eb43..ed493dc 100644 --- a/common/synchronizer.cpp +++ b/common/synchronizer.cpp @@ -36,8 +36,9 @@ using namespace Sink; Synchronizer::Synchronizer(const Sink::ResourceContext &context) : ChangeReplay(context), + mLogCtx{"synchronizer"}, mResourceContext(context), - mEntityStore(Storage::EntityStore::Ptr::create(mResourceContext)), + mEntityStore(Storage::EntityStore::Ptr::create(mResourceContext, mLogCtx)), mSyncStorage(Sink::storageLocation(), mResourceContext.instanceId() + ".synchronization", Sink::Storage::DataStore::DataStore::ReadWrite), mSyncInProgress(false) { @@ -170,14 +171,14 @@ void Synchronizer::modifyIfChanged(Storage::EntityStore &store, const QByteArray void Synchronizer::modify(const QByteArray &bufferType, const QByteArray &remoteId, const Sink::ApplicationDomain::ApplicationDomainType &entity) { const auto sinkId = syncStore().resolveRemoteId(bufferType, remoteId); - Storage::EntityStore store(mResourceContext); + Storage::EntityStore store(mResourceContext, mLogCtx); modifyIfChanged(store, bufferType, sinkId, entity); } void Synchronizer::createOrModify(const QByteArray &bufferType, const QByteArray &remoteId, const Sink::ApplicationDomain::ApplicationDomainType &entity) { SinkTrace() << "Create or modify" << bufferType << remoteId; - Storage::EntityStore store(mResourceContext); + Storage::EntityStore store(mResourceContext, mLogCtx); const auto sinkId = syncStore().resolveRemoteId(bufferType, remoteId); const auto found = store.contains(bufferType, sinkId); if (!found) { @@ -194,7 +195,7 @@ void Synchronizer::createOrModify(const QByteArray &bufferType, const QByteArray SinkTrace() << "Create or modify" << bufferType << remoteId; const auto sinkId = syncStore().resolveRemoteId(bufferType, remoteId); - Storage::EntityStore store(mResourceContext); + Storage::EntityStore store(mResourceContext, mLogCtx); const auto found = store.contains(bufferType, sinkId); if (!found) { if (!mergeCriteria.isEmpty()) { @@ -203,7 +204,7 @@ void Synchronizer::createOrModify(const QByteArray &bufferType, const QByteArray query.filter(it.key(), it.value()); } bool merge = false; - Storage::EntityStore store{mResourceContext}; + Storage::EntityStore store{mResourceContext, mLogCtx}; DataStoreQuery dataStoreQuery{query, ApplicationDomain::getTypeName(), store}; auto resultSet = dataStoreQuery.execute(); resultSet.replaySet(0, 1, [this, &merge, bufferType, remoteId](const ResultSet::Result &r) { @@ -232,7 +233,7 @@ QByteArrayList Synchronizer::resolveFilter(const QueryBase::Comparator &filter) result << filter.value.value(); } else if (filter.value.canConvert()) { auto query = filter.value.value(); - Storage::EntityStore store{mResourceContext}; + Storage::EntityStore store{mResourceContext, mLogCtx}; DataStoreQuery dataStoreQuery{query, query.type(), store}; auto resultSet = dataStoreQuery.execute(); resultSet.replaySet(0, 0, [this, &result](const ResultSet::Result &r) { diff --git a/common/synchronizer.h b/common/synchronizer.h index 00b5fba..2c56d6a 100644 --- a/common/synchronizer.h +++ b/common/synchronizer.h @@ -170,6 +170,7 @@ private: void modifyIfChanged(Storage::EntityStore &store, const QByteArray &bufferType, const QByteArray &sinkId, const Sink::ApplicationDomain::ApplicationDomainType &entity); KAsync::Job processSyncQueue(); + Sink::Log::Context mLogCtx; Sink::ResourceContext mResourceContext; Sink::Storage::EntityStore::Ptr mEntityStore; QSharedPointer mSyncStore; diff --git a/common/test.cpp b/common/test.cpp index 71bb972..387fcda 100644 --- a/common/test.cpp +++ b/common/test.cpp @@ -141,7 +141,7 @@ public: // mTestAccount->removeEntity(domainObject); return KAsync::null(); }; - QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE + QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query, const Sink::Log::Context &) Q_DECL_OVERRIDE { auto resultProvider = new Sink::ResultProvider(); resultProvider->onDone([resultProvider]() { diff --git a/common/typeindex.cpp b/common/typeindex.cpp index 9d71463..077bfa1 100644 --- a/common/typeindex.cpp +++ b/common/typeindex.cpp @@ -57,7 +57,7 @@ static QByteArray toSortableByteArray(const QDateTime &date) } -TypeIndex::TypeIndex(const QByteArray &type) : mType(type) +TypeIndex::TypeIndex(const QByteArray &type, const Sink::Log::Context &ctx) : mLogCtx(ctx), mType(type) { } @@ -73,7 +73,7 @@ template <> void TypeIndex::addProperty(const QByteArray &property) { auto indexer = [this, property](const QByteArray &identifier, const QVariant &value, Sink::Storage::DataStore::Transaction &transaction) { - // SinkTrace() << "Indexing " << mType + ".index." + property << value.toByteArray(); + // SinkTraceCtx(mLogCtx) << "Indexing " << mType + ".index." + property << value.toByteArray(); Index(indexName(property), transaction).add(getByteArray(value), identifier); }; mIndexer.insert(property, indexer); @@ -84,7 +84,7 @@ template <> void TypeIndex::addProperty(const QByteArray &property) { auto indexer = [this, property](const QByteArray &identifier, const QVariant &value, Sink::Storage::DataStore::Transaction &transaction) { - // SinkTrace() << "Indexing " << mType + ".index." + property << value.toByteArray(); + // SinkTraceCtx(mLogCtx) << "Indexing " << mType + ".index." + property << value.toByteArray(); Index(indexName(property), transaction).add(getByteArray(value), identifier); }; mIndexer.insert(property, indexer); @@ -95,7 +95,7 @@ template <> void TypeIndex::addProperty(const QByteArray &property) { auto indexer = [this, property](const QByteArray &identifier, const QVariant &value, Sink::Storage::DataStore::Transaction &transaction) { - //SinkTrace() << "Indexing " << mType + ".index." + property << getByteArray(value); + //SinkTraceCtx(mLogCtx) << "Indexing " << mType + ".index." + property << getByteArray(value); Index(indexName(property), transaction).add(getByteArray(value), identifier); }; mIndexer.insert(property, indexer); @@ -182,7 +182,7 @@ QVector TypeIndex::query(const Sink::QueryBase &query, QSet TypeIndex::query(const Sink::QueryBase &query, QSet TypeIndex::lookup(const QByteArray &property, const QVariant &value, Sink::Storage::DataStore::Transaction &transaction) { - SinkTrace() << "Index lookup on property: " << property << mSecondaryProperties.keys() << mProperties; + SinkTraceCtx(mLogCtx) << "Index lookup on property: " << property << mSecondaryProperties.keys() << mProperties; if (mProperties.contains(property)) { QVector keys; Index index(indexName(property), transaction); const auto lookupKey = getByteArray(value); index.lookup( lookupKey, [&, this](const QByteArray &value) { keys << value; }, [property, this](const Index::Error &error) { SinkWarning() << "Error in index: " << error.message << property; }); - SinkTrace() << "Index lookup on " << property << " found " << keys.size() << " keys."; + SinkTraceCtx(mLogCtx) << "Index lookup on " << property << " found " << keys.size() << " keys."; return keys; } else if (mSecondaryProperties.contains(property)) { //Lookups on secondary indexes first lookup the key, and then lookup the results again to resolve to entity id's @@ -220,7 +220,7 @@ QVector TypeIndex::lookup(const QByteArray &property, const QVariant const auto lookupKey = getByteArray(value); index.lookup( lookupKey, [&, this](const QByteArray &value) { secondaryKeys << value; }, [property, this](const Index::Error &error) { SinkWarning() << "Error in index: " << error.message << property; }); - SinkTrace() << "Looked up secondary keys: " << secondaryKeys; + SinkTraceCtx(mLogCtx) << "Looked up secondary keys: " << secondaryKeys; for (const auto &secondary : secondaryKeys) { keys += lookup(resultProperty, secondary, transaction); } diff --git a/common/typeindex.h b/common/typeindex.h index b1aec38..626959e 100644 --- a/common/typeindex.h +++ b/common/typeindex.h @@ -34,7 +34,7 @@ namespace Storage { class TypeIndex { public: - TypeIndex(const QByteArray &type); + TypeIndex(const QByteArray &type, const Sink::Log::Context &); template void addProperty(const QByteArray &property); @@ -93,8 +93,8 @@ public: private: friend class Sink::Storage::EntityStore; QByteArray indexName(const QByteArray &property, const QByteArray &sortProperty = QByteArray()) const; + Sink::Log::Context mLogCtx; QByteArray mType; - SINK_DEBUG_COMPONENT(mType) QByteArrayList mProperties; QMap mSortedProperties; // diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index e16a8d7..7d71136 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -579,7 +579,7 @@ protected: auto mainStore = QSharedPointer::create(Sink::storageLocation(), mResourceContext.instanceId(), Sink::Storage::DataStore::ReadOnly); auto transaction = mainStore->createTransaction(Sink::Storage::DataStore::ReadOnly); - Sink::Storage::EntityStore entityStore(mResourceContext); + Sink::Storage::EntityStore entityStore(mResourceContext, {"imapresource"}); auto syncStore = QSharedPointer::create(synchronizationTransaction); SinkTrace() << "Inspecting " << inspectionType << domainType << entityId << property << expectedValue; diff --git a/examples/maildirresource/facade.cpp b/examples/maildirresource/facade.cpp index d26b86c..13ceaaf 100644 --- a/examples/maildirresource/facade.cpp +++ b/examples/maildirresource/facade.cpp @@ -55,11 +55,6 @@ MaildirResourceMailFacade::~MaildirResourceMailFacade() { } -QPair, Sink::ResultEmitter::Ptr> MaildirResourceMailFacade::load(const Sink::Query &query) -{ - return Sink::GenericFacade::load(query); -} - MaildirResourceFolderFacade::MaildirResourceFolderFacade(const Sink::ResourceContext &context) : Sink::GenericFacade(context) diff --git a/examples/maildirresource/facade.h b/examples/maildirresource/facade.h index fdb693e..6b96fef 100644 --- a/examples/maildirresource/facade.h +++ b/examples/maildirresource/facade.h @@ -26,7 +26,6 @@ class MaildirResourceMailFacade : public Sink::GenericFacade, Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; }; class MaildirResourceFolderFacade : public Sink::GenericFacade diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp index 997ddef..b64e8d3 100644 --- a/examples/maildirresource/maildirresource.cpp +++ b/examples/maildirresource/maildirresource.cpp @@ -454,7 +454,7 @@ protected: auto mainStore = QSharedPointer::create(Sink::storageLocation(), mResourceContext.instanceId(), Sink::Storage::DataStore::ReadOnly); auto transaction = mainStore->createTransaction(Sink::Storage::DataStore::ReadOnly); - Sink::Storage::EntityStore entityStore(mResourceContext); + Sink::Storage::EntityStore entityStore(mResourceContext, {"maildirresource"}); auto syncStore = QSharedPointer::create(synchronizationTransaction); SinkTrace() << "Inspecting " << inspectionType << domainType << entityId << property << expectedValue; diff --git a/sinksh/syntax_modules/sink_list.cpp b/sinksh/syntax_modules/sink_list.cpp index 1e15dd3..dd1498f 100644 --- a/sinksh/syntax_modules/sink_list.cpp +++ b/sinksh/syntax_modules/sink_list.cpp @@ -80,6 +80,7 @@ bool list(const QStringList &args_, State &state) } Sink::Query query; + query.setId("list"); if (options.options.contains("resource")) { query.resourceFilter(baIfAvailable(options.options.value("resource"))); diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index d2fb747..544b981 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -53,28 +53,28 @@ public: { return KAsync::null(); }; - QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE + QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query, const Sink::Log::Context &ctx) Q_DECL_OVERRIDE { auto resultProvider = new Sink::ResultProvider(); - resultProvider->onDone([resultProvider]() { - SinkTrace() << "Result provider is done"; + resultProvider->onDone([resultProvider,ctx]() { + SinkTraceCtx(ctx) << "Result provider is done"; delete resultProvider; }); // We have to do it this way, otherwise we're not setting the fetcher right auto emitter = resultProvider->emitter(); - resultProvider->setFetcher([query, resultProvider, this](const typename T::Ptr &parent) { + resultProvider->setFetcher([query, resultProvider, this, ctx](const typename T::Ptr &parent) { if (parent) { - SinkTrace() << "Running the fetcher " << parent->identifier(); + SinkTraceCtx(ctx) << "Running the fetcher " << parent->identifier(); } else { - SinkTrace() << "Running the fetcher."; + SinkTraceCtx(ctx) << "Running the fetcher."; } - SinkTrace() << "-------------------------."; + SinkTraceCtx(ctx) << "-------------------------."; for (const auto &res : results) { - qDebug() << "Parent filter " << query.getFilter("parent").value.toByteArray() << res->identifier() << res->getProperty("parent").toByteArray(); + SinkTraceCtx(ctx) << "Parent filter " << query.getFilter("parent").value.toByteArray() << res->identifier() << res->getProperty("parent").toByteArray(); auto parentProperty = res->getProperty("parent").toByteArray(); if ((!parent && parentProperty.isEmpty()) || (parent && parentProperty == parent->identifier()) || query.parentProperty().isEmpty()) { - qDebug() << "Found a hit" << res->identifier(); + SinkTraceCtx(ctx) << "Found a hit" << res->identifier(); resultProvider->add(res); } } diff --git a/tests/databasepopulationandfacadequerybenchmark.cpp b/tests/databasepopulationandfacadequerybenchmark.cpp index 6bd2051..48c4738 100644 --- a/tests/databasepopulationandfacadequerybenchmark.cpp +++ b/tests/databasepopulationandfacadequerybenchmark.cpp @@ -106,7 +106,7 @@ class DatabasePopulationAndFacadeQueryBenchmark : public QObject context.mResourceAccess = resourceAccess; TestResourceFacade facade(context); - auto ret = facade.load(query); + auto ret = facade.load(query, Sink::Log::Context{"benchmark"}); ret.first.exec().waitForFinished(); auto emitter = ret.second; QList list; diff --git a/tests/mailquerybenchmark.cpp b/tests/mailquerybenchmark.cpp index d3598b2..e55e744 100644 --- a/tests/mailquerybenchmark.cpp +++ b/tests/mailquerybenchmark.cpp @@ -84,7 +84,6 @@ class MailQueryBenchmark : public QObject { const auto startingRss = getCurrentRSS(); - // Benchmark QTime time; time.start(); @@ -93,7 +92,7 @@ class MailQueryBenchmark : public QObject context.mResourceAccess = QSharedPointer::create(); TestMailResourceFacade facade(context); - auto ret = facade.load(query); + auto ret = facade.load(query, Sink::Log::Context{"benchmark"}); ret.first.exec().waitForFinished(); auto emitter = ret.second; QList list; -- cgit v1.2.3