blob: d43f9fd1b9229f3f3539f1d6e206705072eab8d9 [file] [log] [blame]
David Garcia Quintas5c4543d2015-09-03 15:49:56 -07001/*
2 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003 * Copyright 2015 gRPC authors.
David Garcia Quintas5c4543d2015-09-03 15:49:56 -07004 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
David Garcia Quintas5c4543d2015-09-03 15:49:56 -07008 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009 * http://www.apache.org/licenses/LICENSE-2.0
David Garcia Quintas5c4543d2015-09-03 15:49:56 -070010 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
David Garcia Quintas5c4543d2015-09-03 15:49:56 -070016 *
17 */
18
Mark D. Rothc5c38782016-09-16 08:51:01 -070019#include <string.h>
20
21#include <grpc/support/alloc.h>
Mark D. Rothfef585f2016-09-16 10:23:28 -070022#include <grpc/support/string_util.h>
Mark D. Rothc5c38782016-09-16 08:51:01 -070023
David Garcia Quintas53af23c2017-04-15 10:29:46 -070024#include "src/core/lib/channel/channel_args.h"
25
Craig Tiller9eb0fde2017-03-31 16:59:30 -070026#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
David Garcia Quintas53af23c2017-04-15 10:29:46 -070027#include "src/core/ext/filters/client_channel/parse_address.h"
David Garcia Quintas5c4543d2015-09-03 15:49:56 -070028
Mark D. Roth16883a32016-10-21 10:30:58 -070029grpc_lb_addresses* grpc_lb_addresses_create(
30 size_t num_addresses, const grpc_lb_user_data_vtable* user_data_vtable) {
Yash Tibrewalca3c1c02017-09-07 22:47:16 -070031 grpc_lb_addresses* addresses =
32 (grpc_lb_addresses*)gpr_zalloc(sizeof(grpc_lb_addresses));
Mark D. Rothc5c38782016-09-16 08:51:01 -070033 addresses->num_addresses = num_addresses;
Mark D. Roth16883a32016-10-21 10:30:58 -070034 addresses->user_data_vtable = user_data_vtable;
Mark D. Rothc5c38782016-09-16 08:51:01 -070035 const size_t addresses_size = sizeof(grpc_lb_address) * num_addresses;
Yash Tibrewalca3c1c02017-09-07 22:47:16 -070036 addresses->addresses = (grpc_lb_address*)gpr_zalloc(addresses_size);
Mark D. Rothc5c38782016-09-16 08:51:01 -070037 return addresses;
38}
39
Mark D. Roth16883a32016-10-21 10:30:58 -070040grpc_lb_addresses* grpc_lb_addresses_copy(const grpc_lb_addresses* addresses) {
41 grpc_lb_addresses* new_addresses = grpc_lb_addresses_create(
42 addresses->num_addresses, addresses->user_data_vtable);
Mark D. Roth7f7d1652016-09-20 10:46:15 -070043 memcpy(new_addresses->addresses, addresses->addresses,
Mark D. Rothfef585f2016-09-16 10:23:28 -070044 sizeof(grpc_lb_address) * addresses->num_addresses);
Mark D. Rothee5173f2016-09-16 10:14:18 -070045 for (size_t i = 0; i < addresses->num_addresses; ++i) {
Craig Tiller4782d922017-11-10 09:53:21 -080046 if (new_addresses->addresses[i].balancer_name != nullptr) {
Mark D. Roth7f7d1652016-09-20 10:46:15 -070047 new_addresses->addresses[i].balancer_name =
48 gpr_strdup(new_addresses->addresses[i].balancer_name);
Mark D. Rothfef585f2016-09-16 10:23:28 -070049 }
Craig Tiller4782d922017-11-10 09:53:21 -080050 if (new_addresses->addresses[i].user_data != nullptr) {
Mark D. Roth557c9902016-10-24 11:12:05 -070051 new_addresses->addresses[i].user_data = addresses->user_data_vtable->copy(
52 new_addresses->addresses[i].user_data);
Mark D. Rothee5173f2016-09-16 10:14:18 -070053 }
54 }
Mark D. Roth7f7d1652016-09-20 10:46:15 -070055 return new_addresses;
Mark D. Rothee5173f2016-09-16 10:14:18 -070056}
57
Mark D. Rothc5c38782016-09-16 08:51:01 -070058void grpc_lb_addresses_set_address(grpc_lb_addresses* addresses, size_t index,
Juanli Shenfe408152017-09-27 12:27:20 -070059 const void* address, size_t address_len,
David Garcia Quintas53af23c2017-04-15 10:29:46 -070060 bool is_balancer, const char* balancer_name,
Mark D. Rothc5c38782016-09-16 08:51:01 -070061 void* user_data) {
62 GPR_ASSERT(index < addresses->num_addresses);
Craig Tiller4782d922017-11-10 09:53:21 -080063 if (user_data != nullptr) GPR_ASSERT(addresses->user_data_vtable != nullptr);
Mark D. Rothc5c38782016-09-16 08:51:01 -070064 grpc_lb_address* target = &addresses->addresses[index];
65 memcpy(target->address.addr, address, address_len);
66 target->address.len = address_len;
67 target->is_balancer = is_balancer;
David Garcia Quintas53af23c2017-04-15 10:29:46 -070068 target->balancer_name = gpr_strdup(balancer_name);
Mark D. Rothc5c38782016-09-16 08:51:01 -070069 target->user_data = user_data;
70}
71
David Garcia Quintas53af23c2017-04-15 10:29:46 -070072bool grpc_lb_addresses_set_address_from_uri(grpc_lb_addresses* addresses,
73 size_t index, const grpc_uri* uri,
74 bool is_balancer,
75 const char* balancer_name,
76 void* user_data) {
77 grpc_resolved_address address;
78 if (!grpc_parse_uri(uri, &address)) return false;
79 grpc_lb_addresses_set_address(addresses, index, address.addr, address.len,
80 is_balancer, balancer_name, user_data);
81 return true;
82}
83
Mark D. Roth16883a32016-10-21 10:30:58 -070084int grpc_lb_addresses_cmp(const grpc_lb_addresses* addresses1,
85 const grpc_lb_addresses* addresses2) {
86 if (addresses1->num_addresses > addresses2->num_addresses) return 1;
87 if (addresses1->num_addresses < addresses2->num_addresses) return -1;
88 if (addresses1->user_data_vtable > addresses2->user_data_vtable) return 1;
89 if (addresses1->user_data_vtable < addresses2->user_data_vtable) return -1;
90 for (size_t i = 0; i < addresses1->num_addresses; ++i) {
91 const grpc_lb_address* target1 = &addresses1->addresses[i];
92 const grpc_lb_address* target2 = &addresses2->addresses[i];
93 if (target1->address.len > target2->address.len) return 1;
94 if (target1->address.len < target2->address.len) return -1;
Mark D. Roth557c9902016-10-24 11:12:05 -070095 int retval = memcmp(target1->address.addr, target2->address.addr,
96 target1->address.len);
Mark D. Roth16883a32016-10-21 10:30:58 -070097 if (retval != 0) return retval;
98 if (target1->is_balancer > target2->is_balancer) return 1;
99 if (target1->is_balancer < target2->is_balancer) return -1;
Mark D. Roth557c9902016-10-24 11:12:05 -0700100 const char* balancer_name1 =
Craig Tiller4782d922017-11-10 09:53:21 -0800101 target1->balancer_name != nullptr ? target1->balancer_name : "";
Mark D. Roth557c9902016-10-24 11:12:05 -0700102 const char* balancer_name2 =
Craig Tiller4782d922017-11-10 09:53:21 -0800103 target2->balancer_name != nullptr ? target2->balancer_name : "";
Mark D. Roth16883a32016-10-21 10:30:58 -0700104 retval = strcmp(balancer_name1, balancer_name2);
105 if (retval != 0) return retval;
Craig Tiller4782d922017-11-10 09:53:21 -0800106 if (addresses1->user_data_vtable != nullptr) {
Mark D. Roth16883a32016-10-21 10:30:58 -0700107 retval = addresses1->user_data_vtable->cmp(target1->user_data,
108 target2->user_data);
109 if (retval != 0) return retval;
110 }
111 }
112 return 0;
113}
114
Craig Tiller87a7e1f2016-11-09 09:42:19 -0800115void grpc_lb_addresses_destroy(grpc_exec_ctx* exec_ctx,
116 grpc_lb_addresses* addresses) {
Mark D. Rothc5c38782016-09-16 08:51:01 -0700117 for (size_t i = 0; i < addresses->num_addresses; ++i) {
118 gpr_free(addresses->addresses[i].balancer_name);
Craig Tiller4782d922017-11-10 09:53:21 -0800119 if (addresses->addresses[i].user_data != nullptr) {
Craig Tiller87a7e1f2016-11-09 09:42:19 -0800120 addresses->user_data_vtable->destroy(exec_ctx,
121 addresses->addresses[i].user_data);
Mark D. Roth7ce14d22016-09-16 13:03:46 -0700122 }
Mark D. Rothc5c38782016-09-16 08:51:01 -0700123 }
124 gpr_free(addresses->addresses);
125 gpr_free(addresses);
126}
127
Mark D. Roth36869962016-10-21 10:43:45 -0700128static void* lb_addresses_copy(void* addresses) {
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700129 return grpc_lb_addresses_copy((grpc_lb_addresses*)addresses);
Mark D. Roth36869962016-10-21 10:43:45 -0700130}
Craig Tiller87a7e1f2016-11-09 09:42:19 -0800131static void lb_addresses_destroy(grpc_exec_ctx* exec_ctx, void* addresses) {
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700132 grpc_lb_addresses_destroy(exec_ctx, (grpc_lb_addresses*)addresses);
Mark D. Roth36869962016-10-21 10:43:45 -0700133}
134static int lb_addresses_cmp(void* addresses1, void* addresses2) {
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700135 return grpc_lb_addresses_cmp((grpc_lb_addresses*)addresses1,
136 (grpc_lb_addresses*)addresses2);
Mark D. Roth36869962016-10-21 10:43:45 -0700137}
138static const grpc_arg_pointer_vtable lb_addresses_arg_vtable = {
139 lb_addresses_copy, lb_addresses_destroy, lb_addresses_cmp};
140
141grpc_arg grpc_lb_addresses_create_channel_arg(
Mark D. Roth557c9902016-10-24 11:12:05 -0700142 const grpc_lb_addresses* addresses) {
Mark D. Roth8d5e60b2017-06-09 09:08:23 -0700143 return grpc_channel_arg_pointer_create(
Yash Tibrewal9eb86722017-09-17 23:43:30 -0700144 (char*)GRPC_ARG_LB_ADDRESSES, (void*)addresses, &lb_addresses_arg_vtable);
Mark D. Roth36869962016-10-21 10:43:45 -0700145}
146
David Garcia Quintas53af23c2017-04-15 10:29:46 -0700147grpc_lb_addresses* grpc_lb_addresses_find_channel_arg(
148 const grpc_channel_args* channel_args) {
149 const grpc_arg* lb_addresses_arg =
150 grpc_channel_args_find(channel_args, GRPC_ARG_LB_ADDRESSES);
Craig Tiller4782d922017-11-10 09:53:21 -0800151 if (lb_addresses_arg == nullptr || lb_addresses_arg->type != GRPC_ARG_POINTER)
152 return nullptr;
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700153 return (grpc_lb_addresses*)lb_addresses_arg->value.pointer.p;
David Garcia Quintas53af23c2017-04-15 10:29:46 -0700154}
155
Craig Tillera82950e2015-09-22 12:33:20 -0700156void grpc_lb_policy_factory_ref(grpc_lb_policy_factory* factory) {
157 factory->vtable->ref(factory);
David Garcia Quintas5c4543d2015-09-03 15:49:56 -0700158}
159
Craig Tillera82950e2015-09-22 12:33:20 -0700160void grpc_lb_policy_factory_unref(grpc_lb_policy_factory* factory) {
161 factory->vtable->unref(factory);
Craig Tiller45724b32015-09-22 10:42:19 -0700162}
163
Craig Tillera82950e2015-09-22 12:33:20 -0700164grpc_lb_policy* grpc_lb_policy_factory_create_lb_policy(
David Garcia Quintas67c0d042016-03-25 01:37:53 -0700165 grpc_exec_ctx* exec_ctx, grpc_lb_policy_factory* factory,
166 grpc_lb_policy_args* args) {
Craig Tiller4782d922017-11-10 09:53:21 -0800167 if (factory == nullptr) return nullptr;
David Garcia Quintas67c0d042016-03-25 01:37:53 -0700168 return factory->vtable->create_lb_policy(exec_ctx, factory, args);
David Garcia Quintas5c4543d2015-09-03 15:49:56 -0700169}