From 10c1d5af318b82ed11c99fec8c4fe89e40d72782 Mon Sep 17 00:00:00 2001
From: Yuchen Zeng <zyc@google.com>
Date: Fri, 5 Aug 2016 17:12:12 -0700
Subject: [PATCH] Add grpc_customized_resolve_address

---
 src/core/lib/iomgr/resolve_address.h          |  7 ++++++
 src/core/lib/iomgr/resolve_address_posix.c    | 22 ++++++++++++++++++-
 src/core/lib/iomgr/resolve_address_windows.c  | 22 ++++++++++++++++++-
 .../dns_resolver_connectivity_test.c          |  2 +-
 test/core/end2end/goaway_server_test.c        |  8 ++-----
 5 files changed, 52 insertions(+), 9 deletions(-)

diff --git a/src/core/lib/iomgr/resolve_address.h b/src/core/lib/iomgr/resolve_address.h
index ddbe375755..7a770662cc 100644
--- a/src/core/lib/iomgr/resolve_address.h
+++ b/src/core/lib/iomgr/resolve_address.h
@@ -66,4 +66,11 @@ extern grpc_error *(*grpc_blocking_resolve_address)(
     const char *name, const char *default_port,
     grpc_resolved_addresses **addresses);
 
+/* Returns GRPC_ERROR_CANCELLED by default. If it's overriden and returns
+   error other than GRPC_ERROR_CANCELLED, grpc_resolve_address will use its
+   result. Result must be freed with grpc_resolved_addresses_destroy. */
+extern grpc_error *(*grpc_customized_resolve_address)(
+    const char *name, const char *default_port,
+    grpc_resolved_addresses **addresses);
+
 #endif /* GRPC_CORE_LIB_IOMGR_RESOLVE_ADDRESS_H */
diff --git a/src/core/lib/iomgr/resolve_address_posix.c b/src/core/lib/iomgr/resolve_address_posix.c
index 4e9f978584..4012dcc61f 100644
--- a/src/core/lib/iomgr/resolve_address_posix.c
+++ b/src/core/lib/iomgr/resolve_address_posix.c
@@ -149,6 +149,17 @@ grpc_error *(*grpc_blocking_resolve_address)(
     const char *name, const char *default_port,
     grpc_resolved_addresses **addresses) = blocking_resolve_address_impl;
 
