Fixed regression on recommendation engine

This commit is contained in:
emeric
2020-08-31 14:15:10 +02:00
parent ea317b62ed
commit 8a84a078be
12 changed files with 74 additions and 24 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ find_package(PkgConfig REQUIRED)
find_package(Filesystem REQUIRED) find_package(Filesystem REQUIRED)
find_package(FFMPEGAV REQUIRED) find_package(FFMPEGAV REQUIRED)
find_package(Taglib REQUIRED) find_package(Taglib REQUIRED)
find_package(Boost REQUIRED COMPONENTS system) find_package(Boost REQUIRED COMPONENTS system program_options)
find_package(PStreams REQUIRED) find_package(PStreams REQUIRED)
find_package(PAM) find_package(PAM)
pkg_check_modules(GRAPHICSMAGICKXX REQUIRED GraphicsMagick++) pkg_check_modules(GRAPHICSMAGICKXX REQUIRED GraphicsMagick++)
+7
View File
@@ -43,6 +43,13 @@ Db::Db(const std::filesystem::path& dbPath)
_connectionPool = std::move(connectionPool); _connectionPool = std::move(connectionPool);
} }
Db::~Db()
{
LMS_LOG(DB, DEBUG) << "Optimizing db...";
executeSql("pragma optimize");
LMS_LOG(DB, DEBUG) << "Optimizing db DONE";
}
void void
Db::executeSql(const std::string& sql) Db::executeSql(const std::string& sql)
{ {
@@ -32,6 +32,12 @@ class Db
public: public:
Db(const std::filesystem::path& dbPath); Db(const std::filesystem::path& dbPath);
~Db();
Db(const Db&) = delete;
Db(Db&&) = delete;
Db& operator=(const Db&) = delete;
Db& operator=(Db&&) = delete;
private: private:
friend class Session; friend class Session;
+12 -3
View File
@@ -38,6 +38,12 @@ createEngine(Database::Db& db)
Engine::Engine(Database::Db& db) Engine::Engine(Database::Db& db)
: _dbSession {db} : _dbSession {db}
{ {
start();
}
Engine::~Engine()
{
stop();
} }
void void
@@ -45,9 +51,6 @@ Engine::start()
{ {
assert(!_running); assert(!_running);
_running = true; _running = true;
requestReloadInternal(false);
_ioService.start(); _ioService.start();
} }
@@ -62,6 +65,12 @@ Engine::stop()
_ioService.stop(); _ioService.stop();
} }
void
Engine::requestLoad()
{
requestReloadInternal(false);
}
void void
Engine::requestReload() Engine::requestReload()
{ {
+9 -2
View File
@@ -35,12 +35,19 @@ namespace Recommendation
{ {
public: public:
Engine(Database::Db& db); Engine(Database::Db& db);
~Engine();
Engine(const Engine&) = delete;
Engine(Engine&&) = delete;
Engine& operator=(const Engine&) = delete;
Engine& operator=(Engine&&) = delete;
private: private:
void start() override; void start();
void stop() override; void stop();
void requestLoad() override;
void requestReload() override; void requestReload() override;
Wt::Signal<>& reloaded() override { return _sigReloaded; } Wt::Signal<>& reloaded() override { return _sigReloaded; }
@@ -40,8 +40,7 @@ namespace Recommendation
public: public:
virtual ~IEngine() = default; virtual ~IEngine() = default;
virtual void start() = 0; virtual void requestLoad() = 0;
virtual void stop() = 0;
virtual void requestReload() = 0; virtual void requestReload() = 0;
virtual Wt::Signal<>& reloaded() = 0; virtual Wt::Signal<>& reloaded() = 0;
+2
View File
@@ -254,6 +254,8 @@ MediaScanner::MediaScanner(Database::Db& db)
_ioService.setThreadCount(1); _ioService.setThreadCount(1);
refreshScanSettings(); refreshScanSettings();
start();
} }
MediaScanner::~MediaScanner() MediaScanner::~MediaScanner()
+3 -2
View File
@@ -50,8 +50,6 @@ class MediaScanner : public IMediaScanner
MediaScanner& operator=(const MediaScanner&) = delete; MediaScanner& operator=(const MediaScanner&) = delete;
MediaScanner& operator=(MediaScanner&&) = delete; MediaScanner& operator=(MediaScanner&&) = delete;
void start() override;
void stop() override;
void requestReload() override; void requestReload() override;
void requestImmediateScan(bool force) override; void requestImmediateScan(bool force) override;
@@ -64,6 +62,9 @@ class MediaScanner : public IMediaScanner
private: private:
void start();
void stop();
// Job handling // Job handling
void scheduleNextScan(); void scheduleNextScan();
void scheduleScan(bool force, const Wt::WDateTime& dateTime = {}); void scheduleScan(bool force, const Wt::WDateTime& dateTime = {});
@@ -38,14 +38,10 @@ class IMediaScanner
public: public:
virtual ~IMediaScanner() = default; virtual ~IMediaScanner() = default;
virtual void start() = 0;
virtual void stop() = 0;
// Async requests // Async requests
virtual void requestReload() = 0; virtual void requestReload() = 0;
virtual void requestImmediateScan(bool force) = 0; virtual void requestImmediateScan(bool force) = 0;
enum class State enum class State
{ {
NotScheduled, NotScheduled,
+1
View File
@@ -171,6 +171,7 @@ int main(int argc, char* argv[])
Service<CoverArt::IGrabber> coverArtService {CoverArt::createGrabber(argv[0])}; Service<CoverArt::IGrabber> coverArtService {CoverArt::createGrabber(argv[0])};
coverArtService->setDefaultCover(server.appRoot() + "/images/unknown-cover.jpg"); coverArtService->setDefaultCover(server.appRoot() + "/images/unknown-cover.jpg");
Service<Recommendation::IEngine> recommendationEngineService {Recommendation::createEngine(database)}; Service<Recommendation::IEngine> recommendationEngineService {Recommendation::createEngine(database)};
recommendationEngineService->requestLoad();
Service<Scanner::IMediaScanner> mediaScannerService {Scanner::createMediaScanner(database)}; Service<Scanner::IMediaScanner> mediaScannerService {Scanner::createMediaScanner(database)};
mediaScannerService->scanComplete().connect([&]() mediaScannerService->scanComplete().connect([&]()
+1
View File
@@ -6,6 +6,7 @@ add_executable(lms-recommendation
target_link_libraries(lms-recommendation PRIVATE target_link_libraries(lms-recommendation PRIVATE
lmsdatabase lmsdatabase
lmsrecommendation lmsrecommendation
Boost::program_options
) )
install(TARGETS lms-recommendation DESTINATION bin) install(TARGETS lms-recommendation DESTINATION bin)
+29 -8
View File
@@ -22,6 +22,8 @@
#include <stdexcept> #include <stdexcept>
#include <stdlib.h> #include <stdlib.h>
#include <boost/program_options.hpp>
#include "database/Artist.hpp" #include "database/Artist.hpp"
#include "database/Cluster.hpp" #include "database/Cluster.hpp"
#include "database/Db.hpp" #include "database/Db.hpp"
@@ -130,14 +132,30 @@ int main(int argc, char *argv[])
{ {
try try
{ {
namespace po = boost::program_options;
// log to stdout // log to stdout
Service<Logger> logger {std::make_unique<StreamLogger>(std::cout)}; Service<Logger> logger {std::make_unique<StreamLogger>(std::cout)};
std::filesystem::path configFilePath {"/etc/lms.conf"}; po::options_description desc{"Allowed options"};
if (argc >= 2) desc.add_options()
configFilePath = std::string(argv[1], 0, 256); ("help,h", "print usage message")
("conf,c", po::value<std::string>()->default_value("/etc/lms.conf"), "LMS config file")
("artists,a", "Display recommendation for artists")
("releases,r", "Display recommendation for releases")
("tracks,t", "Display recommendation for tracks")
;
Service<IConfig> config {createConfig(configFilePath)}; po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
if (vm.count("help"))
{
std::cout << desc << std::endl;
return EXIT_SUCCESS;
}
Service<IConfig> config {createConfig(vm["conf"].as<std::string>())};
Database::Db db {config->getPath("working-dir") / "lms.db"}; Database::Db db {config->getPath("working-dir") / "lms.db"};
Database::Session session {db}; Database::Session session {db};
@@ -153,17 +171,20 @@ int main(int argc, char *argv[])
sem.notify(); sem.notify();
}); });
engine->start(); engine->requestLoad();
std::cout << "Waiting for the recommendation engine to be loaded..." << std::endl; std::cout << "Waiting for the recommendation engine to be loaded..." << std::endl;
sem.wait(); sem.wait();
std::cout << "Recommendation engine loaded!" << std::endl; std::cout << "Recommendation engine loaded!" << std::endl;
if (vm.count("tracks"))
dumpTracksRecommendation(db, *engine); dumpTracksRecommendation(db, *engine);
dumpReleasesRecommendation(db, *engine);
dumpArtistsRecommendation(db, *engine);
engine->stop(); if (vm.count("releases"))
dumpReleasesRecommendation(db, *engine);
if (vm.count("artists"))
dumpArtistsRecommendation(db, *engine);
} }
catch( std::exception& e) catch( std::exception& e)
{ {