| Commit message (Collapse) | Author | Age |
| |
|
| |
|
|
|
|
|
| |
Otherwise we easily end up copying it and then have an entity that
points into nowhere. Callback -> no copy, no callback -> copy.
|
|
|
|
|
| |
Seems to be happening sometimes, so that needs to be fixed once we find
the cause.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Summary:
Like the title says.
Also removed a "/" that got doubled between the collection URI and the item path, because it made Cyrus freak out (returning unauthorized errors)
Reviewers: cmollekopf
Tags: #sink
Differential Revision: https://phabricator.kde.org/D12755
|
|
|
|
| |
version when creating it
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A single QueryRunner should never have multiple workers running at the
same time. We did not properly enforce this in case of incremental
updates coming in.
The only way I managed to reproduce the crash:
* Open a large folder with lots of unread mail in kube
* Select a mail in the maillist and hold the down button
* This will:
* Repeatedly call fetch more
* Trigger lot's of mark as read modifications that result in
notifications.
* Eventually it crashes somewhere in EntityStore, likely because
of concurrent access of the filter structure which is shared through
the state.
We now ensure in the single threaded portion of the code that we only
ever run one worker at a time. If we did receive an update during,
we remember that change and fetch more once we're done.
To be able to call fetch again that portion was also factored out into a
separate function.
|
|
|
|
|
| |
This cuts into the sync performance by about 40%,
but gives us fast fulltext searching for all local content.
|
| |
|
|
|
|
|
| |
We used to simply return all uids.
Requires "sinksh upgrade"
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Creating the directories is way more expensive than searching through
the files on removal.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
lmdb and sink deal badly with e.g. a string containing a null in the
millde as db name. Thus we try to protect better against it.
This is an actual problem we triggered: https://phabricator.kde.org/T5880
|
| |
|
|
|
|
|
| |
This is where this really belongs, only the indexing is part of storage.
This is necessary so preprocessors can move entities as well.
|
| |
|
| |
|
|
|
|
|
|
|
| |
Having them separated is rather pointless (since we need one for every
type, and all types are the interface of sink, as one), and caused quite
a bit of friction when adding new types. This will also make it easier
to change things for all types.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Dbis can only be opened by one thread and should then
be shared accross all threads after committing the transaction
to create the dbi.
This requires us to initially open all db's, which in turn requires us
to know the correct flags.
This patch stores the flags to open each db in a separate db,
and then opens up all databases on initial start.
If a new database is created that dbi is as well shared as soon as
the transaction is committed (before the dbi is private to the
transaction).
|
|
|
|
|
| |
...we used to accidentally move external blobs after the property was
lost when storing the modificatoin in the queue.
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
| |
It is expected that a query returns nothing if the db is not existing
yet.
|
|
|
|
|
|
| |
This is really part of the storage, and will help us to cleanly
implement features like moving properties into a temporary place when
reading in a clean way as well.
|
|
|
|
|
|
|
|
| |
This allows us to make sure that references are not taken out of
context (the resource).
Because we need to use the type-specific accessors more we also ran into
a problem that we cannot "downcast" a reference with the change
recording still working, for that we have the cast<T>() operator now.
|
| |
|
| |
|
|
|
|
|
|
| |
Not pretty, but that at least allows us to centrally define
the string to type dispatch (It's somehow very hard to do in
C++ without repeating all types over and over in various interfaces).
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|