1#pragma once
2
3#include <thread>
4#include <functional>
5#include <Common/MultiVersion.h>
6#include <Common/ThreadPool.h>
7#include <Poco/Event.h>
8
9
10namespace Poco { class Logger; namespace Util { class AbstractConfiguration; } }
11
12class RegionsHierarchies;
13class RegionsNames;
14class GeoDictionariesLoader;
15
16
17namespace DB
18{
19
20class Context;
21
22
23/// Metrica's Dictionaries which can be used in functions.
24
25class EmbeddedDictionaries
26{
27private:
28 Poco::Logger * log;
29 Context & context;
30
31 MultiVersion<RegionsHierarchies> regions_hierarchies;
32 MultiVersion<RegionsNames> regions_names;
33
34 std::unique_ptr<GeoDictionariesLoader> geo_dictionaries_loader;
35
36 /// Directories' updating periodicity (in seconds).
37 int reload_period;
38 int cur_reload_period = 1;
39 bool is_fast_start_stage = true;
40
41 mutable std::mutex mutex;
42
43 ThreadFromGlobalPool reloading_thread;
44 Poco::Event destroy;
45
46
47 void handleException(const bool throw_on_error) const;
48
49 /** Updates directories (dictionaries) every reload_period seconds.
50 * If all dictionaries are not loaded at least once, try reload them with exponential delay (1, 2, ... reload_period).
51 * If all dictionaries are loaded, update them using constant reload_period delay.
52 */
53 void reloadPeriodically();
54
55 /// Updates dictionaries.
56 bool reloadImpl(const bool throw_on_error, const bool force_reload = false);
57
58 template <typename Dictionary>
59 using DictionaryReloader = std::function<std::unique_ptr<Dictionary>(const Poco::Util::AbstractConfiguration & config)>;
60
61 template <typename Dictionary>
62 bool reloadDictionary(
63 MultiVersion<Dictionary> & dictionary,
64 DictionaryReloader<Dictionary> reload_dictionary,
65 const bool throw_on_error,
66 const bool force_reload);
67
68public:
69 /// Every reload_period seconds directories are updated inside a separate thread.
70 EmbeddedDictionaries(
71 std::unique_ptr<GeoDictionariesLoader> geo_dictionaries_loader,
72 Context & context,
73 const bool throw_on_error);
74
75 /// Forcibly reloads all dictionaries.
76 void reload();
77
78 ~EmbeddedDictionaries();
79
80
81 MultiVersion<RegionsHierarchies>::Version getRegionsHierarchies() const
82 {
83 return regions_hierarchies.get();
84 }
85
86 MultiVersion<RegionsNames>::Version getRegionsNames() const
87 {
88 return regions_names.get();
89 }
90};
91
92}
93