@@ -81,6 +81,7 @@ inline uint32_t cares_get_32bit(const unsigned char* p) {
81
81
82
82
const int ns_t_cname_or_a = -1 ;
83
83
84
+ #define DNS_ESETSRVPENDING -1000
84
85
inline const char * ToErrorCodeString (int status) {
85
86
switch (status) {
86
87
#define V (code ) case ARES_##code: return #code;
@@ -148,6 +149,8 @@ class ChannelWrap : public AsyncWrap {
148
149
void EnsureServers ();
149
150
void CleanupTimer ();
150
151
152
+ void ModifyActivityQueryCount (int count);
153
+
151
154
inline uv_timer_t * timer_handle () { return timer_handle_; }
152
155
inline ares_channel cares_channel () { return channel_; }
153
156
inline bool query_last_ok () const { return query_last_ok_; }
@@ -156,6 +159,7 @@ class ChannelWrap : public AsyncWrap {
156
159
inline void set_is_servers_default (bool is_default) {
157
160
is_servers_default_ = is_default;
158
161
}
162
+ inline int active_query_count () { return active_query_count_; }
159
163
inline node_ares_task_list* task_list () { return &task_list_; }
160
164
161
165
size_t self_size () const override { return sizeof (*this ); }
@@ -168,6 +172,7 @@ class ChannelWrap : public AsyncWrap {
168
172
bool query_last_ok_;
169
173
bool is_servers_default_;
170
174
bool library_inited_;
175
+ int active_query_count_;
171
176
node_ares_task_list task_list_;
172
177
};
173
178
@@ -178,7 +183,8 @@ ChannelWrap::ChannelWrap(Environment* env,
178
183
channel_(nullptr ),
179
184
query_last_ok_(true ),
180
185
is_servers_default_(true ),
181
- library_inited_(false ) {
186
+ library_inited_(false ),
187
+ active_query_count_(0 ) {
182
188
MakeWeak<ChannelWrap>(this );
183
189
184
190
Setup ();
@@ -543,6 +549,11 @@ void ChannelWrap::CleanupTimer() {
543
549
timer_handle_ = nullptr ;
544
550
}
545
551
552
+ void ChannelWrap::ModifyActivityQueryCount (int count) {
553
+ active_query_count_ += count;
554
+ if (active_query_count_ < 0 ) active_query_count_ = 0 ;
555
+ }
556
+
546
557
547
558
/* *
548
559
* This function is to check whether current servers are fallback servers
@@ -686,6 +697,7 @@ class QueryWrap : public AsyncWrap {
686
697
CaresAsyncCb));
687
698
688
699
wrap->channel_ ->set_query_last_ok (status != ARES_ECONNREFUSED);
700
+ wrap->channel_ ->ModifyActivityQueryCount (-1 );
689
701
async_handle->data = data;
690
702
uv_async_send (async_handle);
691
703
}
@@ -1806,9 +1818,12 @@ static void Query(const FunctionCallbackInfo<Value>& args) {
1806
1818
Wrap* wrap = new Wrap (channel, req_wrap_obj);
1807
1819
1808
1820
node::Utf8Value name (env->isolate (), string);
1821
+ channel->ModifyActivityQueryCount (1 );
1809
1822
int err = wrap->Send (*name);
1810
- if (err)
1823
+ if (err) {
1824
+ channel->ModifyActivityQueryCount (-1 );
1811
1825
delete wrap;
1826
+ }
1812
1827
1813
1828
args.GetReturnValue ().Set (err);
1814
1829
}
@@ -2085,6 +2100,10 @@ void SetServers(const FunctionCallbackInfo<Value>& args) {
2085
2100
ChannelWrap* channel;
2086
2101
ASSIGN_OR_RETURN_UNWRAP (&channel, args.Holder ());
2087
2102
2103
+ if (channel->active_query_count ()) {
2104
+ return args.GetReturnValue ().Set (DNS_ESETSRVPENDING);
2105
+ }
2106
+
2088
2107
CHECK (args[0 ]->IsArray ());
2089
2108
2090
2109
Local<Array> arr = Local<Array>::Cast (args[0 ]);
@@ -2165,11 +2184,13 @@ void Cancel(const FunctionCallbackInfo<Value>& args) {
2165
2184
ares_cancel (channel->cares_channel ());
2166
2185
}
2167
2186
2168
-
2187
+ const char EMSG_ESETSRVPENDING[] = " There are pending queries. " ;
2169
2188
void StrError (const FunctionCallbackInfo<Value>& args) {
2170
2189
Environment* env = Environment::GetCurrent (args);
2171
- const char * errmsg = ares_strerror (args[0 ]->Int32Value (env->context ())
2172
- .FromJust ());
2190
+ int code = args[0 ]->Int32Value (env->context ()).FromJust ();
2191
+ const char * errmsg = (code == DNS_ESETSRVPENDING) ?
2192
+ EMSG_ESETSRVPENDING :
2193
+ ares_strerror (code);
2173
2194
args.GetReturnValue ().Set (OneByteString (env->isolate (), errmsg));
2174
2195
}
2175
2196
0 commit comments