summaryrefslogtreecommitdiff
path: root/src/tangara/database/database.hpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-08-09 11:43:48 +1000
committerjacqueline <me@jacqueline.id.au>2024-08-12 13:20:08 +1000
commit2ad83cb2108dc55c9eb0573b0645513a1e8a61f5 (patch)
tree5a4c588763bb36497c90d3f51660ca6400d5c364 /src/tangara/database/database.hpp
parent28cf749951a8f811606bb233efecfd36738c3c89 (diff)
downloadtangara-fw-2ad83cb2108dc55c9eb0573b0645513a1e8a61f5.tar.gz
Shard searching for new tracks across multiple tasks
This also has the effect of breaking up the enormous 'updateIndexes' method into one call per file, which means database updates also no longer monopolise a single background task for their entire duration. avg. time per new file is now <140ms for a completely fresh database, which is pretty good i think!
Diffstat (limited to 'src/tangara/database/database.hpp')
-rw-r--r--src/tangara/database/database.hpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/tangara/database/database.hpp b/src/tangara/database/database.hpp
index 6994d0b8..6daffd23 100644
--- a/src/tangara/database/database.hpp
+++ b/src/tangara/database/database.hpp
@@ -23,6 +23,8 @@
#include "database/records.hpp"
#include "database/tag_parser.hpp"
#include "database/track.hpp"
+#include "database/track_finder.hpp"
+#include "ff.h"
#include "leveldb/cache.h"
#include "leveldb/db.h"
#include "leveldb/iterator.h"
@@ -93,22 +95,48 @@ class Database {
leveldb::DB* db_;
leveldb::Cache* cache_;
+ TrackFinder track_finder_;
+
// Not owned.
ITagParser& tag_parser_;
locale::ICollator& collator_;
+ /* Internal utility for tracking a currently in-progress index update. */
+ class UpdateTracker {
+ public:
+ UpdateTracker();
+ ~UpdateTracker();
+
+ auto onTrackVerified() -> void;
+ auto onVerificationFinished() -> void;
+ auto onTrackAdded() -> void;
+
+ private:
+ uint32_t num_old_tracks_;
+ uint32_t num_new_tracks_;
+ uint64_t start_time_;
+ uint64_t verification_finish_time_;
+ };
+
std::atomic<bool> is_updating_;
+ std::unique_ptr<UpdateTracker> update_tracker_;
+
std::atomic<TrackId> next_track_id_;
Database(leveldb::DB* db,
leveldb::Cache* cache,
+ tasks::WorkerPool& pool,
ITagParser& tag_parser,
locale::ICollator& collator);
+ auto processCandidateCallback(FILINFO&, std::string_view) -> void;
+ auto indexingCompleteCallback() -> void;
+
auto dbCalculateNextTrackId() -> void;
auto dbMintNewTrackId() -> TrackId;
- auto dbGetTrackData(TrackId id) -> std::shared_ptr<TrackData>;
+ auto dbGetTrackData(leveldb::ReadOptions, TrackId id)
+ -> std::shared_ptr<TrackData>;
auto dbCreateIndexesForTrack(const Track&, leveldb::WriteBatch&) -> void;
auto dbCreateIndexesForTrack(const TrackData&,