@@ -671,9 +671,10 @@ static ares_bool_t ares__server_in_newconfig(const struct server_state *server,
671671 return ARES_FALSE ;
672672}
673673
674- static void ares__servers_remove_stale (ares_channel_t * channel ,
675- ares__llist_t * srvlist )
674+ static ares_bool_t ares__servers_remove_stale (ares_channel_t * channel ,
675+ ares__llist_t * srvlist )
676676{
677+ ares_bool_t stale_removed = ARES_FALSE ;
677678 ares__slist_node_t * snode = ares__slist_node_first (channel -> servers );
678679
679680 while (snode != NULL ) {
@@ -683,9 +684,11 @@ static void ares__servers_remove_stale(ares_channel_t *channel,
683684 /* This will clean up all server state via the destruction callback and
684685 * move any queries to new servers */
685686 ares__slist_node_destroy (snode );
687+ stale_removed = ARES_TRUE ;
686688 }
687689 snode = snext ;
688690 }
691+ return stale_removed ;
689692}
690693
691694static void ares__servers_trim_single (ares_channel_t * channel )
@@ -702,6 +705,7 @@ ares_status_t ares__servers_update(ares_channel_t *channel,
702705 ares__llist_node_t * node ;
703706 size_t idx = 0 ;
704707 ares_status_t status ;
708+ ares_bool_t list_changed = ARES_FALSE ;
705709
706710 if (channel == NULL ) {
707711 return ARES_EFORMERR ;
@@ -747,13 +751,17 @@ ares_status_t ares__servers_update(ares_channel_t *channel,
747751 if (status != ARES_SUCCESS ) {
748752 goto done ;
749753 }
754+
755+ list_changed = ARES_TRUE ;
750756 }
751757
752758 idx ++ ;
753759 }
754760
755761 /* Remove any servers that don't exist in the current configuration */
756- ares__servers_remove_stale (channel , server_list );
762+ if (ares__servers_remove_stale (channel , server_list )) {
763+ list_changed = ARES_TRUE ;
764+ }
757765
758766 /* Trim to one server if ARES_FLAG_PRIMARY is set. */
759767 if (channel -> flags & ARES_FLAG_PRIMARY ) {
@@ -765,8 +773,10 @@ ares_status_t ares__servers_update(ares_channel_t *channel,
765773 channel -> optmask |= ARES_OPT_SERVERS ;
766774 }
767775
768- /* Clear any cached query results */
769- ares__qcache_flush (channel -> qcache );
776+ /* Clear any cached query results only if the server list changed */
777+ if (list_changed ) {
778+ ares__qcache_flush (channel -> qcache );
779+ }
770780
771781 status = ARES_SUCCESS ;
772782
0 commit comments