server.cc 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593
  1. /*
  2. *
  3. * Copyright 2015-2016 gRPC authors.
  4. *
  5. * 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
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * 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.
  16. *
  17. */
  18. #include <grpc/support/port_platform.h>
  19. #include "src/core/lib/surface/server.h"
  20. #include <limits.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <grpc/support/alloc.h>
  24. #include <grpc/support/log.h>
  25. #include <grpc/support/string_util.h>
  26. #include <utility>
  27. #include "src/core/lib/channel/channel_args.h"
  28. #include "src/core/lib/channel/channelz.h"
  29. #include "src/core/lib/channel/connected_channel.h"
  30. #include "src/core/lib/debug/stats.h"
  31. #include "src/core/lib/gpr/mpscq.h"
  32. #include "src/core/lib/gpr/spinlock.h"
  33. #include "src/core/lib/gpr/string.h"
  34. #include "src/core/lib/iomgr/executor.h"
  35. #include "src/core/lib/iomgr/iomgr.h"
  36. #include "src/core/lib/slice/slice_internal.h"
  37. #include "src/core/lib/surface/api_trace.h"
  38. #include "src/core/lib/surface/call.h"
  39. #include "src/core/lib/surface/channel.h"
  40. #include "src/core/lib/surface/completion_queue.h"
  41. #include "src/core/lib/surface/init.h"
  42. #include "src/core/lib/transport/metadata.h"
  43. #include "src/core/lib/transport/static_metadata.h"
  44. grpc_core::TraceFlag grpc_server_channel_trace(false, "server_channel");
  45. static void server_on_recv_initial_metadata(void* ptr, grpc_error* error);
  46. static void server_recv_trailing_metadata_ready(void* user_data,
  47. grpc_error* error);
  48. namespace {
  49. struct listener {
  50. void* arg;
  51. void (*start)(grpc_server* server, void* arg, grpc_pollset** pollsets,
  52. size_t pollset_count);
  53. void (*destroy)(grpc_server* server, void* arg, grpc_closure* closure);
  54. struct listener* next;
  55. intptr_t socket_uuid;
  56. grpc_closure destroy_done;
  57. };
  58. enum requested_call_type { BATCH_CALL, REGISTERED_CALL };
  59. struct registered_method;
  60. struct requested_call {
  61. gpr_mpscq_node request_link; /* must be first */
  62. requested_call_type type;
  63. size_t cq_idx;
  64. void* tag;
  65. grpc_server* server;
  66. grpc_completion_queue* cq_bound_to_call;
  67. grpc_call** call;
  68. grpc_cq_completion completion;
  69. grpc_metadata_array* initial_metadata;
  70. union {
  71. struct {
  72. grpc_call_details* details;
  73. } batch;
  74. struct {
  75. registered_method* method;
  76. gpr_timespec* deadline;
  77. grpc_byte_buffer** optional_payload;
  78. } registered;
  79. } data;
  80. };
  81. struct channel_registered_method {
  82. registered_method* server_registered_method;
  83. uint32_t flags;
  84. bool has_host;
  85. grpc_slice method;
  86. grpc_slice host;
  87. };
  88. struct channel_data {
  89. grpc_server* server;
  90. grpc_connectivity_state connectivity_state;
  91. grpc_channel* channel;
  92. size_t cq_idx;
  93. /* linked list of all channels on a server */
  94. channel_data* next;
  95. channel_data* prev;
  96. channel_registered_method* registered_methods;
  97. uint32_t registered_method_slots;
  98. uint32_t registered_method_max_probes;
  99. grpc_closure finish_destroy_channel_closure;
  100. grpc_closure channel_connectivity_changed;
  101. intptr_t channelz_socket_uuid;
  102. };
  103. typedef struct shutdown_tag {
  104. void* tag;
  105. grpc_completion_queue* cq;
  106. grpc_cq_completion completion;
  107. } shutdown_tag;
  108. typedef enum {
  109. /* waiting for metadata */
  110. NOT_STARTED,
  111. /* initial metadata read, not flow controlled in yet */
  112. PENDING,
  113. /* flow controlled in, on completion queue */
  114. ACTIVATED,
  115. /* cancelled before being queued */
  116. ZOMBIED
  117. } call_state;
  118. typedef struct request_matcher request_matcher;
  119. struct call_data {
  120. call_data(grpc_call_element* elem, const grpc_call_element_args& args)
  121. : call(grpc_call_from_top_element(elem)),
  122. call_combiner(args.call_combiner) {
  123. GRPC_CLOSURE_INIT(&server_on_recv_initial_metadata,
  124. ::server_on_recv_initial_metadata, elem,
  125. grpc_schedule_on_exec_ctx);
  126. GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready,
  127. server_recv_trailing_metadata_ready, elem,
  128. grpc_schedule_on_exec_ctx);
  129. }
  130. ~call_data() {
  131. GPR_ASSERT(state != PENDING);
  132. GRPC_ERROR_UNREF(recv_initial_metadata_error);
  133. if (host_set) {
  134. grpc_slice_unref_internal(host);
  135. }
  136. if (path_set) {
  137. grpc_slice_unref_internal(path);
  138. }
  139. grpc_metadata_array_destroy(&initial_metadata);
  140. grpc_byte_buffer_destroy(payload);
  141. }
  142. grpc_call* call;
  143. gpr_atm state = NOT_STARTED;
  144. bool path_set = false;
  145. bool host_set = false;
  146. grpc_slice path;
  147. grpc_slice host;
  148. grpc_millis deadline = GRPC_MILLIS_INF_FUTURE;
  149. grpc_completion_queue* cq_new = nullptr;
  150. grpc_metadata_batch* recv_initial_metadata = nullptr;
  151. uint32_t recv_initial_metadata_flags = 0;
  152. grpc_metadata_array initial_metadata =
  153. grpc_metadata_array(); // Zero-initialize the C struct.
  154. request_matcher* matcher = nullptr;
  155. grpc_byte_buffer* payload = nullptr;
  156. grpc_closure got_initial_metadata;
  157. grpc_closure server_on_recv_initial_metadata;
  158. grpc_closure kill_zombie_closure;
  159. grpc_closure* on_done_recv_initial_metadata;
  160. grpc_closure recv_trailing_metadata_ready;
  161. grpc_error* recv_initial_metadata_error = GRPC_ERROR_NONE;
  162. grpc_closure* original_recv_trailing_metadata_ready;
  163. grpc_error* recv_trailing_metadata_error = GRPC_ERROR_NONE;
  164. bool seen_recv_trailing_metadata_ready = false;
  165. grpc_closure publish;
  166. call_data* pending_next = nullptr;
  167. grpc_core::CallCombiner* call_combiner;
  168. };
  169. struct request_matcher {
  170. grpc_server* server;
  171. call_data* pending_head;
  172. call_data* pending_tail;
  173. gpr_locked_mpscq* requests_per_cq;
  174. };
  175. struct registered_method {
  176. char* method;
  177. char* host;
  178. grpc_server_register_method_payload_handling payload_handling;
  179. uint32_t flags;
  180. /* one request matcher per method */
  181. request_matcher matcher;
  182. registered_method* next;
  183. };
  184. typedef struct {
  185. grpc_channel** channels;
  186. size_t num_channels;
  187. } channel_broadcaster;
  188. } // namespace
  189. struct grpc_server {
  190. grpc_channel_args* channel_args;
  191. grpc_resource_user* default_resource_user;
  192. grpc_completion_queue** cqs;
  193. grpc_pollset** pollsets;
  194. size_t cq_count;
  195. size_t pollset_count;
  196. bool started;
  197. /* The two following mutexes control access to server-state
  198. mu_global controls access to non-call-related state (e.g., channel state)
  199. mu_call controls access to call-related state (e.g., the call lists)
  200. If they are ever required to be nested, you must lock mu_global
  201. before mu_call. This is currently used in shutdown processing
  202. (grpc_server_shutdown_and_notify and maybe_finish_shutdown) */
  203. gpr_mu mu_global; /* mutex for server and channel state */
  204. gpr_mu mu_call; /* mutex for call-specific state */
  205. /* startup synchronization: flag is protected by mu_global, signals whether
  206. we are doing the listener start routine or not */
  207. bool starting;
  208. gpr_cv starting_cv;
  209. registered_method* registered_methods;
  210. /** one request matcher for unregistered methods */
  211. request_matcher unregistered_request_matcher;
  212. gpr_atm shutdown_flag;
  213. uint8_t shutdown_published;
  214. size_t num_shutdown_tags;
  215. shutdown_tag* shutdown_tags;
  216. channel_data root_channel_data;
  217. listener* listeners;
  218. int listeners_destroyed;
  219. grpc_core::RefCount internal_refcount;
  220. /** when did we print the last shutdown progress message */
  221. gpr_timespec last_shutdown_message_time;
  222. grpc_core::RefCountedPtr<grpc_core::channelz::ServerNode> channelz_server;
  223. };
  224. #define SERVER_FROM_CALL_ELEM(elem) \
  225. (((channel_data*)(elem)->channel_data)->server)
  226. static void publish_new_rpc(void* calld, grpc_error* error);
  227. static void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
  228. grpc_error* error);
  229. /* Before calling maybe_finish_shutdown, we must hold mu_global and not
  230. hold mu_call */
  231. static void maybe_finish_shutdown(grpc_server* server);
  232. /*
  233. * channel broadcaster
  234. */
  235. /* assumes server locked */
  236. static void channel_broadcaster_init(grpc_server* s, channel_broadcaster* cb) {
  237. channel_data* c;
  238. size_t count = 0;
  239. for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
  240. count++;
  241. }
  242. cb->num_channels = count;
  243. cb->channels = static_cast<grpc_channel**>(
  244. gpr_malloc(sizeof(*cb->channels) * cb->num_channels));
  245. count = 0;
  246. for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
  247. cb->channels[count++] = c->channel;
  248. GRPC_CHANNEL_INTERNAL_REF(c->channel, "broadcast");
  249. }
  250. }
  251. struct shutdown_cleanup_args {
  252. grpc_closure closure;
  253. grpc_slice slice;
  254. };
  255. static void shutdown_cleanup(void* arg, grpc_error* error) {
  256. struct shutdown_cleanup_args* a =
  257. static_cast<struct shutdown_cleanup_args*>(arg);
  258. grpc_slice_unref_internal(a->slice);
  259. gpr_free(a);
  260. }
  261. static void send_shutdown(grpc_channel* channel, bool send_goaway,
  262. grpc_error* send_disconnect) {
  263. struct shutdown_cleanup_args* sc =
  264. static_cast<struct shutdown_cleanup_args*>(gpr_malloc(sizeof(*sc)));
  265. GRPC_CLOSURE_INIT(&sc->closure, shutdown_cleanup, sc,
  266. grpc_schedule_on_exec_ctx);
  267. grpc_transport_op* op = grpc_make_transport_op(&sc->closure);
  268. grpc_channel_element* elem;
  269. op->goaway_error =
  270. send_goaway ? grpc_error_set_int(
  271. GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"),
  272. GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_OK)
  273. : GRPC_ERROR_NONE;
  274. op->set_accept_stream = true;
  275. sc->slice = grpc_slice_from_copied_string("Server shutdown");
  276. op->disconnect_with_error = send_disconnect;
  277. elem = grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
  278. elem->filter->start_transport_op(elem, op);
  279. }
  280. static void channel_broadcaster_shutdown(channel_broadcaster* cb,
  281. bool send_goaway,
  282. grpc_error* force_disconnect) {
  283. size_t i;
  284. for (i = 0; i < cb->num_channels; i++) {
  285. send_shutdown(cb->channels[i], send_goaway,
  286. GRPC_ERROR_REF(force_disconnect));
  287. GRPC_CHANNEL_INTERNAL_UNREF(cb->channels[i], "broadcast");
  288. }
  289. gpr_free(cb->channels);
  290. GRPC_ERROR_UNREF(force_disconnect);
  291. }
  292. /*
  293. * request_matcher
  294. */
  295. static void request_matcher_init(request_matcher* rm, grpc_server* server) {
  296. rm->server = server;
  297. rm->pending_head = rm->pending_tail = nullptr;
  298. rm->requests_per_cq = static_cast<gpr_locked_mpscq*>(
  299. gpr_malloc(sizeof(*rm->requests_per_cq) * server->cq_count));
  300. for (size_t i = 0; i < server->cq_count; i++) {
  301. gpr_locked_mpscq_init(&rm->requests_per_cq[i]);
  302. }
  303. }
  304. static void request_matcher_destroy(request_matcher* rm) {
  305. for (size_t i = 0; i < rm->server->cq_count; i++) {
  306. GPR_ASSERT(gpr_locked_mpscq_pop(&rm->requests_per_cq[i]) == nullptr);
  307. gpr_locked_mpscq_destroy(&rm->requests_per_cq[i]);
  308. }
  309. gpr_free(rm->requests_per_cq);
  310. }
  311. static void kill_zombie(void* elem, grpc_error* error) {
  312. grpc_call_unref(
  313. grpc_call_from_top_element(static_cast<grpc_call_element*>(elem)));
  314. }
  315. static void request_matcher_zombify_all_pending_calls(request_matcher* rm) {
  316. while (rm->pending_head) {
  317. call_data* calld = rm->pending_head;
  318. rm->pending_head = calld->pending_next;
  319. gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
  320. GRPC_CLOSURE_INIT(
  321. &calld->kill_zombie_closure, kill_zombie,
  322. grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
  323. grpc_schedule_on_exec_ctx);
  324. GRPC_CLOSURE_SCHED(&calld->kill_zombie_closure, GRPC_ERROR_NONE);
  325. }
  326. }
  327. static void request_matcher_kill_requests(grpc_server* server,
  328. request_matcher* rm,
  329. grpc_error* error) {
  330. requested_call* rc;
  331. for (size_t i = 0; i < server->cq_count; i++) {
  332. while ((rc = reinterpret_cast<requested_call*>(
  333. gpr_locked_mpscq_pop(&rm->requests_per_cq[i]))) != nullptr) {
  334. fail_call(server, i, rc, GRPC_ERROR_REF(error));
  335. }
  336. }
  337. GRPC_ERROR_UNREF(error);
  338. }
  339. /*
  340. * server proper
  341. */
  342. static void server_ref(grpc_server* server) { server->internal_refcount.Ref(); }
  343. static void server_delete(grpc_server* server) {
  344. registered_method* rm;
  345. size_t i;
  346. server->channelz_server.reset();
  347. grpc_channel_args_destroy(server->channel_args);
  348. gpr_mu_destroy(&server->mu_global);
  349. gpr_mu_destroy(&server->mu_call);
  350. gpr_cv_destroy(&server->starting_cv);
  351. while ((rm = server->registered_methods) != nullptr) {
  352. server->registered_methods = rm->next;
  353. if (server->started) {
  354. request_matcher_destroy(&rm->matcher);
  355. }
  356. gpr_free(rm->method);
  357. gpr_free(rm->host);
  358. gpr_free(rm);
  359. }
  360. if (server->started) {
  361. request_matcher_destroy(&server->unregistered_request_matcher);
  362. }
  363. for (i = 0; i < server->cq_count; i++) {
  364. GRPC_CQ_INTERNAL_UNREF(server->cqs[i], "server");
  365. }
  366. gpr_free(server->cqs);
  367. gpr_free(server->pollsets);
  368. gpr_free(server->shutdown_tags);
  369. gpr_free(server);
  370. }
  371. static void server_unref(grpc_server* server) {
  372. if (GPR_UNLIKELY(server->internal_refcount.Unref())) {
  373. server_delete(server);
  374. }
  375. }
  376. static int is_channel_orphaned(channel_data* chand) {
  377. return chand->next == chand;
  378. }
  379. static void orphan_channel(channel_data* chand) {
  380. chand->next->prev = chand->prev;
  381. chand->prev->next = chand->next;
  382. chand->next = chand->prev = chand;
  383. }
  384. static void finish_destroy_channel(void* cd, grpc_error* error) {
  385. channel_data* chand = static_cast<channel_data*>(cd);
  386. grpc_server* server = chand->server;
  387. GRPC_CHANNEL_INTERNAL_UNREF(chand->channel, "server");
  388. server_unref(server);
  389. }
  390. static void destroy_channel(channel_data* chand, grpc_error* error) {
  391. if (is_channel_orphaned(chand)) return;
  392. GPR_ASSERT(chand->server != nullptr);
  393. orphan_channel(chand);
  394. server_ref(chand->server);
  395. maybe_finish_shutdown(chand->server);
  396. GRPC_CLOSURE_INIT(&chand->finish_destroy_channel_closure,
  397. finish_destroy_channel, chand, grpc_schedule_on_exec_ctx);
  398. if (GRPC_TRACE_FLAG_ENABLED(grpc_server_channel_trace) &&
  399. error != GRPC_ERROR_NONE) {
  400. const char* msg = grpc_error_string(error);
  401. gpr_log(GPR_INFO, "Disconnected client: %s", msg);
  402. }
  403. GRPC_ERROR_UNREF(error);
  404. grpc_transport_op* op =
  405. grpc_make_transport_op(&chand->finish_destroy_channel_closure);
  406. op->set_accept_stream = true;
  407. grpc_channel_next_op(grpc_channel_stack_element(
  408. grpc_channel_get_channel_stack(chand->channel), 0),
  409. op);
  410. }
  411. static void done_request_event(void* req, grpc_cq_completion* c) {
  412. gpr_free(req);
  413. }
  414. static void publish_call(grpc_server* server, call_data* calld, size_t cq_idx,
  415. requested_call* rc) {
  416. grpc_call_set_completion_queue(calld->call, rc->cq_bound_to_call);
  417. grpc_call* call = calld->call;
  418. *rc->call = call;
  419. calld->cq_new = server->cqs[cq_idx];
  420. GPR_SWAP(grpc_metadata_array, *rc->initial_metadata, calld->initial_metadata);
  421. switch (rc->type) {
  422. case BATCH_CALL:
  423. GPR_ASSERT(calld->host_set);
  424. GPR_ASSERT(calld->path_set);
  425. rc->data.batch.details->host = grpc_slice_ref_internal(calld->host);
  426. rc->data.batch.details->method = grpc_slice_ref_internal(calld->path);
  427. rc->data.batch.details->deadline =
  428. grpc_millis_to_timespec(calld->deadline, GPR_CLOCK_MONOTONIC);
  429. rc->data.batch.details->flags = calld->recv_initial_metadata_flags;
  430. break;
  431. case REGISTERED_CALL:
  432. *rc->data.registered.deadline =
  433. grpc_millis_to_timespec(calld->deadline, GPR_CLOCK_MONOTONIC);
  434. if (rc->data.registered.optional_payload) {
  435. *rc->data.registered.optional_payload = calld->payload;
  436. calld->payload = nullptr;
  437. }
  438. break;
  439. default:
  440. GPR_UNREACHABLE_CODE(return );
  441. }
  442. grpc_cq_end_op(calld->cq_new, rc->tag, GRPC_ERROR_NONE, done_request_event,
  443. rc, &rc->completion, true);
  444. }
  445. static void publish_new_rpc(void* arg, grpc_error* error) {
  446. grpc_call_element* call_elem = static_cast<grpc_call_element*>(arg);
  447. call_data* calld = static_cast<call_data*>(call_elem->call_data);
  448. channel_data* chand = static_cast<channel_data*>(call_elem->channel_data);
  449. request_matcher* rm = calld->matcher;
  450. grpc_server* server = rm->server;
  451. if (error != GRPC_ERROR_NONE || gpr_atm_acq_load(&server->shutdown_flag)) {
  452. gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
  453. GRPC_CLOSURE_INIT(
  454. &calld->kill_zombie_closure, kill_zombie,
  455. grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
  456. grpc_schedule_on_exec_ctx);
  457. GRPC_CLOSURE_SCHED(&calld->kill_zombie_closure, GRPC_ERROR_REF(error));
  458. return;
  459. }
  460. for (size_t i = 0; i < server->cq_count; i++) {
  461. size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
  462. requested_call* rc = reinterpret_cast<requested_call*>(
  463. gpr_locked_mpscq_try_pop(&rm->requests_per_cq[cq_idx]));
  464. if (rc == nullptr) {
  465. continue;
  466. } else {
  467. GRPC_STATS_INC_SERVER_CQS_CHECKED(i);
  468. gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
  469. publish_call(server, calld, cq_idx, rc);
  470. return; /* early out */
  471. }
  472. }
  473. /* no cq to take the request found: queue it on the slow list */
  474. GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED();
  475. gpr_mu_lock(&server->mu_call);
  476. // We need to ensure that all the queues are empty. We do this under
  477. // the server mu_call lock to ensure that if something is added to
  478. // an empty request queue, it will block until the call is actually
  479. // added to the pending list.
  480. for (size_t i = 0; i < server->cq_count; i++) {
  481. size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
  482. requested_call* rc = reinterpret_cast<requested_call*>(
  483. gpr_locked_mpscq_pop(&rm->requests_per_cq[cq_idx]));
  484. if (rc == nullptr) {
  485. continue;
  486. } else {
  487. gpr_mu_unlock(&server->mu_call);
  488. GRPC_STATS_INC_SERVER_CQS_CHECKED(i + server->cq_count);
  489. gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
  490. publish_call(server, calld, cq_idx, rc);
  491. return; /* early out */
  492. }
  493. }
  494. gpr_atm_no_barrier_store(&calld->state, PENDING);
  495. if (rm->pending_head == nullptr) {
  496. rm->pending_tail = rm->pending_head = calld;
  497. } else {
  498. rm->pending_tail->pending_next = calld;
  499. rm->pending_tail = calld;
  500. }
  501. calld->pending_next = nullptr;
  502. gpr_mu_unlock(&server->mu_call);
  503. }
  504. static void finish_start_new_rpc(
  505. grpc_server* server, grpc_call_element* elem, request_matcher* rm,
  506. grpc_server_register_method_payload_handling payload_handling) {
  507. call_data* calld = static_cast<call_data*>(elem->call_data);
  508. if (gpr_atm_acq_load(&server->shutdown_flag)) {
  509. gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
  510. GRPC_CLOSURE_INIT(&calld->kill_zombie_closure, kill_zombie, elem,
  511. grpc_schedule_on_exec_ctx);
  512. GRPC_CLOSURE_SCHED(&calld->kill_zombie_closure, GRPC_ERROR_NONE);
  513. return;
  514. }
  515. calld->matcher = rm;
  516. switch (payload_handling) {
  517. case GRPC_SRM_PAYLOAD_NONE:
  518. publish_new_rpc(elem, GRPC_ERROR_NONE);
  519. break;
  520. case GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER: {
  521. grpc_op op;
  522. op.op = GRPC_OP_RECV_MESSAGE;
  523. op.flags = 0;
  524. op.reserved = nullptr;
  525. op.data.recv_message.recv_message = &calld->payload;
  526. GRPC_CLOSURE_INIT(&calld->publish, publish_new_rpc, elem,
  527. grpc_schedule_on_exec_ctx);
  528. grpc_call_start_batch_and_execute(calld->call, &op, 1, &calld->publish);
  529. break;
  530. }
  531. }
  532. }
  533. static void start_new_rpc(grpc_call_element* elem) {
  534. channel_data* chand = static_cast<channel_data*>(elem->channel_data);
  535. call_data* calld = static_cast<call_data*>(elem->call_data);
  536. grpc_server* server = chand->server;
  537. uint32_t i;
  538. uint32_t hash;
  539. channel_registered_method* rm;
  540. if (chand->registered_methods && calld->path_set && calld->host_set) {
  541. /* TODO(ctiller): unify these two searches */
  542. /* check for an exact match with host */
  543. hash = GRPC_MDSTR_KV_HASH(grpc_slice_hash_internal(calld->host),
  544. grpc_slice_hash_internal(calld->path));
  545. for (i = 0; i <= chand->registered_method_max_probes; i++) {
  546. rm = &chand->registered_methods[(hash + i) %
  547. chand->registered_method_slots];
  548. if (!rm) break;
  549. if (!rm->has_host) continue;
  550. if (!grpc_slice_eq(rm->host, calld->host)) continue;
  551. if (!grpc_slice_eq(rm->method, calld->path)) continue;
  552. if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
  553. 0 == (calld->recv_initial_metadata_flags &
  554. GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
  555. continue;
  556. }
  557. finish_start_new_rpc(server, elem, &rm->server_registered_method->matcher,
  558. rm->server_registered_method->payload_handling);
  559. return;
  560. }
  561. /* check for a wildcard method definition (no host set) */
  562. hash = GRPC_MDSTR_KV_HASH(0, grpc_slice_hash_internal(calld->path));
  563. for (i = 0; i <= chand->registered_method_max_probes; i++) {
  564. rm = &chand->registered_methods[(hash + i) %
  565. chand->registered_method_slots];
  566. if (!rm) break;
  567. if (rm->has_host) continue;
  568. if (!grpc_slice_eq(rm->method, calld->path)) continue;
  569. if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
  570. 0 == (calld->recv_initial_metadata_flags &
  571. GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
  572. continue;
  573. }
  574. finish_start_new_rpc(server, elem, &rm->server_registered_method->matcher,
  575. rm->server_registered_method->payload_handling);
  576. return;
  577. }
  578. }
  579. finish_start_new_rpc(server, elem, &server->unregistered_request_matcher,
  580. GRPC_SRM_PAYLOAD_NONE);
  581. }
  582. static int num_listeners(grpc_server* server) {
  583. listener* l;
  584. int n = 0;
  585. for (l = server->listeners; l; l = l->next) {
  586. n++;
  587. }
  588. return n;
  589. }
  590. static void done_shutdown_event(void* server, grpc_cq_completion* completion) {
  591. server_unref(static_cast<grpc_server*>(server));
  592. }
  593. static int num_channels(grpc_server* server) {
  594. channel_data* chand;
  595. int n = 0;
  596. for (chand = server->root_channel_data.next;
  597. chand != &server->root_channel_data; chand = chand->next) {
  598. n++;
  599. }
  600. return n;
  601. }
  602. static void kill_pending_work_locked(grpc_server* server, grpc_error* error) {
  603. if (server->started) {
  604. request_matcher_kill_requests(server, &server->unregistered_request_matcher,
  605. GRPC_ERROR_REF(error));
  606. request_matcher_zombify_all_pending_calls(
  607. &server->unregistered_request_matcher);
  608. for (registered_method* rm = server->registered_methods; rm;
  609. rm = rm->next) {
  610. request_matcher_kill_requests(server, &rm->matcher,
  611. GRPC_ERROR_REF(error));
  612. request_matcher_zombify_all_pending_calls(&rm->matcher);
  613. }
  614. }
  615. GRPC_ERROR_UNREF(error);
  616. }
  617. static void maybe_finish_shutdown(grpc_server* server) {
  618. size_t i;
  619. if (!gpr_atm_acq_load(&server->shutdown_flag) || server->shutdown_published) {
  620. return;
  621. }
  622. gpr_mu_lock(&server->mu_call);
  623. kill_pending_work_locked(
  624. server, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
  625. gpr_mu_unlock(&server->mu_call);
  626. if (server->root_channel_data.next != &server->root_channel_data ||
  627. server->listeners_destroyed < num_listeners(server)) {
  628. if (gpr_time_cmp(gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME),
  629. server->last_shutdown_message_time),
  630. gpr_time_from_seconds(1, GPR_TIMESPAN)) >= 0) {
  631. server->last_shutdown_message_time = gpr_now(GPR_CLOCK_REALTIME);
  632. gpr_log(GPR_DEBUG,
  633. "Waiting for %d channels and %d/%d listeners to be destroyed"
  634. " before shutting down server",
  635. num_channels(server),
  636. num_listeners(server) - server->listeners_destroyed,
  637. num_listeners(server));
  638. }
  639. return;
  640. }
  641. server->shutdown_published = 1;
  642. for (i = 0; i < server->num_shutdown_tags; i++) {
  643. server_ref(server);
  644. grpc_cq_end_op(server->shutdown_tags[i].cq, server->shutdown_tags[i].tag,
  645. GRPC_ERROR_NONE, done_shutdown_event, server,
  646. &server->shutdown_tags[i].completion);
  647. }
  648. }
  649. static void server_on_recv_initial_metadata(void* ptr, grpc_error* error) {
  650. grpc_call_element* elem = static_cast<grpc_call_element*>(ptr);
  651. call_data* calld = static_cast<call_data*>(elem->call_data);
  652. grpc_millis op_deadline;
  653. if (error == GRPC_ERROR_NONE) {
  654. GPR_ASSERT(calld->recv_initial_metadata->idx.named.path != nullptr);
  655. GPR_ASSERT(calld->recv_initial_metadata->idx.named.authority != nullptr);
  656. calld->path = grpc_slice_ref_internal(
  657. GRPC_MDVALUE(calld->recv_initial_metadata->idx.named.path->md));
  658. calld->host = grpc_slice_ref_internal(
  659. GRPC_MDVALUE(calld->recv_initial_metadata->idx.named.authority->md));
  660. calld->path_set = true;
  661. calld->host_set = true;
  662. grpc_metadata_batch_remove(calld->recv_initial_metadata,
  663. calld->recv_initial_metadata->idx.named.path);
  664. grpc_metadata_batch_remove(
  665. calld->recv_initial_metadata,
  666. calld->recv_initial_metadata->idx.named.authority);
  667. } else {
  668. GRPC_ERROR_REF(error);
  669. }
  670. op_deadline = calld->recv_initial_metadata->deadline;
  671. if (op_deadline != GRPC_MILLIS_INF_FUTURE) {
  672. calld->deadline = op_deadline;
  673. }
  674. if (calld->host_set && calld->path_set) {
  675. /* do nothing */
  676. } else {
  677. /* Pass the error reference to calld->recv_initial_metadata_error */
  678. grpc_error* src_error = error;
  679. error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
  680. "Missing :authority or :path", &src_error, 1);
  681. GRPC_ERROR_UNREF(src_error);
  682. calld->recv_initial_metadata_error = GRPC_ERROR_REF(error);
  683. }
  684. grpc_closure* closure = calld->on_done_recv_initial_metadata;
  685. calld->on_done_recv_initial_metadata = nullptr;
  686. if (calld->seen_recv_trailing_metadata_ready) {
  687. GRPC_CALL_COMBINER_START(calld->call_combiner,
  688. &calld->recv_trailing_metadata_ready,
  689. calld->recv_trailing_metadata_error,
  690. "continue server_recv_trailing_metadata_ready");
  691. }
  692. GRPC_CLOSURE_RUN(closure, error);
  693. }
  694. static void server_recv_trailing_metadata_ready(void* user_data,
  695. grpc_error* error) {
  696. grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
  697. call_data* calld = static_cast<call_data*>(elem->call_data);
  698. if (calld->on_done_recv_initial_metadata != nullptr) {
  699. calld->recv_trailing_metadata_error = GRPC_ERROR_REF(error);
  700. calld->seen_recv_trailing_metadata_ready = true;
  701. GRPC_CLOSURE_INIT(&calld->recv_trailing_metadata_ready,
  702. server_recv_trailing_metadata_ready, elem,
  703. grpc_schedule_on_exec_ctx);
  704. GRPC_CALL_COMBINER_STOP(calld->call_combiner,
  705. "deferring server_recv_trailing_metadata_ready "
  706. "until after server_on_recv_initial_metadata");
  707. return;
  708. }
  709. error =
  710. grpc_error_add_child(GRPC_ERROR_REF(error),
  711. GRPC_ERROR_REF(calld->recv_initial_metadata_error));
  712. GRPC_CLOSURE_RUN(calld->original_recv_trailing_metadata_ready, error);
  713. }
  714. static void server_mutate_op(grpc_call_element* elem,
  715. grpc_transport_stream_op_batch* op) {
  716. call_data* calld = static_cast<call_data*>(elem->call_data);
  717. if (op->recv_initial_metadata) {
  718. GPR_ASSERT(op->payload->recv_initial_metadata.recv_flags == nullptr);
  719. calld->recv_initial_metadata =
  720. op->payload->recv_initial_metadata.recv_initial_metadata;
  721. calld->on_done_recv_initial_metadata =
  722. op->payload->recv_initial_metadata.recv_initial_metadata_ready;
  723. op->payload->recv_initial_metadata.recv_initial_metadata_ready =
  724. &calld->server_on_recv_initial_metadata;
  725. op->payload->recv_initial_metadata.recv_flags =
  726. &calld->recv_initial_metadata_flags;
  727. }
  728. if (op->recv_trailing_metadata) {
  729. calld->original_recv_trailing_metadata_ready =
  730. op->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
  731. op->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
  732. &calld->recv_trailing_metadata_ready;
  733. }
  734. }
  735. static void server_start_transport_stream_op_batch(
  736. grpc_call_element* elem, grpc_transport_stream_op_batch* op) {
  737. server_mutate_op(elem, op);
  738. grpc_call_next_op(elem, op);
  739. }
  740. static void got_initial_metadata(void* ptr, grpc_error* error) {
  741. grpc_call_element* elem = static_cast<grpc_call_element*>(ptr);
  742. call_data* calld = static_cast<call_data*>(elem->call_data);
  743. if (error == GRPC_ERROR_NONE) {
  744. start_new_rpc(elem);
  745. } else {
  746. if (gpr_atm_full_cas(&calld->state, NOT_STARTED, ZOMBIED)) {
  747. GRPC_CLOSURE_INIT(&calld->kill_zombie_closure, kill_zombie, elem,
  748. grpc_schedule_on_exec_ctx);
  749. GRPC_CLOSURE_SCHED(&calld->kill_zombie_closure, GRPC_ERROR_NONE);
  750. } else if (gpr_atm_full_cas(&calld->state, PENDING, ZOMBIED)) {
  751. /* zombied call will be destroyed when it's removed from the pending
  752. queue... later */
  753. }
  754. }
  755. }
  756. static void accept_stream(void* cd, grpc_transport* transport,
  757. const void* transport_server_data) {
  758. channel_data* chand = static_cast<channel_data*>(cd);
  759. /* create a call */
  760. grpc_call_create_args args;
  761. args.channel = chand->channel;
  762. args.server = chand->server;
  763. args.parent = nullptr;
  764. args.propagation_mask = 0;
  765. args.cq = nullptr;
  766. args.pollset_set_alternative = nullptr;
  767. args.server_transport_data = transport_server_data;
  768. args.add_initial_metadata = nullptr;
  769. args.add_initial_metadata_count = 0;
  770. args.send_deadline = GRPC_MILLIS_INF_FUTURE;
  771. grpc_call* call;
  772. grpc_error* error = grpc_call_create(&args, &call);
  773. grpc_call_element* elem =
  774. grpc_call_stack_element(grpc_call_get_call_stack(call), 0);
  775. if (error != GRPC_ERROR_NONE) {
  776. got_initial_metadata(elem, error);
  777. GRPC_ERROR_UNREF(error);
  778. return;
  779. }
  780. call_data* calld = static_cast<call_data*>(elem->call_data);
  781. grpc_op op;
  782. op.op = GRPC_OP_RECV_INITIAL_METADATA;
  783. op.flags = 0;
  784. op.reserved = nullptr;
  785. op.data.recv_initial_metadata.recv_initial_metadata =
  786. &calld->initial_metadata;
  787. GRPC_CLOSURE_INIT(&calld->got_initial_metadata, got_initial_metadata, elem,
  788. grpc_schedule_on_exec_ctx);
  789. grpc_call_start_batch_and_execute(call, &op, 1, &calld->got_initial_metadata);
  790. }
  791. static void channel_connectivity_changed(void* cd, grpc_error* error) {
  792. channel_data* chand = static_cast<channel_data*>(cd);
  793. grpc_server* server = chand->server;
  794. if (chand->connectivity_state != GRPC_CHANNEL_SHUTDOWN) {
  795. grpc_transport_op* op = grpc_make_transport_op(nullptr);
  796. op->on_connectivity_state_change = &chand->channel_connectivity_changed;
  797. op->connectivity_state = &chand->connectivity_state;
  798. grpc_channel_next_op(grpc_channel_stack_element(
  799. grpc_channel_get_channel_stack(chand->channel), 0),
  800. op);
  801. } else {
  802. gpr_mu_lock(&server->mu_global);
  803. destroy_channel(chand, GRPC_ERROR_REF(error));
  804. gpr_mu_unlock(&server->mu_global);
  805. GRPC_CHANNEL_INTERNAL_UNREF(chand->channel, "connectivity");
  806. }
  807. }
  808. static grpc_error* init_call_elem(grpc_call_element* elem,
  809. const grpc_call_element_args* args) {
  810. channel_data* chand = static_cast<channel_data*>(elem->channel_data);
  811. server_ref(chand->server);
  812. new (elem->call_data) call_data(elem, *args);
  813. return GRPC_ERROR_NONE;
  814. }
  815. static void destroy_call_elem(grpc_call_element* elem,
  816. const grpc_call_final_info* final_info,
  817. grpc_closure* ignored) {
  818. call_data* calld = static_cast<call_data*>(elem->call_data);
  819. calld->~call_data();
  820. channel_data* chand = static_cast<channel_data*>(elem->channel_data);
  821. server_unref(chand->server);
  822. }
  823. static grpc_error* init_channel_elem(grpc_channel_element* elem,
  824. grpc_channel_element_args* args) {
  825. channel_data* chand = static_cast<channel_data*>(elem->channel_data);
  826. GPR_ASSERT(args->is_first);
  827. GPR_ASSERT(!args->is_last);
  828. chand->server = nullptr;
  829. chand->channel = nullptr;
  830. chand->next = chand->prev = chand;
  831. chand->registered_methods = nullptr;
  832. chand->connectivity_state = GRPC_CHANNEL_IDLE;
  833. GRPC_CLOSURE_INIT(&chand->channel_connectivity_changed,
  834. channel_connectivity_changed, chand,
  835. grpc_schedule_on_exec_ctx);
  836. return GRPC_ERROR_NONE;
  837. }
  838. static void destroy_channel_elem(grpc_channel_element* elem) {
  839. size_t i;
  840. channel_data* chand = static_cast<channel_data*>(elem->channel_data);
  841. if (chand->registered_methods) {
  842. for (i = 0; i < chand->registered_method_slots; i++) {
  843. grpc_slice_unref_internal(chand->registered_methods[i].method);
  844. if (chand->registered_methods[i].has_host) {
  845. grpc_slice_unref_internal(chand->registered_methods[i].host);
  846. }
  847. }
  848. gpr_free(chand->registered_methods);
  849. }
  850. if (chand->server) {
  851. if (chand->server->channelz_server != nullptr &&
  852. chand->channelz_socket_uuid != 0) {
  853. chand->server->channelz_server->RemoveChildSocket(
  854. chand->channelz_socket_uuid);
  855. }
  856. gpr_mu_lock(&chand->server->mu_global);
  857. chand->next->prev = chand->prev;
  858. chand->prev->next = chand->next;
  859. chand->next = chand->prev = chand;
  860. maybe_finish_shutdown(chand->server);
  861. gpr_mu_unlock(&chand->server->mu_global);
  862. server_unref(chand->server);
  863. }
  864. }
  865. const grpc_channel_filter grpc_server_top_filter = {
  866. server_start_transport_stream_op_batch,
  867. grpc_channel_next_op,
  868. sizeof(call_data),
  869. init_call_elem,
  870. grpc_call_stack_ignore_set_pollset_or_pollset_set,
  871. destroy_call_elem,
  872. sizeof(channel_data),
  873. init_channel_elem,
  874. destroy_channel_elem,
  875. grpc_channel_next_get_info,
  876. "server",
  877. };
  878. static void register_completion_queue(grpc_server* server,
  879. grpc_completion_queue* cq,
  880. void* reserved) {
  881. size_t i, n;
  882. GPR_ASSERT(!reserved);
  883. for (i = 0; i < server->cq_count; i++) {
  884. if (server->cqs[i] == cq) return;
  885. }
  886. GRPC_CQ_INTERNAL_REF(cq, "server");
  887. n = server->cq_count++;
  888. server->cqs = static_cast<grpc_completion_queue**>(gpr_realloc(
  889. server->cqs, server->cq_count * sizeof(grpc_completion_queue*)));
  890. server->cqs[n] = cq;
  891. }
  892. void grpc_server_register_completion_queue(grpc_server* server,
  893. grpc_completion_queue* cq,
  894. void* reserved) {
  895. GRPC_API_TRACE(
  896. "grpc_server_register_completion_queue(server=%p, cq=%p, reserved=%p)", 3,
  897. (server, cq, reserved));
  898. auto cq_type = grpc_get_cq_completion_type(cq);
  899. if (cq_type != GRPC_CQ_NEXT && cq_type != GRPC_CQ_CALLBACK) {
  900. gpr_log(GPR_INFO,
  901. "Completion queue of type %d is being registered as a "
  902. "server-completion-queue",
  903. static_cast<int>(cq_type));
  904. /* Ideally we should log an error and abort but ruby-wrapped-language API
  905. calls grpc_completion_queue_pluck() on server completion queues */
  906. }
  907. register_completion_queue(server, cq, reserved);
  908. }
  909. grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) {
  910. grpc_core::ExecCtx exec_ctx;
  911. GRPC_API_TRACE("grpc_server_create(%p, %p)", 2, (args, reserved));
  912. grpc_server* server =
  913. static_cast<grpc_server*>(gpr_zalloc(sizeof(grpc_server)));
  914. gpr_mu_init(&server->mu_global);
  915. gpr_mu_init(&server->mu_call);
  916. gpr_cv_init(&server->starting_cv);
  917. /* decremented by grpc_server_destroy */
  918. new (&server->internal_refcount) grpc_core::RefCount();
  919. server->root_channel_data.next = server->root_channel_data.prev =
  920. &server->root_channel_data;
  921. server->channel_args = grpc_channel_args_copy(args);
  922. const grpc_arg* arg = grpc_channel_args_find(args, GRPC_ARG_ENABLE_CHANNELZ);
  923. if (grpc_channel_arg_get_bool(arg, GRPC_ENABLE_CHANNELZ_DEFAULT)) {
  924. arg = grpc_channel_args_find(
  925. args, GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE);
  926. size_t channel_tracer_max_memory = grpc_channel_arg_get_integer(
  927. arg,
  928. {GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0, INT_MAX});
  929. server->channelz_server =
  930. grpc_core::MakeRefCounted<grpc_core::channelz::ServerNode>(
  931. server, channel_tracer_max_memory);
  932. server->channelz_server->AddTraceEvent(
  933. grpc_core::channelz::ChannelTrace::Severity::Info,
  934. grpc_slice_from_static_string("Server created"));
  935. }
  936. if (args != nullptr) {
  937. grpc_resource_quota* resource_quota =
  938. grpc_resource_quota_from_channel_args(args, false /* create */);
  939. if (resource_quota != nullptr) {
  940. server->default_resource_user =
  941. grpc_resource_user_create(resource_quota, "default");
  942. }
  943. }
  944. return server;
  945. }
  946. static int streq(const char* a, const char* b) {
  947. if (a == nullptr && b == nullptr) return 1;
  948. if (a == nullptr) return 0;
  949. if (b == nullptr) return 0;
  950. return 0 == strcmp(a, b);
  951. }
  952. void* grpc_server_register_method(
  953. grpc_server* server, const char* method, const char* host,
  954. grpc_server_register_method_payload_handling payload_handling,
  955. uint32_t flags) {
  956. registered_method* m;
  957. GRPC_API_TRACE(
  958. "grpc_server_register_method(server=%p, method=%s, host=%s, "
  959. "flags=0x%08x)",
  960. 4, (server, method, host, flags));
  961. if (!method) {
  962. gpr_log(GPR_ERROR,
  963. "grpc_server_register_method method string cannot be NULL");
  964. return nullptr;
  965. }
  966. for (m = server->registered_methods; m; m = m->next) {
  967. if (streq(m->method, method) && streq(m->host, host)) {
  968. gpr_log(GPR_ERROR, "duplicate registration for %s@%s", method,
  969. host ? host : "*");
  970. return nullptr;
  971. }
  972. }
  973. if ((flags & ~GRPC_INITIAL_METADATA_USED_MASK) != 0) {
  974. gpr_log(GPR_ERROR, "grpc_server_register_method invalid flags 0x%08x",
  975. flags);
  976. return nullptr;
  977. }
  978. m = static_cast<registered_method*>(gpr_zalloc(sizeof(registered_method)));
  979. m->method = gpr_strdup(method);
  980. m->host = gpr_strdup(host);
  981. m->next = server->registered_methods;
  982. m->payload_handling = payload_handling;
  983. m->flags = flags;
  984. server->registered_methods = m;
  985. return m;
  986. }
  987. void grpc_server_start(grpc_server* server) {
  988. size_t i;
  989. grpc_core::ExecCtx exec_ctx;
  990. GRPC_API_TRACE("grpc_server_start(server=%p)", 1, (server));
  991. server->started = true;
  992. server->pollset_count = 0;
  993. server->pollsets = static_cast<grpc_pollset**>(
  994. gpr_malloc(sizeof(grpc_pollset*) * server->cq_count));
  995. for (i = 0; i < server->cq_count; i++) {
  996. if (grpc_cq_can_listen(server->cqs[i])) {
  997. server->pollsets[server->pollset_count++] =
  998. grpc_cq_pollset(server->cqs[i]);
  999. }
  1000. }
  1001. request_matcher_init(&server->unregistered_request_matcher, server);
  1002. for (registered_method* rm = server->registered_methods; rm; rm = rm->next) {
  1003. request_matcher_init(&rm->matcher, server);
  1004. }
  1005. gpr_mu_lock(&server->mu_global);
  1006. server->starting = true;
  1007. gpr_mu_unlock(&server->mu_global);
  1008. for (listener* l = server->listeners; l; l = l->next) {
  1009. l->start(server, l->arg, server->pollsets, server->pollset_count);
  1010. }
  1011. gpr_mu_lock(&server->mu_global);
  1012. server->starting = false;
  1013. gpr_cv_signal(&server->starting_cv);
  1014. gpr_mu_unlock(&server->mu_global);
  1015. }
  1016. void grpc_server_get_pollsets(grpc_server* server, grpc_pollset*** pollsets,
  1017. size_t* pollset_count) {
  1018. *pollset_count = server->pollset_count;
  1019. *pollsets = server->pollsets;
  1020. }
  1021. void grpc_server_setup_transport(
  1022. grpc_server* s, grpc_transport* transport, grpc_pollset* accepting_pollset,
  1023. const grpc_channel_args* args,
  1024. const grpc_core::RefCountedPtr<grpc_core::channelz::SocketNode>&
  1025. socket_node,
  1026. grpc_resource_user* resource_user) {
  1027. size_t num_registered_methods;
  1028. size_t alloc;
  1029. registered_method* rm;
  1030. channel_registered_method* crm;
  1031. grpc_channel* channel;
  1032. channel_data* chand;
  1033. uint32_t hash;
  1034. size_t slots;
  1035. uint32_t probes;
  1036. uint32_t max_probes = 0;
  1037. grpc_transport_op* op = nullptr;
  1038. channel = grpc_channel_create(nullptr, args, GRPC_SERVER_CHANNEL, transport,
  1039. resource_user);
  1040. chand = static_cast<channel_data*>(
  1041. grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0)
  1042. ->channel_data);
  1043. chand->server = s;
  1044. server_ref(s);
  1045. chand->channel = channel;
  1046. if (socket_node != nullptr) {
  1047. chand->channelz_socket_uuid = socket_node->uuid();
  1048. s->channelz_server->AddChildSocket(socket_node);
  1049. } else {
  1050. chand->channelz_socket_uuid = 0;
  1051. }
  1052. size_t cq_idx;
  1053. for (cq_idx = 0; cq_idx < s->cq_count; cq_idx++) {
  1054. if (grpc_cq_pollset(s->cqs[cq_idx]) == accepting_pollset) break;
  1055. }
  1056. if (cq_idx == s->cq_count) {
  1057. /* completion queue not found: pick a random one to publish new calls to */
  1058. cq_idx = static_cast<size_t>(rand()) % s->cq_count;
  1059. }
  1060. chand->cq_idx = cq_idx;
  1061. num_registered_methods = 0;
  1062. for (rm = s->registered_methods; rm; rm = rm->next) {
  1063. num_registered_methods++;
  1064. }
  1065. /* build a lookup table phrased in terms of mdstr's in this channels context
  1066. to quickly find registered methods */
  1067. if (num_registered_methods > 0) {
  1068. slots = 2 * num_registered_methods;
  1069. alloc = sizeof(channel_registered_method) * slots;
  1070. chand->registered_methods =
  1071. static_cast<channel_registered_method*>(gpr_zalloc(alloc));
  1072. for (rm = s->registered_methods; rm; rm = rm->next) {
  1073. grpc_slice host;
  1074. bool has_host;
  1075. grpc_slice method;
  1076. if (rm->host != nullptr) {
  1077. host = grpc_slice_from_static_string(rm->host);
  1078. has_host = true;
  1079. } else {
  1080. has_host = false;
  1081. }
  1082. method = grpc_slice_from_static_string(rm->method);
  1083. hash = GRPC_MDSTR_KV_HASH(has_host ? grpc_slice_hash_internal(host) : 0,
  1084. grpc_slice_hash_internal(method));
  1085. for (probes = 0; chand->registered_methods[(hash + probes) % slots]
  1086. .server_registered_method != nullptr;
  1087. probes++)
  1088. ;
  1089. if (probes > max_probes) max_probes = probes;
  1090. crm = &chand->registered_methods[(hash + probes) % slots];
  1091. crm->server_registered_method = rm;
  1092. crm->flags = rm->flags;
  1093. crm->has_host = has_host;
  1094. if (has_host) {
  1095. crm->host = host;
  1096. }
  1097. crm->method = method;
  1098. }
  1099. GPR_ASSERT(slots <= UINT32_MAX);
  1100. chand->registered_method_slots = static_cast<uint32_t>(slots);
  1101. chand->registered_method_max_probes = max_probes;
  1102. }
  1103. gpr_mu_lock(&s->mu_global);
  1104. chand->next = &s->root_channel_data;
  1105. chand->prev = chand->next->prev;
  1106. chand->next->prev = chand->prev->next = chand;
  1107. gpr_mu_unlock(&s->mu_global);
  1108. GRPC_CHANNEL_INTERNAL_REF(channel, "connectivity");
  1109. op = grpc_make_transport_op(nullptr);
  1110. op->set_accept_stream = true;
  1111. op->set_accept_stream_fn = accept_stream;
  1112. op->set_accept_stream_user_data = chand;
  1113. op->on_connectivity_state_change = &chand->channel_connectivity_changed;
  1114. op->connectivity_state = &chand->connectivity_state;
  1115. if (gpr_atm_acq_load(&s->shutdown_flag) != 0) {
  1116. op->disconnect_with_error =
  1117. GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown");
  1118. }
  1119. grpc_transport_perform_op(transport, op);
  1120. }
  1121. void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) {
  1122. (void)done_arg;
  1123. gpr_free(storage);
  1124. }
  1125. static void listener_destroy_done(void* s, grpc_error* error) {
  1126. grpc_server* server = static_cast<grpc_server*>(s);
  1127. gpr_mu_lock(&server->mu_global);
  1128. server->listeners_destroyed++;
  1129. maybe_finish_shutdown(server);
  1130. gpr_mu_unlock(&server->mu_global);
  1131. }
  1132. /*
  1133. - Kills all pending requests-for-incoming-RPC-calls (i.e the requests made via
  1134. grpc_server_request_call and grpc_server_request_registered call will now be
  1135. cancelled). See 'kill_pending_work_locked()'
  1136. - Shuts down the listeners (i.e the server will no longer listen on the port
  1137. for new incoming channels).
  1138. - Iterates through all channels on the server and sends shutdown msg (see
  1139. 'channel_broadcaster_shutdown()' for details) to the clients via the
  1140. transport layer. The transport layer then guarantees the following:
  1141. -- Sends shutdown to the client (for eg: HTTP2 transport sends GOAWAY)
  1142. -- If the server has outstanding calls that are in the process, the
  1143. connection is NOT closed until the server is done with all those calls
  1144. -- Once, there are no more calls in progress, the channel is closed
  1145. */
  1146. void grpc_server_shutdown_and_notify(grpc_server* server,
  1147. grpc_completion_queue* cq, void* tag) {
  1148. listener* l;
  1149. shutdown_tag* sdt;
  1150. channel_broadcaster broadcaster;
  1151. grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
  1152. grpc_core::ExecCtx exec_ctx;
  1153. GRPC_API_TRACE("grpc_server_shutdown_and_notify(server=%p, cq=%p, tag=%p)", 3,
  1154. (server, cq, tag));
  1155. /* wait for startup to be finished: locks mu_global */
  1156. gpr_mu_lock(&server->mu_global);
  1157. while (server->starting) {
  1158. gpr_cv_wait(&server->starting_cv, &server->mu_global,
  1159. gpr_inf_future(GPR_CLOCK_MONOTONIC));
  1160. }
  1161. /* stay locked, and gather up some stuff to do */
  1162. GPR_ASSERT(grpc_cq_begin_op(cq, tag));
  1163. if (server->shutdown_published) {
  1164. grpc_cq_end_op(cq, tag, GRPC_ERROR_NONE, done_published_shutdown, nullptr,
  1165. static_cast<grpc_cq_completion*>(
  1166. gpr_malloc(sizeof(grpc_cq_completion))));
  1167. gpr_mu_unlock(&server->mu_global);
  1168. return;
  1169. }
  1170. server->shutdown_tags = static_cast<shutdown_tag*>(
  1171. gpr_realloc(server->shutdown_tags,
  1172. sizeof(shutdown_tag) * (server->num_shutdown_tags + 1)));
  1173. sdt = &server->shutdown_tags[server->num_shutdown_tags++];
  1174. sdt->tag = tag;
  1175. sdt->cq = cq;
  1176. if (gpr_atm_acq_load(&server->shutdown_flag)) {
  1177. gpr_mu_unlock(&server->mu_global);
  1178. return;
  1179. }
  1180. server->last_shutdown_message_time = gpr_now(GPR_CLOCK_REALTIME);
  1181. channel_broadcaster_init(server, &broadcaster);
  1182. gpr_atm_rel_store(&server->shutdown_flag, 1);
  1183. /* collect all unregistered then registered calls */
  1184. gpr_mu_lock(&server->mu_call);
  1185. kill_pending_work_locked(
  1186. server, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
  1187. gpr_mu_unlock(&server->mu_call);
  1188. maybe_finish_shutdown(server);
  1189. gpr_mu_unlock(&server->mu_global);
  1190. /* Shutdown listeners */
  1191. for (l = server->listeners; l; l = l->next) {
  1192. GRPC_CLOSURE_INIT(&l->destroy_done, listener_destroy_done, server,
  1193. grpc_schedule_on_exec_ctx);
  1194. l->destroy(server, l->arg, &l->destroy_done);
  1195. if (server->channelz_server != nullptr && l->socket_uuid != 0) {
  1196. server->channelz_server->RemoveChildListenSocket(l->socket_uuid);
  1197. }
  1198. }
  1199. channel_broadcaster_shutdown(&broadcaster, true /* send_goaway */,
  1200. GRPC_ERROR_NONE);
  1201. if (server->default_resource_user != nullptr) {
  1202. grpc_resource_quota_unref(
  1203. grpc_resource_user_quota(server->default_resource_user));
  1204. grpc_resource_user_shutdown(server->default_resource_user);
  1205. grpc_resource_user_unref(server->default_resource_user);
  1206. }
  1207. }
  1208. void grpc_server_cancel_all_calls(grpc_server* server) {
  1209. channel_broadcaster broadcaster;
  1210. grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
  1211. grpc_core::ExecCtx exec_ctx;
  1212. GRPC_API_TRACE("grpc_server_cancel_all_calls(server=%p)", 1, (server));
  1213. gpr_mu_lock(&server->mu_global);
  1214. channel_broadcaster_init(server, &broadcaster);
  1215. gpr_mu_unlock(&server->mu_global);
  1216. channel_broadcaster_shutdown(
  1217. &broadcaster, false /* send_goaway */,
  1218. GRPC_ERROR_CREATE_FROM_STATIC_STRING("Cancelling all calls"));
  1219. }
  1220. void grpc_server_destroy(grpc_server* server) {
  1221. listener* l;
  1222. grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
  1223. grpc_core::ExecCtx exec_ctx;
  1224. GRPC_API_TRACE("grpc_server_destroy(server=%p)", 1, (server));
  1225. gpr_mu_lock(&server->mu_global);
  1226. GPR_ASSERT(gpr_atm_acq_load(&server->shutdown_flag) || !server->listeners);
  1227. GPR_ASSERT(server->listeners_destroyed == num_listeners(server));
  1228. while (server->listeners) {
  1229. l = server->listeners;
  1230. server->listeners = l->next;
  1231. gpr_free(l);
  1232. }
  1233. gpr_mu_unlock(&server->mu_global);
  1234. server_unref(server);
  1235. }
  1236. void grpc_server_add_listener(
  1237. grpc_server* server, void* listener_arg,
  1238. void (*start)(grpc_server* server, void* arg, grpc_pollset** pollsets,
  1239. size_t pollset_count),
  1240. void (*destroy)(grpc_server* server, void* arg, grpc_closure* on_done),
  1241. grpc_core::RefCountedPtr<grpc_core::channelz::ListenSocketNode> node) {
  1242. listener* l = static_cast<listener*>(gpr_malloc(sizeof(listener)));
  1243. l->arg = listener_arg;
  1244. l->start = start;
  1245. l->destroy = destroy;
  1246. l->socket_uuid = 0;
  1247. if (node != nullptr) {
  1248. l->socket_uuid = node->uuid();
  1249. if (server->channelz_server != nullptr) {
  1250. server->channelz_server->AddChildListenSocket(std::move(node));
  1251. }
  1252. }
  1253. l->next = server->listeners;
  1254. server->listeners = l;
  1255. }
  1256. static grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx,
  1257. requested_call* rc) {
  1258. call_data* calld = nullptr;
  1259. request_matcher* rm = nullptr;
  1260. if (gpr_atm_acq_load(&server->shutdown_flag)) {
  1261. fail_call(server, cq_idx, rc,
  1262. GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
  1263. return GRPC_CALL_OK;
  1264. }
  1265. switch (rc->type) {
  1266. case BATCH_CALL:
  1267. rm = &server->unregistered_request_matcher;
  1268. break;
  1269. case REGISTERED_CALL:
  1270. rm = &rc->data.registered.method->matcher;
  1271. break;
  1272. }
  1273. if (gpr_locked_mpscq_push(&rm->requests_per_cq[cq_idx], &rc->request_link)) {
  1274. /* this was the first queued request: we need to lock and start
  1275. matching calls */
  1276. gpr_mu_lock(&server->mu_call);
  1277. while ((calld = rm->pending_head) != nullptr) {
  1278. rc = reinterpret_cast<requested_call*>(
  1279. gpr_locked_mpscq_pop(&rm->requests_per_cq[cq_idx]));
  1280. if (rc == nullptr) break;
  1281. rm->pending_head = calld->pending_next;
  1282. gpr_mu_unlock(&server->mu_call);
  1283. if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) {
  1284. // Zombied Call
  1285. GRPC_CLOSURE_INIT(
  1286. &calld->kill_zombie_closure, kill_zombie,
  1287. grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
  1288. grpc_schedule_on_exec_ctx);
  1289. GRPC_CLOSURE_SCHED(&calld->kill_zombie_closure, GRPC_ERROR_NONE);
  1290. } else {
  1291. publish_call(server, calld, cq_idx, rc);
  1292. }
  1293. gpr_mu_lock(&server->mu_call);
  1294. }
  1295. gpr_mu_unlock(&server->mu_call);
  1296. }
  1297. return GRPC_CALL_OK;
  1298. }
  1299. grpc_call_error grpc_server_request_call(
  1300. grpc_server* server, grpc_call** call, grpc_call_details* details,
  1301. grpc_metadata_array* initial_metadata,
  1302. grpc_completion_queue* cq_bound_to_call,
  1303. grpc_completion_queue* cq_for_notification, void* tag) {
  1304. grpc_call_error error;
  1305. grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
  1306. grpc_core::ExecCtx exec_ctx;
  1307. requested_call* rc = static_cast<requested_call*>(gpr_malloc(sizeof(*rc)));
  1308. GRPC_STATS_INC_SERVER_REQUESTED_CALLS();
  1309. GRPC_API_TRACE(
  1310. "grpc_server_request_call("
  1311. "server=%p, call=%p, details=%p, initial_metadata=%p, "
  1312. "cq_bound_to_call=%p, cq_for_notification=%p, tag=%p)",
  1313. 7,
  1314. (server, call, details, initial_metadata, cq_bound_to_call,
  1315. cq_for_notification, tag));
  1316. size_t cq_idx;
  1317. for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) {
  1318. if (server->cqs[cq_idx] == cq_for_notification) {
  1319. break;
  1320. }
  1321. }
  1322. if (cq_idx == server->cq_count) {
  1323. gpr_free(rc);
  1324. error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
  1325. goto done;
  1326. }
  1327. if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
  1328. gpr_free(rc);
  1329. error = GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
  1330. goto done;
  1331. }
  1332. details->reserved = nullptr;
  1333. rc->cq_idx = cq_idx;
  1334. rc->type = BATCH_CALL;
  1335. rc->server = server;
  1336. rc->tag = tag;
  1337. rc->cq_bound_to_call = cq_bound_to_call;
  1338. rc->call = call;
  1339. rc->data.batch.details = details;
  1340. rc->initial_metadata = initial_metadata;
  1341. error = queue_call_request(server, cq_idx, rc);
  1342. done:
  1343. return error;
  1344. }
  1345. grpc_call_error grpc_server_request_registered_call(
  1346. grpc_server* server, void* rmp, grpc_call** call, gpr_timespec* deadline,
  1347. grpc_metadata_array* initial_metadata, grpc_byte_buffer** optional_payload,
  1348. grpc_completion_queue* cq_bound_to_call,
  1349. grpc_completion_queue* cq_for_notification, void* tag) {
  1350. grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
  1351. grpc_core::ExecCtx exec_ctx;
  1352. GRPC_STATS_INC_SERVER_REQUESTED_CALLS();
  1353. requested_call* rc = static_cast<requested_call*>(gpr_malloc(sizeof(*rc)));
  1354. registered_method* rm = static_cast<registered_method*>(rmp);
  1355. GRPC_API_TRACE(
  1356. "grpc_server_request_registered_call("
  1357. "server=%p, rmp=%p, call=%p, deadline=%p, initial_metadata=%p, "
  1358. "optional_payload=%p, cq_bound_to_call=%p, cq_for_notification=%p, "
  1359. "tag=%p)",
  1360. 9,
  1361. (server, rmp, call, deadline, initial_metadata, optional_payload,
  1362. cq_bound_to_call, cq_for_notification, tag));
  1363. size_t cq_idx;
  1364. for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) {
  1365. if (server->cqs[cq_idx] == cq_for_notification) {
  1366. break;
  1367. }
  1368. }
  1369. if (cq_idx == server->cq_count) {
  1370. gpr_free(rc);
  1371. return GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
  1372. }
  1373. if ((optional_payload == nullptr) !=
  1374. (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)) {
  1375. gpr_free(rc);
  1376. return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
  1377. }
  1378. if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
  1379. gpr_free(rc);
  1380. return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
  1381. }
  1382. rc->cq_idx = cq_idx;
  1383. rc->type = REGISTERED_CALL;
  1384. rc->server = server;
  1385. rc->tag = tag;
  1386. rc->cq_bound_to_call = cq_bound_to_call;
  1387. rc->call = call;
  1388. rc->data.registered.method = rm;
  1389. rc->data.registered.deadline = deadline;
  1390. rc->initial_metadata = initial_metadata;
  1391. rc->data.registered.optional_payload = optional_payload;
  1392. return queue_call_request(server, cq_idx, rc);
  1393. }
  1394. static void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
  1395. grpc_error* error) {
  1396. *rc->call = nullptr;
  1397. rc->initial_metadata->count = 0;
  1398. GPR_ASSERT(error != GRPC_ERROR_NONE);
  1399. grpc_cq_end_op(server->cqs[cq_idx], rc->tag, error, done_request_event, rc,
  1400. &rc->completion);
  1401. }
  1402. const grpc_channel_args* grpc_server_get_channel_args(grpc_server* server) {
  1403. return server->channel_args;
  1404. }
  1405. grpc_resource_user* grpc_server_get_default_resource_user(grpc_server* server) {
  1406. return server->default_resource_user;
  1407. }
  1408. int grpc_server_has_open_connections(grpc_server* server) {
  1409. int r;
  1410. gpr_mu_lock(&server->mu_global);
  1411. r = server->root_channel_data.next != &server->root_channel_data;
  1412. gpr_mu_unlock(&server->mu_global);
  1413. return r;
  1414. }
  1415. grpc_core::channelz::ServerNode* grpc_server_get_channelz_node(
  1416. grpc_server* server) {
  1417. if (server == nullptr) {
  1418. return nullptr;
  1419. }
  1420. return server->channelz_server.get();
  1421. }