+static grpc_error *default_customized_resolve_address_impl(
+    const char *name, const char *default_port,
+    grpc_resolved_addresses **addresses) {
+  return GRPC_ERROR_CANCELLED;
+}
+
+grpc_error *(*grpc_customized_resolve_address)(
+    const char *name, const char *default_port,
+    grpc_resolved_addresses **addresses) =
+    default_customized_resolve_address_impl;
+
 typedef struct {
   char *name;
   char *default_port;
@@ -183,7 +194,16 @@ static void resolve_address_impl(grpc_exec_ctx *exec_ctx, const char *name,
                                  const char *default_port,
                                  grpc_closure *on_done,
                                  grpc_resolved_addresses **addrs) {
-  request *r = gpr_malloc(sizeof(request));
+  request *r;
+  grpc_error *err;
+
+  if ((err = grpc_customized_resolve_address(name, default_port, addrs)) !=
+      GRPC_ERROR_CANCELLED) {
+    grpc_exec_ctx_sched(exec_ctx, on_done, err, NULL);
+    return;
+  }
+
+  r = gpr_malloc(sizeof(request));
   grpc_closure_init(&r->request_closure, do_request_thread, r);
   r->name = gpr_strdup(name);
   r->default_port = gpr_strdup(default_port);
diff --git a/src/core/lib/iomgr/resolve_address_windows.c b/src/core/lib/iomgr/resolve_address_windows.c
index 2af8af82dc..e28eaac492 100644
--- a/src/core/lib/iomgr/resolve_address_windows.c
+++ b/src/core/lib/iomgr/resolve_address_windows.c
@@ -143,6 +143,17 @@ grpc_error *(*grpc_blocking_resolve_address)(
     const char *name, const char *default_port,
     grpc_resolved_addresses **addresses) = blocking_resolve_address_impl;
 
+static grpc_error *default_customized_resolve_address_impl(
+    const char *name, const char *default_port,
+    grpc_resolved_addresses **addresses) {
+  return GRPC_ERROR_CANCELLED;
+}
+
+grpc_error *(*grpc_customized_resolve_address)(
+    const char *name, const char *default_port,
+    grpc_resolved_addresses **addresses) =
+    default_customized_resolve_address_impl;
+
 /* Callback to be passed to grpc_executor to asynch-ify
  * grpc_blocking_resolve_address */
 static void do_request_thread(grpc_exec_ctx *exec_ctx, void *rp,
@@ -171,7 +182,16 @@ static void resolve_address_impl(grpc_exec_ctx *exec_ctx, const char *name,
                                  const char *default_port,
                                  grpc_closure *on_done,
                                  grpc_resolved_addresses **addresses) {
-  request *r = gpr_malloc(sizeof(request));
+  request *r;
+  grpc_error *err;
+
+  if ((err = grpc_customized_resolve_address(name, default_port, addrs)) !=
+      GRPC_ERROR_CANCELLED) {
+    grpc_exec_ctx_sched(exec_ctx, on_done, err, NULL);
+    return;
+  }
+
+  r = gpr_malloc(sizeof(request));
   grpc_closure_init(&r->request_closure, do_request_thread, r);
   r->name = gpr_strdup(name);
   r->default_port = gpr_strdup(default_port);
diff --git a/test/core/client_config/resolvers/dns_resolver_connectivity_test.c b/test/core/client_config/resolvers/dns_resolver_connectivity_test.c
index 11e6a89cda..6002b0b7bb 100644
--- a/test/core/client_config/resolvers/dns_resolver_connectivity_test.c
+++ b/test/core/client_config/resolvers/dns_resolver_connectivity_test.c
@@ -123,7 +123,7 @@ int main(int argc, char **argv) {
 
   grpc_init();
   gpr_mu_init(&g_mu);
-  grpc_blocking_resolve_address = my_resolve_address;
+  grpc_customized_resolve_address = my_resolve_address;
 
   grpc_resolver *resolver = create_resolver("dns:test");
 
diff --git a/test/core/end2end/goaway_server_test.c b/test/core/end2end/goaway_server_test.c
index 67cc24c74c..ed8cc3dd68 100644
--- a/test/core/end2end/goaway_server_test.c
+++ b/test/core/end2end/goaway_server_test.c
@@ -46,9 +46,6 @@ static void *tag(intptr_t i) { return (void *)i; }
 
 static gpr_mu g_mu;
 static int g_resolve_port = -1;
-static grpc_error *(*iomgr_resolve_address)(const char *name,
-                                            const char *default_port,
-                                            grpc_resolved_addresses **addrs);
 
 static void set_resolve_port(int port) {
   gpr_mu_lock(&g_mu);
@@ -59,7 +56,7 @@ static void set_resolve_port(int port) {
 static grpc_error *my_resolve_address(const char *name, const char *addr,
                                       grpc_resolved_addresses **addrs) {
   if (0 != strcmp(name, "test")) {
-    return iomgr_resolve_address(name, addr, addrs);
+    return GRPC_ERROR_CANCELLED;
   }
 
   gpr_mu_lock(&g_mu);
@@ -90,8 +87,7 @@ int main(int argc, char **argv) {
   grpc_test_init(argc, argv);
 
   gpr_mu_init(&g_mu);
-  iomgr_resolve_address = grpc_blocking_resolve_address;
-  grpc_blocking_resolve_address = my_resolve_address;
+  grpc_customized_resolve_address = my_resolve_address;
   grpc_init();
 
   int was_cancelled1;
-- 
GitLab