@@ -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
@@ -682,6 +693,7 @@ class QueryWrap : public AsyncWrap {
682
693
CaresAsyncCb));
683
694
684
695
wrap->channel_ ->set_query_last_ok (status != ARES_ECONNREFUSED);
696
+ wrap->channel_ ->ModifyActivityQueryCount (-1 );
685
697
async_handle->data = data;
686
698
uv_async_send (async_handle);
687
699
}
@@ -1802,9 +1814,12 @@ static void Query(const FunctionCallbackInfo<Value>& args) {
1802
1814
Wrap* wrap = new Wrap (channel, req_wrap_obj);
1803
1815
1804
1816
node::Utf8Value name (env->isolate (), string);
1817
+ channel->ModifyActivityQueryCount (1 );
1805
1818
int err = wrap->Send (*name);
1806
- if (err)
1819
+ if (err) {
1820
+ channel->ModifyActivityQueryCount (-1 );
1807
1821
delete wrap;
1822
+ }
1808
1823
1809
1824
args.GetReturnValue ().Set (err);
1810
1825
}
@@ -2081,6 +2096,10 @@ void SetServers(const FunctionCallbackInfo<Value>& args) {
2081
2096
ChannelWrap* channel;
2082
2097
ASSIGN_OR_RETURN_UNWRAP (&channel, args.Holder ());
2083
2098
2099
+ if (channel->active_query_count ()) {
2100
+ return args.GetReturnValue ().Set (DNS_ESETSRVPENDING);
2101
+ }
2102
+
2084
2103
CHECK (args[0 ]->IsArray ());
2085
2104
2086
2105
Local<Array> arr = Local<Array>::Cast (args[0 ]);
@@ -2161,11 +2180,13 @@ void Cancel(const FunctionCallbackInfo<Value>& args) {
2161
2180
ares_cancel (channel->cares_channel ());
2162
2181
}
2163
2182
2164
-
2183
+ const char EMSG_ESETSRVPENDING[] = " There are pending queries. " ;
2165
2184
void StrError (const FunctionCallbackInfo<Value>& args) {
2166
2185
Environment* env = Environment::GetCurrent (args);
2167
- const char * errmsg = ares_strerror (args[0 ]->Int32Value (env->context ())
2168
- .FromJust ());
2186
+ int code = args[0 ]->Int32Value (env->context ()).FromJust ();
2187
+ const char * errmsg = (code == DNS_ESETSRVPENDING) ?
2188
+ EMSG_ESETSRVPENDING :
2189
+ ares_strerror (code);
2169
2190
args.GetReturnValue ().Set (OneByteString (env->isolate (), errmsg));
2170
2191
}
2171
2192
0 commit comments