Android R Beta 2
Support prioritizing DNS servers

The change introduces a way to prioritize DNS servers on the basis of
DNS query response time, which aims to replace the current design that
is biased towards using the first DNS server assigned from networks.

The quality is evaluated based on the heuristics:
  - The more latency it is, the less likely it is used.
  - The longer time it is not used, the more likely it is used.

Compared to the current design, the proposed method detects bad DNS
servers more quickly. For instance, a server which is unreachable or
times out can be detected and deprioritized with few trials by backoff
penalty and abnormal latency.

Similar to the current design, a server which has been regarded as bad
quality can be used again, but it depends on how much worse it is. A
counter is used to count how many times a DNS server not being used,
which avoids from constantly using the same DNS server.

This change comprises:

[1] Allow the resolver to sort DNS servers on the basis of DNS query
    response time.
[2] Add an experiment flag to enable/disable the sorting.
[3] Show the result of the quantified quality of DNS servers in
    dumpsys dnsresolver.
[4] Add unit tests for DnsStats::getSortedServers().
[5] Revise the integration tests which are sensitive to the nameserver
    sorting, including two big changes in SkipBadServersDueToInternalError
    and SkipBadServersDueToTimeout and some minor changes.

Bug: 137169582
Test: ran resolv_unit_test
      ran resolv_integration_test with the sorting enabled
      ran resolv_integration_test with the sorting disabled
Change-Id: I24b6a317f135a942ce0ea310c81dfe658bada6a7
8 files changed
tree: 4b881041db658114a62c3ed8be98b74e00b92744
  1. aidl_api/
  2. apex/
  3. binder/
  4. include/
  5. tests/
  6. .editorconfig
  7. Android.bp
  8. Dns64Configuration.cpp
  9. Dns64Configuration.h
  10. DnsProxyListener.cpp
  11. DnsProxyListener.h
  12. DnsQueryLog.cpp
  13. DnsQueryLog.h
  14. DnsQueryLogTest.cpp
  15. DnsResolver.cpp
  16. DnsResolver.h
  17. DnsResolverService.cpp
  18. DnsResolverService.h
  19. DnsStats.cpp
  20. DnsStats.h
  21. DnsStatsTest.cpp
  22. DnsTlsDispatcher.cpp
  23. DnsTlsDispatcher.h
  24. DnsTlsQueryMap.cpp
  25. DnsTlsQueryMap.h
  26. DnsTlsServer.cpp
  27. DnsTlsServer.h
  28. DnsTlsSessionCache.cpp
  29. DnsTlsSessionCache.h
  30. DnsTlsSocket.cpp
  31. DnsTlsSocket.h
  32. DnsTlsSocketFactory.h
  33. DnsTlsTransport.cpp
  34. DnsTlsTransport.h
  35. Experiments.cpp
  36. Experiments.h
  37. ExperimentsTest.cpp
  38. getaddrinfo.cpp
  39. getaddrinfo.h
  40. gethnamaddr.cpp
  41. gethnamaddr.h
  42. hostent.h
  43. IDnsTlsSocket.h
  44. IDnsTlsSocketFactory.h
  45. IDnsTlsSocketObserver.h
  46. libnetd_resolv.map.txt
  47. LockedQueue.h
  48. NOTICE
  49. OWNERS
  50. params.h
  51. PREUPLOAD.cfg
  52. PrivateDnsConfiguration.cpp
  53. PrivateDnsConfiguration.h
  54. README-DoT.md
  55. README.md
  56. res_cache.cpp
  57. res_comp.cpp
  58. res_comp.h
  59. res_debug.cpp
  60. res_debug.h
  61. res_init.cpp
  62. res_init.h
  63. res_mkquery.cpp
  64. res_query.cpp
  65. res_send.cpp
  66. res_send.h
  67. res_stats.cpp
  68. resolv_cache.h
  69. resolv_cache_unit_test.cpp
  70. resolv_callback_unit_test.cpp
  71. resolv_private.h
  72. resolv_test_config_template.xml
  73. resolv_tls_unit_test.cpp
  74. resolv_unit_test.cpp
  75. ResolverController.cpp
  76. ResolverController.h
  77. ResolverEventReporter.cpp
  78. ResolverEventReporter.h
  79. ResolverStats.h
  80. sethostent.cpp
  81. stats.h
  82. stats.proto
  83. TEST_MAPPING
  84. util.cpp
  85. util.h
README.md

Logging

This code uses LOG(X) for logging. Log levels are VERBOSE,DEBUG,INFO,WARNING and ERROR. The default setting is WARNING and logs relate to WARNING and ERROR will be shown. If you want to enable the DEBUG level logs, using following command. adb shell service call dnsresolver 10 i32 1 VERBOSE 0 DEBUG 1 INFO 2 WARNING 3 ERROR 4 Verbose resolver logs could contain PII -- do NOT enable in production builds.