mirror of https://github.com/djcb/mu.git
indexer/store: avoid completed callback
This cause havoc / race conditions.
This commit is contained in:
parent
c3778cd467
commit
9af9d0fa94
|
@ -43,7 +43,8 @@ struct IndexState {
|
||||||
enum State { Idle,
|
enum State { Idle,
|
||||||
Scanning,
|
Scanning,
|
||||||
Finishing,
|
Finishing,
|
||||||
Cleaning };
|
Cleaning
|
||||||
|
};
|
||||||
static const char* name(State s) {
|
static const char* name(State s) {
|
||||||
switch (s) {
|
switch (s) {
|
||||||
case Idle:
|
case Idle:
|
||||||
|
@ -65,7 +66,6 @@ struct IndexState {
|
||||||
bool operator!=(State rhs) const {
|
bool operator!=(State rhs) const {
|
||||||
return state_.load() != rhs;
|
return state_.load() != rhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void change_to(State new_state) {
|
void change_to(State new_state) {
|
||||||
g_debug("changing indexer state %s->%s", name((State)state_),
|
g_debug("changing indexer state %s->%s", name((State)state_),
|
||||||
name((State)new_state));
|
name((State)new_state));
|
||||||
|
@ -128,6 +128,8 @@ struct Indexer::Private {
|
||||||
Progress progress_;
|
Progress progress_;
|
||||||
IndexState state_;
|
IndexState state_;
|
||||||
std::mutex lock_, w_lock_;
|
std::mutex lock_, w_lock_;
|
||||||
|
|
||||||
|
std::atomic<time_t> completed_;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -339,7 +341,7 @@ Indexer::Private::scan_worker()
|
||||||
g_debug("cleanup finished");
|
g_debug("cleanup finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
store_.index_complete();
|
completed_ = ::time({});
|
||||||
state_.change_to(IndexState::Idle);
|
state_.change_to(IndexState::Idle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,7 +382,6 @@ Indexer::Private::stop()
|
||||||
if (scanner_worker_.joinable())
|
if (scanner_worker_.joinable())
|
||||||
scanner_worker_.join();
|
scanner_worker_.join();
|
||||||
|
|
||||||
store_.index_complete();
|
|
||||||
state_.change_to(IndexState::Idle);
|
state_.change_to(IndexState::Idle);
|
||||||
for (auto&& w : workers_)
|
for (auto&& w : workers_)
|
||||||
if (w.joinable())
|
if (w.joinable())
|
||||||
|
@ -392,8 +393,7 @@ Indexer::Private::stop()
|
||||||
|
|
||||||
Indexer::Indexer(Store& store)
|
Indexer::Indexer(Store& store)
|
||||||
: priv_{std::make_unique<Private>(store)}
|
: priv_{std::make_unique<Private>(store)}
|
||||||
{
|
{}
|
||||||
}
|
|
||||||
|
|
||||||
Indexer::~Indexer() = default;
|
Indexer::~Indexer() = default;
|
||||||
|
|
||||||
|
@ -438,3 +438,9 @@ Indexer::progress() const
|
||||||
|
|
||||||
return priv_->progress_;
|
return priv_->progress_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
time_t
|
||||||
|
Indexer::completed() const
|
||||||
|
{
|
||||||
|
return priv_->completed_;
|
||||||
|
}
|
||||||
|
|
|
@ -110,6 +110,13 @@ public:
|
||||||
*/
|
*/
|
||||||
const Progress& progress() const;
|
const Progress& progress() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last time indexing was completed.
|
||||||
|
*
|
||||||
|
* @return the time or 0
|
||||||
|
*/
|
||||||
|
time_t completed() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Private;
|
struct Private;
|
||||||
std::unique_ptr<Private> priv_;
|
std::unique_ptr<Private> priv_;
|
||||||
|
|
|
@ -103,8 +103,6 @@ struct Store::Private {
|
||||||
|
|
||||||
~Private() try {
|
~Private() try {
|
||||||
|
|
||||||
indexer_.reset(); // reset so it cannot call us back
|
|
||||||
|
|
||||||
g_debug("closing store @ %s", properties_.database_path.c_str());
|
g_debug("closing store @ %s", properties_.database_path.c_str());
|
||||||
if (!read_only_) {
|
if (!read_only_) {
|
||||||
transaction_maybe_commit(true /*force*/);
|
transaction_maybe_commit(true /*force*/);
|
||||||
|
@ -173,6 +171,13 @@ struct Store::Private {
|
||||||
contacts_cache_.serialize());
|
contacts_cache_.serialize());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (indexer_) { // save last index time.
|
||||||
|
if (auto&& t{indexer_->completed()}; t != 0)
|
||||||
|
writable_db().set_metadata(
|
||||||
|
IndexedKey, tstamp_to_string(t));
|
||||||
|
}
|
||||||
|
|
||||||
if (transaction_size_ == 0)
|
if (transaction_size_ == 0)
|
||||||
return; // nothing more to do here.
|
return; // nothing more to do here.
|
||||||
|
|
||||||
|
@ -642,16 +647,6 @@ Store::commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
Store::index_complete()
|
|
||||||
{
|
|
||||||
std::lock_guard lock{priv_->lock_};
|
|
||||||
|
|
||||||
g_debug("marking index complete");
|
|
||||||
priv_->writable_db().set_metadata(IndexedKey, tstamp_to_string(::time({})));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
std::size_t
|
std::size_t
|
||||||
Store::for_each_term(Field::Id field_id, Store::ForEachTermFunc func) const
|
Store::for_each_term(Field::Id field_id, Store::ForEachTermFunc func) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -456,12 +456,6 @@ private:
|
||||||
const Config& conf);
|
const Config& conf);
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call with indexing has completed to update metadata.
|
|
||||||
*/
|
|
||||||
friend class Indexer;
|
|
||||||
void index_complete();
|
|
||||||
|
|
||||||
std::unique_ptr<Private> priv_;
|
std::unique_ptr<Private> priv_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue