summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-03-18 19:38:40 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-03-18 19:38:40 +0100
commit6fe54c0932d685b63c1f9cc76611ae2aa2fb42ae (patch)
treede5a3c554fc721362c9d9aa2e3ede7d508dbaac6
parent5c542cfe9ea325ea730a3239ed7994f14ab5511b (diff)
downloadsink-6fe54c0932d685b63c1f9cc76611ae2aa2fb42ae.tar.gz
sink-6fe54c0932d685b63c1f9cc76611ae2aa2fb42ae.zip
Revived mailquerybenchmark to show how slow reduction queries are.
-rw-r--r--tests/mailquerybenchmark.cpp67
1 files changed, 41 insertions, 26 deletions
diff --git a/tests/mailquerybenchmark.cpp b/tests/mailquerybenchmark.cpp
index d68151a..022d21d 100644
--- a/tests/mailquerybenchmark.cpp
+++ b/tests/mailquerybenchmark.cpp
@@ -23,16 +23,10 @@
23 23
24#include "testimplementations.h" 24#include "testimplementations.h"
25 25
26#include <common/facade.h>
27#include <common/domainadaptor.h>
28#include <common/resultprovider.h> 26#include <common/resultprovider.h>
29#include <common/synclistresult.h>
30#include <common/definitions.h> 27#include <common/definitions.h>
31#include <common/query.h> 28#include <common/query.h>
32#include <common/store.h> 29#include <common/storage/entitystore.h>
33#include <common/pipeline.h>
34#include <common/index.h>
35#include <common/adaptorfactoryregistry.h>
36 30
37#include "hawd/dataset.h" 31#include "hawd/dataset.h"
38#include "hawd/formatter.h" 32#include "hawd/formatter.h"
@@ -57,30 +51,34 @@ class MailQueryBenchmark : public QObject
57 QByteArray resourceIdentifier; 51 QByteArray resourceIdentifier;
58 HAWD::State mHawdState; 52 HAWD::State mHawdState;
59 53
60 void populateDatabase(int count) 54 void populateDatabase(int count, int folderSpreadFactor = 0)
61 { 55 {
62 TestResource::removeFromDisk(resourceIdentifier); 56 TestResource::removeFromDisk(resourceIdentifier);
63 57
64 auto pipeline = QSharedPointer<Sink::Pipeline>::create(Sink::ResourceContext{resourceIdentifier, "test"}, "test"); 58 Sink::ResourceContext resourceContext{resourceIdentifier, "test", {{"mail", QSharedPointer<TestMailAdaptorFactory>::create()}}};
59 Sink::Storage::EntityStore entityStore{resourceContext, {}};
60 entityStore.startTransaction(Sink::Storage::DataStore::ReadWrite);
65 61
66 auto domainTypeAdaptorFactory = QSharedPointer<TestMailAdaptorFactory>::create();
67
68 pipeline->startTransaction();
69 const auto date = QDateTime::currentDateTimeUtc(); 62 const auto date = QDateTime::currentDateTimeUtc();
70 for (int i = 0; i < count; i++) { 63 for (int i = 0; i < count; i++) {
71 auto domainObject = Mail::Ptr::create(); 64 auto domainObject = Mail::createEntity<Mail>(resourceIdentifier);
72 domainObject->setExtractedMessageId("uid"); 65 domainObject.setExtractedMessageId("uid");
73 domainObject->setExtractedSubject(QString("subject%1").arg(i)); 66 domainObject.setExtractedParentMessageId("parentuid");
74 domainObject->setExtractedDate(date.addSecs(count)); 67 domainObject.setExtractedSubject(QString("subject%1").arg(i));
75 domainObject->setFolder("folder1"); 68 domainObject.setExtractedDate(date.addSecs(count));
76 // domainObject->setAttachment(attachment); 69 if (folderSpreadFactor == 0) {
77 const auto command = createCommand<Mail>(*domainObject, *domainTypeAdaptorFactory); 70 domainObject.setFolder("folder1");
78 pipeline->newEntity(command.data(), command.size()); 71 } else {
72 domainObject.setFolder(QByteArray("folder") + QByteArray::number(i % folderSpreadFactor));
73 }
74
75 entityStore.add("mail", domainObject, false, [] (const Mail &) {});
79 } 76 }
80 pipeline->commit(); 77
78 entityStore.commitTransaction();
81 } 79 }
82 80
83 void testLoad(const Sink::Query &query, int count) 81 void testLoad(const Sink::Query &query, int count, int expectedSize)
84 { 82 {
85 const auto startingRss = getCurrentRSS(); 83 const auto startingRss = getCurrentRSS();
86 84
@@ -88,7 +86,10 @@ class MailQueryBenchmark : public QObject
88 QTime time; 86 QTime time;
89 time.start(); 87 time.start();
90 auto resultSet = QSharedPointer<Sink::ResultProvider<Mail::Ptr>>::create(); 88 auto resultSet = QSharedPointer<Sink::ResultProvider<Mail::Ptr>>::create();
91 Sink::ResourceContext context{resourceIdentifier, "test"}; 89
90 //FIXME why do we need this here?
91 auto domainTypeAdaptorFactory = QSharedPointer<TestMailAdaptorFactory>::create();
92 Sink::ResourceContext context{resourceIdentifier, "test", {{"mail", domainTypeAdaptorFactory}}};
92 context.mResourceAccess = QSharedPointer<TestResourceAccess>::create(); 93 context.mResourceAccess = QSharedPointer<TestResourceAccess>::create();
93 TestMailResourceFacade facade(context); 94 TestMailResourceFacade facade(context);
94 95
@@ -101,7 +102,7 @@ class MailQueryBenchmark : public QObject
101 emitter->onInitialResultSetComplete([&done](const Mail::Ptr &mail, bool) { done = true; }); 102 emitter->onInitialResultSetComplete([&done](const Mail::Ptr &mail, bool) { done = true; });
102 emitter->fetch(Mail::Ptr()); 103 emitter->fetch(Mail::Ptr());
103 QTRY_VERIFY(done); 104 QTRY_VERIFY(done);
104 QCOMPARE(list.size(), query.limit()); 105 QCOMPARE(list.size(), expectedSize);
105 106
106 const auto elapsed = time.elapsed(); 107 const auto elapsed = time.elapsed();
107 108
@@ -145,7 +146,6 @@ private slots:
145 void init() 146 void init()
146 { 147 {
147 resourceIdentifier = "sink.test.instance1"; 148 resourceIdentifier = "sink.test.instance1";
148 Sink::AdaptorFactoryRegistry::instance().registerFactory<Mail, TestMailAdaptorFactory>("test");
149 } 149 }
150 150
151 void test50k() 151 void test50k()
@@ -159,7 +159,22 @@ private slots:
159 query.limit(1000); 159 query.limit(1000);
160 160
161 populateDatabase(50000); 161 populateDatabase(50000);
162 testLoad(query, 50000); 162 testLoad(query, 50000, query.limit());
163 }
164
165 void test50kThreadleader()
166 {
167 Sink::Query query;
168 query.request<Mail::MessageId>()
169 .request<Mail::Subject>()
170 .request<Mail::Date>();
171 // query.filter<ApplicationDomain::Mail::Trash>(false);
172 query.reduce<ApplicationDomain::Mail::Folder>(Query::Reduce::Selector::max<ApplicationDomain::Mail::Date>());
173 query.limit(1000);
174
175 int mailsPerFolder = 100;
176 populateDatabase(50000, mailsPerFolder);
177 testLoad(query, 50000, mailsPerFolder);
163 } 178 }
164}; 179};
165 180