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