Skip to content

Commit fc08bd9

Browse files
authored
Merge pull request sogou#745 from Barenboim/master
make UpstreamManager::upstream_delete safe
2 parents 48dab57 + 903ee8e commit fc08bd9

File tree

3 files changed

+23
-14
lines changed

3 files changed

+23
-14
lines changed

src/manager/UpstreamManager.cc

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ class __UpstreamManager
3232
return &kInstance;
3333
}
3434

35-
void add_policy_name(const std::string& name)
35+
void add_upstream_policy(UPSGroupPolicy *policy)
3636
{
3737
pthread_mutex_lock(&this->mutex);
38-
this->upstream_names.push_back(name);
38+
this->upstream_policies.push_back(policy);
3939
pthread_mutex_unlock(&this->mutex);
4040
}
4141

@@ -47,14 +47,12 @@ class __UpstreamManager
4747

4848
~__UpstreamManager()
4949
{
50-
WFNameService *ns = WFGlobal::get_name_service();
51-
52-
for (const std::string& name : this->upstream_names)
53-
delete dynamic_cast<UPSGroupPolicy *>(ns->del_policy(name.c_str()));
50+
for (UPSGroupPolicy *policy : this->upstream_policies)
51+
delete policy;
5452
}
5553

5654
pthread_mutex_t mutex;
57-
std::vector<std::string> upstream_names;
55+
std::vector<UPSGroupPolicy *> upstream_policies;
5856
};
5957

6058
static unsigned int __default_consistent_hash(const char *path,
@@ -80,7 +78,7 @@ int UpstreamManager::upstream_create_consistent_hash(const std::string& name,
8078
__default_consistent_hash);
8179
if (ns->add_policy(name.c_str(), policy) >= 0)
8280
{
83-
__UpstreamManager::get_instance()->add_policy_name(name);
81+
__UpstreamManager::get_instance()->add_upstream_policy(policy);
8482
return 0;
8583
}
8684

@@ -96,7 +94,7 @@ int UpstreamManager::upstream_create_weighted_random(const std::string& name,
9694

9795
if (ns->add_policy(name.c_str(), policy) >= 0)
9896
{
99-
__UpstreamManager::get_instance()->add_policy_name(name);
97+
__UpstreamManager::get_instance()->add_upstream_policy(policy);
10098
return 0;
10199
}
102100

@@ -111,7 +109,7 @@ int UpstreamManager::upstream_create_vnswrr(const std::string& name)
111109

112110
if (ns->add_policy(name.c_str(), policy) >= 0)
113111
{
114-
__UpstreamManager::get_instance()->add_policy_name(name);
112+
__UpstreamManager::get_instance()->add_upstream_policy(policy);
115113
return 0;
116114
}
117115

@@ -132,7 +130,7 @@ int UpstreamManager::upstream_create_manual(const std::string& name,
132130
__default_consistent_hash);
133131
if (ns->add_policy(name.c_str(), policy) >= 0)
134132
{
135-
__UpstreamManager::get_instance()->add_policy_name(name);
133+
__UpstreamManager::get_instance()->add_upstream_policy(policy);
136134
return 0;
137135
}
138136

@@ -183,10 +181,7 @@ int UpstreamManager::upstream_delete(const std::string& name)
183181
UPSGroupPolicy *policy = dynamic_cast<UPSGroupPolicy *>(ns->del_policy(name.c_str()));
184182

185183
if (policy)
186-
{
187-
delete policy;
188184
return 0;
189-
}
190185

191186
errno = ENOENT;
192187
return -1;

src/nameservice/WFNameService.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,15 @@ WFNSPolicy *WFNameService::del_policy(const char *name)
127127
return policy;
128128
}
129129

130+
WFNameService::~WFNameService()
131+
{
132+
struct WFNSPolicyEntry *entry;
133+
134+
while (this->root.rb_node)
135+
{
136+
entry = rb_entry(this->root.rb_node, struct WFNSPolicyEntry, rb);
137+
rb_erase(&entry->rb, &this->root);
138+
free(entry);
139+
}
140+
}
141+

src/nameservice/WFNameService.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ class WFNameService
142142
this->root.rb_node = NULL;
143143
this->default_policy = default_policy;
144144
}
145+
146+
virtual ~WFNameService();
145147
};
146148

147149
#endif

0 commit comments

Comments
 (0)