Răsfoiți Sursa

added grpclb support to sockaddr resolver

David Garcia Quintas 9 ani în urmă
părinte
comite
d5dd1a388b
1 a modificat fișierele cu 32 adăugiri și 5 ștergeri
  1. 32 5
      src/core/client_config/resolvers/sockaddr_resolver.c

+ 32 - 5
src/core/client_config/resolvers/sockaddr_resolver.c

@@ -287,17 +287,44 @@ static grpc_resolver *sockaddr_create(
   r->lb_policy_name = NULL;
   r->lb_policy_name = NULL;
   if (0 != strcmp(args->uri->query, "")) {
   if (0 != strcmp(args->uri->query, "")) {
     gpr_slice query_slice;
     gpr_slice query_slice;
-    gpr_slice_buffer query_parts;
+    gpr_slice_buffer query_parts; /* the &-separated elements of the query */
+    gpr_slice_buffer query_param_parts; /* the =-separated subelements */
 
 
     query_slice =
     query_slice =
         gpr_slice_new(args->uri->query, strlen(args->uri->query), do_nothing);
         gpr_slice_new(args->uri->query, strlen(args->uri->query), do_nothing);
     gpr_slice_buffer_init(&query_parts);
     gpr_slice_buffer_init(&query_parts);
-    gpr_slice_split(query_slice, "=", &query_parts);
-    GPR_ASSERT(query_parts.count == 2);
-    if (0 == gpr_slice_str_cmp(query_parts.slices[0], "lb_policy")) {
-      r->lb_policy_name = gpr_dump_slice(query_parts.slices[1], GPR_DUMP_ASCII);
+    gpr_slice_buffer_init(&query_param_parts);
+    /* the query can contain "lb_policy=<policy>" and "lb_enabled=<1|0>" */
+
+    bool lb_enabled;
+    gpr_slice_split(query_slice, "&", &query_parts);
+    for (i = 0; i < query_parts.count; i++) {
+      gpr_slice_split(query_parts.slices[i], "=", &query_param_parts);
+      GPR_ASSERT(query_param_parts.count == 2);
+      if (0 == gpr_slice_str_cmp(query_param_parts.slices[0], "lb_policy")) {
+        r->lb_policy_name =
+            gpr_dump_slice(query_param_parts.slices[1], GPR_DUMP_ASCII);
+      } else if (0 ==
+                 gpr_slice_str_cmp(query_param_parts.slices[0], "lb_enabled")) {
+        if (0 != gpr_slice_str_cmp(query_param_parts.slices[1], "0")) {
+          /* anything other than 0 is taken to be true */
+          lb_enabled = true;
+        }
+      } else {
+        gpr_log(GPR_ERROR, "invalid query element value: '%s'",
+                query_parts.slices[0]);
+      }
+      gpr_slice_buffer_reset_and_unref(&query_param_parts);
+    }
+
+    if (strcmp("grpclb", r->lb_policy_name) == 0 && !lb_enabled) {
+      /* we want grpclb but the "resolved" addresses aren't LB enabled. Fall
+       * back to the default policy */
+      gpr_free(r->lb_policy_name);
+      r->lb_policy_name = gpr_strdup(default_lb_policy_name);
     }
     }
     gpr_slice_buffer_destroy(&query_parts);
     gpr_slice_buffer_destroy(&query_parts);
+    gpr_slice_buffer_destroy(&query_param_parts);
     gpr_slice_unref(query_slice);
     gpr_slice_unref(query_slice);
   }
   }
   if (r->lb_policy_name == NULL) {
   if (r->lb_policy_name == NULL) {