@@ -9,11 +9,6 @@ namespace CurrentMetrics
99namespace DB
1010{
1111
12- namespace ErrorCodes
13- {
14- extern const int LOGICAL_ERROR;
15- }
16-
1712RefreshSet::Handle::Handle (Handle && other) noexcept
1813{
1914 *this = std::move (other);
@@ -27,6 +22,7 @@ RefreshSet::Handle & RefreshSet::Handle::operator=(Handle && other) noexcept
2722 parent_set = std::exchange (other.parent_set , nullptr );
2823 id = std::move (other.id );
2924 dependencies = std::move (other.dependencies );
25+ iter = std::move (other.iter );
3026 metric_increment = std::move (other.metric_increment );
3127 return *this ;
3228}
@@ -39,21 +35,21 @@ RefreshSet::Handle::~Handle()
3935void RefreshSet::Handle::rename (StorageID new_id)
4036{
4137 std::lock_guard lock (parent_set->mutex );
42- parent_set->removeDependenciesLocked (id, dependencies);
43- auto it = parent_set->tasks .find (id);
44- auto task = it->second ;
45- parent_set->tasks .erase (it);
38+ RefreshTaskHolder task = *iter;
39+ parent_set->removeDependenciesLocked (task, dependencies);
40+ parent_set->removeTaskLocked (id, iter);
4641 id = new_id;
47- parent_set->tasks . emplace (id, task);
48- parent_set->addDependenciesLocked (id , dependencies);
42+ iter = parent_set->addTaskLocked (id, task);
43+ parent_set->addDependenciesLocked (task , dependencies);
4944}
5045
5146void RefreshSet::Handle::changeDependencies (std::vector<StorageID> deps)
5247{
5348 std::lock_guard lock (parent_set->mutex );
54- parent_set->removeDependenciesLocked (id, dependencies);
49+ RefreshTaskHolder task = *iter;
50+ parent_set->removeDependenciesLocked (task, dependencies);
5551 dependencies = std::move (deps);
56- parent_set->addDependenciesLocked (id , dependencies);
52+ parent_set->addDependenciesLocked (task , dependencies);
5753}
5854
5955void RefreshSet::Handle::reset ()
@@ -63,8 +59,8 @@ void RefreshSet::Handle::reset()
6359
6460 {
6561 std::lock_guard lock (parent_set->mutex );
66- parent_set->removeDependenciesLocked (id , dependencies);
67- parent_set->tasks . erase (id);
62+ parent_set->removeDependenciesLocked (*iter , dependencies);
63+ parent_set->removeTaskLocked (id, iter );
6864 }
6965
7066 parent_set = nullptr ;
@@ -76,37 +72,50 @@ RefreshSet::RefreshSet() = default;
7672void RefreshSet::emplace (StorageID id, const std::vector<StorageID> & dependencies, RefreshTaskHolder task)
7773{
7874 std::lock_guard guard (mutex);
79- auto [it, is_inserted] = tasks.emplace (id, task);
80- if (!is_inserted)
81- throw Exception (ErrorCodes::LOGICAL_ERROR, " Refresh set entry already exists for table {}" , id.getFullTableName ());
82- addDependenciesLocked (id, dependencies);
75+ const auto iter = addTaskLocked (id, task);
76+ addDependenciesLocked (task, dependencies);
77+
78+ task->setRefreshSetHandleUnlock (Handle (this , id, iter, dependencies));
79+ }
8380
84- task->setRefreshSetHandleUnlock (Handle (this , id, dependencies));
81+ RefreshTaskList::iterator RefreshSet::addTaskLocked (StorageID id, RefreshTaskHolder task)
82+ {
83+ RefreshTaskList & list = tasks[id];
84+ list.push_back (task);
85+ return std::prev (list.end ());
8586}
8687
87- void RefreshSet::addDependenciesLocked (const StorageID & id, const std::vector<StorageID> & dependencies)
88+ void RefreshSet::removeTaskLocked (StorageID id, RefreshTaskList::iterator iter)
89+ {
90+ const auto it = tasks.find (id);
91+ it->second .erase (iter);
92+ if (it->second .empty ())
93+ tasks.erase (it);
94+ }
95+
96+ void RefreshSet::addDependenciesLocked (RefreshTaskHolder task, const std::vector<StorageID> & dependencies)
8897{
8998 for (const StorageID & dep : dependencies)
90- dependents[dep].insert (id );
99+ dependents[dep].insert (task );
91100}
92101
93- void RefreshSet::removeDependenciesLocked (const StorageID & id , const std::vector<StorageID> & dependencies)
102+ void RefreshSet::removeDependenciesLocked (RefreshTaskHolder task , const std::vector<StorageID> & dependencies)
94103{
95104 for (const StorageID & dep : dependencies)
96105 {
97106 auto & set = dependents[dep];
98- set.erase (id );
107+ set.erase (task );
99108 if (set.empty ())
100109 dependents.erase (dep);
101110 }
102111}
103112
104- RefreshTaskHolder RefreshSet::getTask (const StorageID & id) const
113+ RefreshTaskList RefreshSet::findTasks (const StorageID & id) const
105114{
106115 std::lock_guard lock (mutex);
107- if (auto task = tasks.find (id); task != tasks.end ())
108- return task ->second ;
109- return nullptr ;
116+ if (auto it = tasks.find (id); it != tasks.end ())
117+ return it ->second ;
118+ return {} ;
110119}
111120
112121RefreshSet::InfoContainer RefreshSet::getInfo () const
@@ -116,26 +125,23 @@ RefreshSet::InfoContainer RefreshSet::getInfo() const
116125 lock.unlock ();
117126
118127 InfoContainer res;
119- for (const auto & [id, task] : tasks_copy)
120- res.push_back (task->getInfo ());
128+ for (const auto & [id, list] : tasks_copy)
129+ for (const auto & task : list)
130+ res.push_back (task->getInfo ());
121131 return res;
122132}
123133
124134std::vector<RefreshTaskHolder> RefreshSet::getDependents (const StorageID & id) const
125135{
126136 std::lock_guard lock (mutex);
127- std::vector<RefreshTaskHolder> res;
128137 auto it = dependents.find (id);
129138 if (it == dependents.end ())
130139 return {};
131- for (const StorageID & dep_id : it->second )
132- if (auto task = tasks.find (dep_id); task != tasks.end ())
133- res.push_back (task->second );
134- return res;
140+ return std::vector<RefreshTaskHolder>(it->second .begin (), it->second .end ());
135141}
136142
137- RefreshSet::Handle::Handle (RefreshSet * parent_set_, StorageID id_, std::vector<StorageID> dependencies_)
143+ RefreshSet::Handle::Handle (RefreshSet * parent_set_, StorageID id_, RefreshTaskList::iterator iter_, std::vector<StorageID> dependencies_)
138144 : parent_set(parent_set_), id(std::move(id_)), dependencies(std::move(dependencies_))
139- , metric_increment(CurrentMetrics::Increment(CurrentMetrics::RefreshableViews)) {}
145+ , iter(iter_), metric_increment(CurrentMetrics::Increment(CurrentMetrics::RefreshableViews)) {}
140146
141147}
0 commit comments