server.c 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438
  1. /*
  2. *
  3. * Copyright 2015-2016, Google Inc.
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are
  8. * met:
  9. *
  10. * * Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * * Redistributions in binary form must reproduce the above
  13. * copyright notice, this list of conditions and the following disclaimer
  14. * in the documentation and/or other materials provided with the
  15. * distribution.
  16. * * Neither the name of Google Inc. nor the names of its
  17. * contributors may be used to endorse or promote products derived from
  18. * this software without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  23. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  24. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  25. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  26. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  27. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  28. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  29. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  30. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. *
  32. */
  33. #include "src/core/lib/surface/server.h"
  34. #include <limits.h>
  35. #include <stdlib.h>
  36. #include <string.h>
  37. #include <grpc/support/alloc.h>
  38. #include <grpc/support/log.h>
  39. #include <grpc/support/string_util.h>
  40. #include <grpc/support/useful.h>
  41. #include "src/core/lib/channel/channel_args.h"
  42. #include "src/core/lib/channel/connected_channel.h"
  43. #include "src/core/lib/iomgr/iomgr.h"
  44. #include "src/core/lib/support/stack_lockfree.h"
  45. #include "src/core/lib/support/string.h"
  46. #include "src/core/lib/surface/api_trace.h"
  47. #include "src/core/lib/surface/call.h"
  48. #include "src/core/lib/surface/channel.h"
  49. #include "src/core/lib/surface/completion_queue.h"
  50. #include "src/core/lib/surface/init.h"
  51. #include "src/core/lib/transport/metadata.h"
  52. #include "src/core/lib/transport/static_metadata.h"
  53. typedef struct listener {
  54. void *arg;
  55. void (*start)(grpc_exec_ctx *exec_ctx, grpc_server *server, void *arg,
  56. grpc_pollset **pollsets, size_t pollset_count);
  57. void (*destroy)(grpc_exec_ctx *exec_ctx, grpc_server *server, void *arg,
  58. grpc_closure *closure);
  59. struct listener *next;
  60. grpc_closure destroy_done;
  61. } listener;
  62. typedef struct call_data call_data;
  63. typedef struct channel_data channel_data;
  64. typedef struct registered_method registered_method;
  65. typedef struct {
  66. call_data *next;
  67. call_data *prev;
  68. } call_link;
  69. typedef enum { BATCH_CALL, REGISTERED_CALL } requested_call_type;
  70. typedef struct requested_call {
  71. requested_call_type type;
  72. void *tag;
  73. grpc_server *server;
  74. grpc_completion_queue *cq_bound_to_call;
  75. grpc_call **call;
  76. grpc_cq_completion completion;
  77. grpc_metadata_array *initial_metadata;
  78. union {
  79. struct {
  80. grpc_call_details *details;
  81. } batch;
  82. struct {
  83. registered_method *registered_method;
  84. gpr_timespec *deadline;
  85. grpc_byte_buffer **optional_payload;
  86. } registered;
  87. } data;
  88. } requested_call;
  89. typedef struct channel_registered_method {
  90. registered_method *server_registered_method;
  91. uint32_t flags;
  92. grpc_mdstr *method;
  93. grpc_mdstr *host;
  94. } channel_registered_method;
  95. struct channel_data {
  96. grpc_server *server;
  97. grpc_connectivity_state connectivity_state;
  98. grpc_channel *channel;
  99. size_t cq_idx;
  100. /* linked list of all channels on a server */
  101. channel_data *next;
  102. channel_data *prev;
  103. channel_registered_method *registered_methods;
  104. uint32_t registered_method_slots;
  105. uint32_t registered_method_max_probes;
  106. grpc_closure finish_destroy_channel_closure;
  107. grpc_closure channel_connectivity_changed;
  108. };
  109. typedef struct shutdown_tag {
  110. void *tag;
  111. grpc_completion_queue *cq;
  112. grpc_cq_completion completion;
  113. } shutdown_tag;
  114. typedef enum {
  115. /* waiting for metadata */
  116. NOT_STARTED,
  117. /* inital metadata read, not flow controlled in yet */
  118. PENDING,
  119. /* flow controlled in, on completion queue */
  120. ACTIVATED,
  121. /* cancelled before being queued */
  122. ZOMBIED
  123. } call_state;
  124. typedef struct request_matcher request_matcher;
  125. struct call_data {
  126. grpc_call *call;
  127. /** protects state */
  128. gpr_mu mu_state;
  129. /** the current state of a call - see call_state */
  130. call_state state;
  131. grpc_mdstr *path;
  132. grpc_mdstr *host;
  133. gpr_timespec deadline;
  134. grpc_completion_queue *cq_new;
  135. grpc_metadata_batch *recv_initial_metadata;
  136. bool recv_idempotent_request;
  137. grpc_metadata_array initial_metadata;
  138. request_matcher *request_matcher;
  139. grpc_byte_buffer *payload;
  140. grpc_closure got_initial_metadata;
  141. grpc_closure server_on_recv_initial_metadata;
  142. grpc_closure kill_zombie_closure;
  143. grpc_closure *on_done_recv_initial_metadata;
  144. grpc_closure publish;
  145. call_data *pending_next;
  146. };
  147. struct request_matcher {
  148. grpc_server *server;
  149. size_t cq_idx;
  150. call_data *pending_head;
  151. call_data *pending_tail;
  152. gpr_stack_lockfree *requests;
  153. };
  154. struct registered_method {
  155. char *method;
  156. char *host;
  157. grpc_server_register_method_payload_handling payload_handling;
  158. uint32_t flags;
  159. /* one request matcher per method per cq */
  160. request_matcher *request_matchers;
  161. registered_method *next;
  162. };
  163. typedef struct {
  164. grpc_channel **channels;
  165. size_t num_channels;
  166. } channel_broadcaster;
  167. struct grpc_server {
  168. grpc_channel_args *channel_args;
  169. grpc_completion_queue **cqs;
  170. grpc_pollset **pollsets;
  171. size_t cq_count;
  172. /* The two following mutexes control access to server-state
  173. mu_global controls access to non-call-related state (e.g., channel state)
  174. mu_call controls access to call-related state (e.g., the call lists)
  175. If they are ever required to be nested, you must lock mu_global
  176. before mu_call. This is currently used in shutdown processing
  177. (grpc_server_shutdown_and_notify and maybe_finish_shutdown) */
  178. gpr_mu mu_global; /* mutex for server and channel state */
  179. gpr_mu mu_call; /* mutex for call-specific state */
  180. registered_method *registered_methods;
  181. /** one request matcher for unregistered methods per cq */
  182. request_matcher *unregistered_request_matchers;
  183. /** free list of available requested_calls indices */
  184. gpr_stack_lockfree *request_freelist;
  185. /** requested call backing data */
  186. requested_call *requested_calls;
  187. size_t max_requested_calls;
  188. gpr_atm shutdown_flag;
  189. uint8_t shutdown_published;
  190. size_t num_shutdown_tags;
  191. shutdown_tag *shutdown_tags;
  192. channel_data root_channel_data;
  193. listener *listeners;
  194. int listeners_destroyed;
  195. gpr_refcount internal_refcount;
  196. /** when did we print the last shutdown progress message */
  197. gpr_timespec last_shutdown_message_time;
  198. };
  199. #define SERVER_FROM_CALL_ELEM(elem) \
  200. (((channel_data *)(elem)->channel_data)->server)
  201. static void publish_new_rpc(grpc_exec_ctx *exec_ctx, void *calld, bool success);
  202. static void fail_call(grpc_exec_ctx *exec_ctx, grpc_server *server,
  203. size_t cq_idx, requested_call *rc);
  204. /* Before calling maybe_finish_shutdown, we must hold mu_global and not
  205. hold mu_call */
  206. static void maybe_finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_server *server);
  207. /*
  208. * channel broadcaster
  209. */
  210. /* assumes server locked */
  211. static void channel_broadcaster_init(grpc_server *s, channel_broadcaster *cb) {
  212. channel_data *c;
  213. size_t count = 0;
  214. for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
  215. count++;
  216. }
  217. cb->num_channels = count;
  218. cb->channels = gpr_malloc(sizeof(*cb->channels) * cb->num_channels);
  219. count = 0;
  220. for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
  221. cb->channels[count++] = c->channel;
  222. GRPC_CHANNEL_INTERNAL_REF(c->channel, "broadcast");
  223. }
  224. }
  225. struct shutdown_cleanup_args {
  226. grpc_closure closure;
  227. gpr_slice slice;
  228. };
  229. static void shutdown_cleanup(grpc_exec_ctx *exec_ctx, void *arg,
  230. bool iomgr_status_ignored) {
  231. struct shutdown_cleanup_args *a = arg;
  232. gpr_slice_unref(a->slice);
  233. gpr_free(a);
  234. }
  235. static void send_shutdown(grpc_exec_ctx *exec_ctx, grpc_channel *channel,
  236. int send_goaway, int send_disconnect) {
  237. grpc_transport_op op;
  238. struct shutdown_cleanup_args *sc;
  239. grpc_channel_element *elem;
  240. memset(&op, 0, sizeof(op));
  241. op.send_goaway = send_goaway;
  242. sc = gpr_malloc(sizeof(*sc));
  243. sc->slice = gpr_slice_from_copied_string("Server shutdown");
  244. op.goaway_message = &sc->slice;
  245. op.goaway_status = GRPC_STATUS_OK;
  246. op.disconnect = send_disconnect;
  247. grpc_closure_init(&sc->closure, shutdown_cleanup, sc);
  248. op.on_consumed = &sc->closure;
  249. elem = grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
  250. elem->filter->start_transport_op(exec_ctx, elem, &op);
  251. }
  252. static void channel_broadcaster_shutdown(grpc_exec_ctx *exec_ctx,
  253. channel_broadcaster *cb,
  254. int send_goaway,
  255. int force_disconnect) {
  256. size_t i;
  257. for (i = 0; i < cb->num_channels; i++) {
  258. send_shutdown(exec_ctx, cb->channels[i], send_goaway, force_disconnect);
  259. GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, cb->channels[i], "broadcast");
  260. }
  261. gpr_free(cb->channels);
  262. }
  263. /*
  264. * request_matcher
  265. */
  266. static void request_matcher_init(request_matcher *rm, size_t entries,
  267. size_t cq_idx, grpc_server *server) {
  268. memset(rm, 0, sizeof(*rm));
  269. rm->server = server;
  270. rm->cq_idx = cq_idx;
  271. rm->requests = gpr_stack_lockfree_create(entries);
  272. }
  273. static void request_matcher_destroy(request_matcher *rm) {
  274. GPR_ASSERT(gpr_stack_lockfree_pop(rm->requests) == -1);
  275. gpr_stack_lockfree_destroy(rm->requests);
  276. }
  277. static void kill_zombie(grpc_exec_ctx *exec_ctx, void *elem, bool success) {
  278. grpc_call_destroy(grpc_call_from_top_element(elem));
  279. }
  280. static void request_matcher_zombify_all_pending_calls(grpc_exec_ctx *exec_ctx,
  281. request_matcher *rm) {
  282. while (rm->pending_head) {
  283. call_data *calld = rm->pending_head;
  284. rm->pending_head = calld->pending_next;
  285. gpr_mu_lock(&calld->mu_state);
  286. calld->state = ZOMBIED;
  287. gpr_mu_unlock(&calld->mu_state);
  288. grpc_closure_init(
  289. &calld->kill_zombie_closure, kill_zombie,
  290. grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0));
  291. grpc_exec_ctx_enqueue(exec_ctx, &calld->kill_zombie_closure, true, NULL);
  292. }
  293. }
  294. static void request_matcher_kill_requests(grpc_exec_ctx *exec_ctx,
  295. grpc_server *server,
  296. request_matcher *rm) {
  297. int request_id;
  298. while ((request_id = gpr_stack_lockfree_pop(rm->requests)) != -1) {
  299. fail_call(exec_ctx, server, rm->cq_idx,
  300. &server->requested_calls[request_id]);
  301. }
  302. }
  303. /*
  304. * server proper
  305. */
  306. static void server_ref(grpc_server *server) {
  307. gpr_ref(&server->internal_refcount);
  308. }
  309. static void server_delete(grpc_exec_ctx *exec_ctx, grpc_server *server) {
  310. registered_method *rm;
  311. size_t i;
  312. grpc_channel_args_destroy(server->channel_args);
  313. gpr_mu_destroy(&server->mu_global);
  314. gpr_mu_destroy(&server->mu_call);
  315. while ((rm = server->registered_methods) != NULL) {
  316. server->registered_methods = rm->next;
  317. for (i = 0; i < server->cq_count; i++) {
  318. request_matcher_destroy(&rm->request_matchers[i]);
  319. }
  320. gpr_free(rm->request_matchers);
  321. gpr_free(rm->method);
  322. gpr_free(rm->host);
  323. gpr_free(rm);
  324. }
  325. for (i = 0; i < server->cq_count; i++) {
  326. GRPC_CQ_INTERNAL_UNREF(server->cqs[i], "server");
  327. request_matcher_destroy(&server->unregistered_request_matchers[i]);
  328. }
  329. gpr_stack_lockfree_destroy(server->request_freelist);
  330. gpr_free(server->unregistered_request_matchers);
  331. gpr_free(server->cqs);
  332. gpr_free(server->pollsets);
  333. gpr_free(server->shutdown_tags);
  334. gpr_free(server->requested_calls);
  335. gpr_free(server);
  336. }
  337. static void server_unref(grpc_exec_ctx *exec_ctx, grpc_server *server) {
  338. if (gpr_unref(&server->internal_refcount)) {
  339. server_delete(exec_ctx, server);
  340. }
  341. }
  342. static int is_channel_orphaned(channel_data *chand) {
  343. return chand->next == chand;
  344. }
  345. static void orphan_channel(channel_data *chand) {
  346. chand->next->prev = chand->prev;
  347. chand->prev->next = chand->next;
  348. chand->next = chand->prev = chand;
  349. }
  350. static void finish_destroy_channel(grpc_exec_ctx *exec_ctx, void *cd,
  351. bool success) {
  352. channel_data *chand = cd;
  353. grpc_server *server = chand->server;
  354. GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, chand->channel, "server");
  355. server_unref(exec_ctx, server);
  356. }
  357. static void destroy_channel(grpc_exec_ctx *exec_ctx, channel_data *chand) {
  358. if (is_channel_orphaned(chand)) return;
  359. GPR_ASSERT(chand->server != NULL);
  360. orphan_channel(chand);
  361. server_ref(chand->server);
  362. maybe_finish_shutdown(exec_ctx, chand->server);
  363. chand->finish_destroy_channel_closure.cb = finish_destroy_channel;
  364. chand->finish_destroy_channel_closure.cb_arg = chand;
  365. grpc_transport_op op;
  366. memset(&op, 0, sizeof(op));
  367. op.set_accept_stream = true;
  368. op.on_consumed = &chand->finish_destroy_channel_closure;
  369. grpc_channel_next_op(exec_ctx,
  370. grpc_channel_stack_element(
  371. grpc_channel_get_channel_stack(chand->channel), 0),
  372. &op);
  373. }
  374. static void cpstr(char **dest, size_t *capacity, grpc_mdstr *value) {
  375. gpr_slice slice = value->slice;
  376. size_t len = GPR_SLICE_LENGTH(slice);
  377. if (len + 1 > *capacity) {
  378. *capacity = GPR_MAX(len + 1, *capacity * 2);
  379. *dest = gpr_realloc(*dest, *capacity);
  380. }
  381. memcpy(*dest, grpc_mdstr_as_c_string(value), len + 1);
  382. }
  383. static void done_request_event(grpc_exec_ctx *exec_ctx, void *req,
  384. grpc_cq_completion *c) {
  385. requested_call *rc = req;
  386. grpc_server *server = rc->server;
  387. if (rc >= server->requested_calls &&
  388. rc < server->requested_calls + server->max_requested_calls) {
  389. GPR_ASSERT(rc - server->requested_calls <= INT_MAX);
  390. gpr_stack_lockfree_push(server->request_freelist,
  391. (int)(rc - server->requested_calls));
  392. } else {
  393. gpr_free(req);
  394. }
  395. server_unref(exec_ctx, server);
  396. }
  397. static void publish_call(grpc_exec_ctx *exec_ctx, grpc_server *server,
  398. call_data *calld, size_t cq_idx, requested_call *rc) {
  399. grpc_call_set_completion_queue(exec_ctx, calld->call, rc->cq_bound_to_call);
  400. grpc_call *call = calld->call;
  401. *rc->call = call;
  402. calld->cq_new = server->cqs[cq_idx];
  403. GPR_SWAP(grpc_metadata_array, *rc->initial_metadata, calld->initial_metadata);
  404. switch (rc->type) {
  405. case BATCH_CALL:
  406. GPR_ASSERT(calld->host != NULL);
  407. GPR_ASSERT(calld->path != NULL);
  408. cpstr(&rc->data.batch.details->host,
  409. &rc->data.batch.details->host_capacity, calld->host);
  410. cpstr(&rc->data.batch.details->method,
  411. &rc->data.batch.details->method_capacity, calld->path);
  412. rc->data.batch.details->deadline = calld->deadline;
  413. rc->data.batch.details->flags =
  414. 0 | (calld->recv_idempotent_request
  415. ? GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST
  416. : 0);
  417. break;
  418. case REGISTERED_CALL:
  419. *rc->data.registered.deadline = calld->deadline;
  420. if (rc->data.registered.optional_payload) {
  421. *rc->data.registered.optional_payload = calld->payload;
  422. }
  423. break;
  424. default:
  425. GPR_UNREACHABLE_CODE(return );
  426. }
  427. grpc_call_element *elem =
  428. grpc_call_stack_element(grpc_call_get_call_stack(call), 0);
  429. channel_data *chand = elem->channel_data;
  430. server_ref(chand->server);
  431. grpc_cq_end_op(exec_ctx, calld->cq_new, rc->tag, true, done_request_event, rc,
  432. &rc->completion);
  433. }
  434. static void publish_new_rpc(grpc_exec_ctx *exec_ctx, void *arg, bool success) {
  435. call_data *calld = arg;
  436. request_matcher *rm = calld->request_matcher;
  437. grpc_server *server = rm->server;
  438. if (!success || gpr_atm_acq_load(&server->shutdown_flag)) {
  439. gpr_mu_lock(&calld->mu_state);
  440. calld->state = ZOMBIED;
  441. gpr_mu_unlock(&calld->mu_state);
  442. grpc_closure_init(
  443. &calld->kill_zombie_closure, kill_zombie,
  444. grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0));
  445. grpc_exec_ctx_enqueue(exec_ctx, &calld->kill_zombie_closure, true, NULL);
  446. return;
  447. }
  448. int request_id = gpr_stack_lockfree_pop(rm->requests);
  449. if (request_id == -1) {
  450. gpr_mu_lock(&server->mu_call);
  451. gpr_mu_lock(&calld->mu_state);
  452. calld->state = PENDING;
  453. gpr_mu_unlock(&calld->mu_state);
  454. if (rm->pending_head == NULL) {
  455. rm->pending_tail = rm->pending_head = calld;
  456. } else {
  457. rm->pending_tail->pending_next = calld;
  458. rm->pending_tail = calld;
  459. }
  460. calld->pending_next = NULL;
  461. gpr_mu_unlock(&server->mu_call);
  462. } else {
  463. gpr_mu_lock(&calld->mu_state);
  464. calld->state = ACTIVATED;
  465. gpr_mu_unlock(&calld->mu_state);
  466. publish_call(exec_ctx, server, calld, rm->cq_idx,
  467. &server->requested_calls[request_id]);
  468. }
  469. }
  470. static void finish_start_new_rpc(
  471. grpc_exec_ctx *exec_ctx, grpc_server *server, grpc_call_element *elem,
  472. request_matcher *rm,
  473. grpc_server_register_method_payload_handling payload_handling) {
  474. call_data *calld = elem->call_data;
  475. if (gpr_atm_acq_load(&server->shutdown_flag)) {
  476. gpr_mu_lock(&calld->mu_state);
  477. calld->state = ZOMBIED;
  478. gpr_mu_unlock(&calld->mu_state);
  479. grpc_closure_init(&calld->kill_zombie_closure, kill_zombie, elem);
  480. grpc_exec_ctx_enqueue(exec_ctx, &calld->kill_zombie_closure, true, NULL);
  481. return;
  482. }
  483. calld->request_matcher = rm;
  484. switch (payload_handling) {
  485. case GRPC_SRM_PAYLOAD_NONE:
  486. publish_new_rpc(exec_ctx, calld, true);
  487. break;
  488. case GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER: {
  489. grpc_op op;
  490. memset(&op, 0, sizeof(op));
  491. op.op = GRPC_OP_RECV_MESSAGE;
  492. op.data.recv_message = &calld->payload;
  493. grpc_closure_init(&calld->publish, publish_new_rpc, calld);
  494. grpc_call_start_batch_and_execute(exec_ctx, calld->call, &op, 1,
  495. &calld->publish);
  496. break;
  497. }
  498. }
  499. }
  500. static void start_new_rpc(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) {
  501. channel_data *chand = elem->channel_data;
  502. call_data *calld = elem->call_data;
  503. grpc_server *server = chand->server;
  504. uint32_t i;
  505. uint32_t hash;
  506. channel_registered_method *rm;
  507. if (chand->registered_methods && calld->path && calld->host) {
  508. /* TODO(ctiller): unify these two searches */
  509. /* check for an exact match with host */
  510. hash = GRPC_MDSTR_KV_HASH(calld->host->hash, calld->path->hash);
  511. for (i = 0; i <= chand->registered_method_max_probes; i++) {
  512. rm = &chand->registered_methods[(hash + i) %
  513. chand->registered_method_slots];
  514. if (!rm) break;
  515. if (rm->host != calld->host) continue;
  516. if (rm->method != calld->path) continue;
  517. if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
  518. !calld->recv_idempotent_request)
  519. continue;
  520. finish_start_new_rpc(
  521. exec_ctx, server, elem,
  522. &rm->server_registered_method->request_matchers[chand->cq_idx],
  523. rm->server_registered_method->payload_handling);
  524. return;
  525. }
  526. /* check for a wildcard method definition (no host set) */
  527. hash = GRPC_MDSTR_KV_HASH(0, calld->path->hash);
  528. for (i = 0; i <= chand->registered_method_max_probes; i++) {
  529. rm = &chand->registered_methods[(hash + i) %
  530. chand->registered_method_slots];
  531. if (!rm) break;
  532. if (rm->host != NULL) continue;
  533. if (rm->method != calld->path) continue;
  534. if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
  535. !calld->recv_idempotent_request)
  536. continue;
  537. finish_start_new_rpc(
  538. exec_ctx, server, elem,
  539. &rm->server_registered_method->request_matchers[chand->cq_idx],
  540. rm->server_registered_method->payload_handling);
  541. return;
  542. }
  543. }
  544. finish_start_new_rpc(exec_ctx, server, elem,
  545. &server->unregistered_request_matchers[chand->cq_idx],
  546. GRPC_SRM_PAYLOAD_NONE);
  547. }
  548. static int num_listeners(grpc_server *server) {
  549. listener *l;
  550. int n = 0;
  551. for (l = server->listeners; l; l = l->next) {
  552. n++;
  553. }
  554. return n;
  555. }
  556. static void done_shutdown_event(grpc_exec_ctx *exec_ctx, void *server,
  557. grpc_cq_completion *completion) {
  558. server_unref(exec_ctx, server);
  559. }
  560. static int num_channels(grpc_server *server) {
  561. channel_data *chand;
  562. int n = 0;
  563. for (chand = server->root_channel_data.next;
  564. chand != &server->root_channel_data; chand = chand->next) {
  565. n++;
  566. }
  567. return n;
  568. }
  569. static void kill_pending_work_locked(grpc_exec_ctx *exec_ctx,
  570. grpc_server *server) {
  571. for (size_t i = 0; i < server->cq_count; i++) {
  572. request_matcher_kill_requests(exec_ctx, server,
  573. &server->unregistered_request_matchers[i]);
  574. request_matcher_zombify_all_pending_calls(
  575. exec_ctx, &server->unregistered_request_matchers[i]);
  576. for (registered_method *rm = server->registered_methods; rm;
  577. rm = rm->next) {
  578. request_matcher_kill_requests(exec_ctx, server, &rm->request_matchers[i]);
  579. request_matcher_zombify_all_pending_calls(exec_ctx,
  580. &rm->request_matchers[i]);
  581. }
  582. }
  583. }
  584. static void maybe_finish_shutdown(grpc_exec_ctx *exec_ctx,
  585. grpc_server *server) {
  586. size_t i;
  587. if (!gpr_atm_acq_load(&server->shutdown_flag) || server->shutdown_published) {
  588. return;
  589. }
  590. kill_pending_work_locked(exec_ctx, server);
  591. if (server->root_channel_data.next != &server->root_channel_data ||
  592. server->listeners_destroyed < num_listeners(server)) {
  593. if (gpr_time_cmp(gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME),
  594. server->last_shutdown_message_time),
  595. gpr_time_from_seconds(1, GPR_TIMESPAN)) >= 0) {
  596. server->last_shutdown_message_time = gpr_now(GPR_CLOCK_REALTIME);
  597. gpr_log(GPR_DEBUG,
  598. "Waiting for %d channels and %d/%d listeners to be destroyed"
  599. " before shutting down server",
  600. num_channels(server),
  601. num_listeners(server) - server->listeners_destroyed,
  602. num_listeners(server));
  603. }
  604. return;
  605. }
  606. server->shutdown_published = 1;
  607. for (i = 0; i < server->num_shutdown_tags; i++) {
  608. server_ref(server);
  609. grpc_cq_end_op(exec_ctx, server->shutdown_tags[i].cq,
  610. server->shutdown_tags[i].tag, 1, done_shutdown_event, server,
  611. &server->shutdown_tags[i].completion);
  612. }
  613. }
  614. static grpc_mdelem *server_filter(void *user_data, grpc_mdelem *md) {
  615. grpc_call_element *elem = user_data;
  616. call_data *calld = elem->call_data;
  617. if (md->key == GRPC_MDSTR_PATH) {
  618. if (calld->path == NULL) {
  619. calld->path = GRPC_MDSTR_REF(md->value);
  620. }
  621. return NULL;
  622. } else if (md->key == GRPC_MDSTR_AUTHORITY) {
  623. if (calld->host == NULL) {
  624. calld->host = GRPC_MDSTR_REF(md->value);
  625. }
  626. return NULL;
  627. }
  628. return md;
  629. }
  630. static void server_on_recv_initial_metadata(grpc_exec_ctx *exec_ctx, void *ptr,
  631. bool success) {
  632. grpc_call_element *elem = ptr;
  633. call_data *calld = elem->call_data;
  634. gpr_timespec op_deadline;
  635. grpc_metadata_batch_filter(calld->recv_initial_metadata, server_filter, elem);
  636. op_deadline = calld->recv_initial_metadata->deadline;
  637. if (0 != gpr_time_cmp(op_deadline, gpr_inf_future(op_deadline.clock_type))) {
  638. calld->deadline = op_deadline;
  639. }
  640. if (calld->host && calld->path) {
  641. /* do nothing */
  642. } else {
  643. success = 0;
  644. }
  645. calld->on_done_recv_initial_metadata->cb(
  646. exec_ctx, calld->on_done_recv_initial_metadata->cb_arg, success);
  647. }
  648. static void server_mutate_op(grpc_call_element *elem,
  649. grpc_transport_stream_op *op) {
  650. call_data *calld = elem->call_data;
  651. if (op->recv_initial_metadata != NULL) {
  652. GPR_ASSERT(op->recv_idempotent_request == NULL);
  653. calld->recv_initial_metadata = op->recv_initial_metadata;
  654. calld->on_done_recv_initial_metadata = op->recv_initial_metadata_ready;
  655. op->recv_initial_metadata_ready = &calld->server_on_recv_initial_metadata;
  656. op->recv_idempotent_request = &calld->recv_idempotent_request;
  657. }
  658. }
  659. static void server_start_transport_stream_op(grpc_exec_ctx *exec_ctx,
  660. grpc_call_element *elem,
  661. grpc_transport_stream_op *op) {
  662. GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
  663. server_mutate_op(elem, op);
  664. grpc_call_next_op(exec_ctx, elem, op);
  665. }
  666. static void got_initial_metadata(grpc_exec_ctx *exec_ctx, void *ptr,
  667. bool success) {
  668. grpc_call_element *elem = ptr;
  669. call_data *calld = elem->call_data;
  670. if (success) {
  671. start_new_rpc(exec_ctx, elem);
  672. } else {
  673. gpr_mu_lock(&calld->mu_state);
  674. if (calld->state == NOT_STARTED) {
  675. calld->state = ZOMBIED;
  676. gpr_mu_unlock(&calld->mu_state);
  677. grpc_closure_init(&calld->kill_zombie_closure, kill_zombie, elem);
  678. grpc_exec_ctx_enqueue(exec_ctx, &calld->kill_zombie_closure, true, NULL);
  679. } else if (calld->state == PENDING) {
  680. calld->state = ZOMBIED;
  681. gpr_mu_unlock(&calld->mu_state);
  682. /* zombied call will be destroyed when it's removed from the pending
  683. queue... later */
  684. } else {
  685. gpr_mu_unlock(&calld->mu_state);
  686. }
  687. }
  688. }
  689. static void accept_stream(grpc_exec_ctx *exec_ctx, void *cd,
  690. grpc_transport *transport,
  691. const void *transport_server_data) {
  692. channel_data *chand = cd;
  693. /* create a call */
  694. grpc_call *call =
  695. grpc_call_create(chand->channel, NULL, 0, NULL, transport_server_data,
  696. NULL, 0, gpr_inf_future(GPR_CLOCK_MONOTONIC));
  697. grpc_call_element *elem =
  698. grpc_call_stack_element(grpc_call_get_call_stack(call), 0);
  699. call_data *calld = elem->call_data;
  700. grpc_op op;
  701. memset(&op, 0, sizeof(op));
  702. op.op = GRPC_OP_RECV_INITIAL_METADATA;
  703. op.data.recv_initial_metadata = &calld->initial_metadata;
  704. grpc_closure_init(&calld->got_initial_metadata, got_initial_metadata, elem);
  705. grpc_call_start_batch_and_execute(exec_ctx, call, &op, 1,
  706. &calld->got_initial_metadata);
  707. }
  708. static void channel_connectivity_changed(grpc_exec_ctx *exec_ctx, void *cd,
  709. bool iomgr_status_ignored) {
  710. channel_data *chand = cd;
  711. grpc_server *server = chand->server;
  712. if (chand->connectivity_state != GRPC_CHANNEL_FATAL_FAILURE) {
  713. grpc_transport_op op;
  714. memset(&op, 0, sizeof(op));
  715. op.on_connectivity_state_change = &chand->channel_connectivity_changed,
  716. op.connectivity_state = &chand->connectivity_state;
  717. grpc_channel_next_op(exec_ctx,
  718. grpc_channel_stack_element(
  719. grpc_channel_get_channel_stack(chand->channel), 0),
  720. &op);
  721. } else {
  722. gpr_mu_lock(&server->mu_global);
  723. destroy_channel(exec_ctx, chand);
  724. gpr_mu_unlock(&server->mu_global);
  725. GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, chand->channel, "connectivity");
  726. }
  727. }
  728. static void init_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
  729. grpc_call_element_args *args) {
  730. call_data *calld = elem->call_data;
  731. channel_data *chand = elem->channel_data;
  732. memset(calld, 0, sizeof(call_data));
  733. calld->deadline = gpr_inf_future(GPR_CLOCK_REALTIME);
  734. calld->call = grpc_call_from_top_element(elem);
  735. gpr_mu_init(&calld->mu_state);
  736. grpc_closure_init(&calld->server_on_recv_initial_metadata,
  737. server_on_recv_initial_metadata, elem);
  738. server_ref(chand->server);
  739. }
  740. static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
  741. void *ignored) {
  742. channel_data *chand = elem->channel_data;
  743. call_data *calld = elem->call_data;
  744. GPR_ASSERT(calld->state != PENDING);
  745. if (calld->host) {
  746. GRPC_MDSTR_UNREF(calld->host);
  747. }
  748. if (calld->path) {
  749. GRPC_MDSTR_UNREF(calld->path);
  750. }
  751. grpc_metadata_array_destroy(&calld->initial_metadata);
  752. gpr_mu_destroy(&calld->mu_state);
  753. server_unref(exec_ctx, chand->server);
  754. }
  755. static void init_channel_elem(grpc_exec_ctx *exec_ctx,
  756. grpc_channel_element *elem,
  757. grpc_channel_element_args *args) {
  758. channel_data *chand = elem->channel_data;
  759. GPR_ASSERT(args->is_first);
  760. GPR_ASSERT(!args->is_last);
  761. chand->server = NULL;
  762. chand->channel = NULL;
  763. chand->next = chand->prev = chand;
  764. chand->registered_methods = NULL;
  765. chand->connectivity_state = GRPC_CHANNEL_IDLE;
  766. grpc_closure_init(&chand->channel_connectivity_changed,
  767. channel_connectivity_changed, chand);
  768. }
  769. static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
  770. grpc_channel_element *elem) {
  771. size_t i;
  772. channel_data *chand = elem->channel_data;
  773. if (chand->registered_methods) {
  774. for (i = 0; i < chand->registered_method_slots; i++) {
  775. if (chand->registered_methods[i].method) {
  776. GRPC_MDSTR_UNREF(chand->registered_methods[i].method);
  777. }
  778. if (chand->registered_methods[i].host) {
  779. GRPC_MDSTR_UNREF(chand->registered_methods[i].host);
  780. }
  781. }
  782. gpr_free(chand->registered_methods);
  783. }
  784. if (chand->server) {
  785. gpr_mu_lock(&chand->server->mu_global);
  786. chand->next->prev = chand->prev;
  787. chand->prev->next = chand->next;
  788. chand->next = chand->prev = chand;
  789. maybe_finish_shutdown(exec_ctx, chand->server);
  790. gpr_mu_unlock(&chand->server->mu_global);
  791. server_unref(exec_ctx, chand->server);
  792. }
  793. }
  794. const grpc_channel_filter grpc_server_top_filter = {
  795. server_start_transport_stream_op,
  796. grpc_channel_next_op,
  797. sizeof(call_data),
  798. init_call_elem,
  799. grpc_call_stack_ignore_set_pollset,
  800. destroy_call_elem,
  801. sizeof(channel_data),
  802. init_channel_elem,
  803. destroy_channel_elem,
  804. grpc_call_next_get_peer,
  805. "server",
  806. };
  807. static void register_completion_queue(grpc_server *server,
  808. grpc_completion_queue *cq,
  809. bool is_non_listening, void *reserved) {
  810. size_t i, n;
  811. GPR_ASSERT(!reserved);
  812. for (i = 0; i < server->cq_count; i++) {
  813. if (server->cqs[i] == cq) return;
  814. }
  815. grpc_cq_mark_server_cq(cq);
  816. /* Non-listening completion queues are not added to server->cqs */
  817. if (is_non_listening) {
  818. grpc_cq_mark_non_listening_server_cq(cq);
  819. } else {
  820. GRPC_CQ_INTERNAL_REF(cq, "server");
  821. n = server->cq_count++;
  822. server->cqs = gpr_realloc(
  823. server->cqs, server->cq_count * sizeof(grpc_completion_queue *));
  824. server->cqs[n] = cq;
  825. }
  826. }
  827. void grpc_server_register_completion_queue(grpc_server *server,
  828. grpc_completion_queue *cq,
  829. void *reserved) {
  830. GRPC_API_TRACE(
  831. "grpc_server_register_completion_queue(server=%p, cq=%p, reserved=%p)", 3,
  832. (server, cq, reserved));
  833. register_completion_queue(server, cq, false, reserved);
  834. }
  835. void grpc_server_register_non_listening_completion_queue(
  836. grpc_server *server, grpc_completion_queue *cq, void *reserved) {
  837. GRPC_API_TRACE(
  838. "grpc_server_register_non_listening_completion_queue(server=%p, cq=%p, "
  839. "reserved=%p)",
  840. 3, (server, cq, reserved));
  841. register_completion_queue(server, cq, true, reserved);
  842. }
  843. grpc_server *grpc_server_create(const grpc_channel_args *args, void *reserved) {
  844. size_t i;
  845. GRPC_API_TRACE("grpc_server_create(%p, %p)", 2, (args, reserved));
  846. grpc_server *server = gpr_malloc(sizeof(grpc_server));
  847. GPR_ASSERT(grpc_is_initialized() && "call grpc_init()");
  848. memset(server, 0, sizeof(grpc_server));
  849. gpr_mu_init(&server->mu_global);
  850. gpr_mu_init(&server->mu_call);
  851. /* decremented by grpc_server_destroy */
  852. gpr_ref_init(&server->internal_refcount, 1);
  853. server->root_channel_data.next = server->root_channel_data.prev =
  854. &server->root_channel_data;
  855. /* TODO(ctiller): expose a channel_arg for this */
  856. server->max_requested_calls = 32768;
  857. server->request_freelist =
  858. gpr_stack_lockfree_create(server->max_requested_calls);
  859. for (i = 0; i < (size_t)server->max_requested_calls; i++) {
  860. gpr_stack_lockfree_push(server->request_freelist, (int)i);
  861. }
  862. server->requested_calls = gpr_malloc(server->max_requested_calls *
  863. sizeof(*server->requested_calls));
  864. server->channel_args = grpc_channel_args_copy(args);
  865. return server;
  866. }
  867. static int streq(const char *a, const char *b) {
  868. if (a == NULL && b == NULL) return 1;
  869. if (a == NULL) return 0;
  870. if (b == NULL) return 0;
  871. return 0 == strcmp(a, b);
  872. }
  873. void *grpc_server_register_method(
  874. grpc_server *server, const char *method, const char *host,
  875. grpc_server_register_method_payload_handling payload_handling,
  876. uint32_t flags) {
  877. registered_method *m;
  878. GRPC_API_TRACE(
  879. "grpc_server_register_method(server=%p, method=%s, host=%s, "
  880. "flags=0x%08x)",
  881. 4, (server, method, host, flags));
  882. if (!method) {
  883. gpr_log(GPR_ERROR,
  884. "grpc_server_register_method method string cannot be NULL");
  885. return NULL;
  886. }
  887. for (m = server->registered_methods; m; m = m->next) {
  888. if (streq(m->method, method) && streq(m->host, host)) {
  889. gpr_log(GPR_ERROR, "duplicate registration for %s@%s", method,
  890. host ? host : "*");
  891. return NULL;
  892. }
  893. }
  894. if ((flags & ~GRPC_INITIAL_METADATA_USED_MASK) != 0) {
  895. gpr_log(GPR_ERROR, "grpc_server_register_method invalid flags 0x%08x",
  896. flags);
  897. return NULL;
  898. }
  899. m = gpr_malloc(sizeof(registered_method));
  900. memset(m, 0, sizeof(*m));
  901. m->method = gpr_strdup(method);
  902. m->host = gpr_strdup(host);
  903. m->next = server->registered_methods;
  904. m->payload_handling = payload_handling;
  905. m->flags = flags;
  906. server->registered_methods = m;
  907. return m;
  908. }
  909. void grpc_server_start(grpc_server *server) {
  910. listener *l;
  911. size_t i;
  912. grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
  913. GRPC_API_TRACE("grpc_server_start(server=%p)", 1, (server));
  914. server->pollsets = gpr_malloc(sizeof(grpc_pollset *) * server->cq_count);
  915. server->unregistered_request_matchers = gpr_malloc(
  916. sizeof(*server->unregistered_request_matchers) * server->cq_count);
  917. for (i = 0; i < server->cq_count; i++) {
  918. server->pollsets[i] = grpc_cq_pollset(server->cqs[i]);
  919. request_matcher_init(&server->unregistered_request_matchers[i],
  920. server->max_requested_calls, i, server);
  921. for (registered_method *rm = server->registered_methods; rm;
  922. rm = rm->next) {
  923. if (i == 0) {
  924. rm->request_matchers =
  925. gpr_malloc(sizeof(*rm->request_matchers) * server->cq_count);
  926. }
  927. request_matcher_init(&rm->request_matchers[i],
  928. server->max_requested_calls, i, server);
  929. }
  930. }
  931. for (l = server->listeners; l; l = l->next) {
  932. l->start(&exec_ctx, server, l->arg, server->pollsets, server->cq_count);
  933. }
  934. grpc_exec_ctx_finish(&exec_ctx);
  935. }
  936. void grpc_server_setup_transport(grpc_exec_ctx *exec_ctx, grpc_server *s,
  937. grpc_transport *transport,
  938. grpc_pollset *accepting_pollset,
  939. const grpc_channel_args *args) {
  940. size_t num_registered_methods;
  941. size_t alloc;
  942. registered_method *rm;
  943. channel_registered_method *crm;
  944. grpc_channel *channel;
  945. channel_data *chand;
  946. grpc_mdstr *host;
  947. grpc_mdstr *method;
  948. uint32_t hash;
  949. size_t slots;
  950. uint32_t probes;
  951. uint32_t max_probes = 0;
  952. grpc_transport_op op;
  953. channel =
  954. grpc_channel_create(exec_ctx, NULL, args, GRPC_SERVER_CHANNEL, transport);
  955. chand = (channel_data *)grpc_channel_stack_element(
  956. grpc_channel_get_channel_stack(channel), 0)
  957. ->channel_data;
  958. chand->server = s;
  959. server_ref(s);
  960. chand->channel = channel;
  961. size_t cq_idx;
  962. grpc_completion_queue *accepting_cq = grpc_cq_from_pollset(accepting_pollset);
  963. for (cq_idx = 0; cq_idx < s->cq_count; cq_idx++) {
  964. if (s->cqs[cq_idx] == accepting_cq) break;
  965. }
  966. if (cq_idx == s->cq_count) {
  967. /* completion queue not found: pick a random one to publish new calls to */
  968. cq_idx = (size_t)rand() % s->cq_count;
  969. }
  970. chand->cq_idx = cq_idx;
  971. num_registered_methods = 0;
  972. for (rm = s->registered_methods; rm; rm = rm->next) {
  973. num_registered_methods++;
  974. }
  975. /* build a lookup table phrased in terms of mdstr's in this channels context
  976. to quickly find registered methods */
  977. if (num_registered_methods > 0) {
  978. slots = 2 * num_registered_methods;
  979. alloc = sizeof(channel_registered_method) * slots;
  980. chand->registered_methods = gpr_malloc(alloc);
  981. memset(chand->registered_methods, 0, alloc);
  982. for (rm = s->registered_methods; rm; rm = rm->next) {
  983. host = rm->host ? grpc_mdstr_from_string(rm->host) : NULL;
  984. method = grpc_mdstr_from_string(rm->method);
  985. hash = GRPC_MDSTR_KV_HASH(host ? host->hash : 0, method->hash);
  986. for (probes = 0; chand->registered_methods[(hash + probes) % slots]
  987. .server_registered_method != NULL;
  988. probes++)
  989. ;
  990. if (probes > max_probes) max_probes = probes;
  991. crm = &chand->registered_methods[(hash + probes) % slots];
  992. crm->server_registered_method = rm;
  993. crm->flags = rm->flags;
  994. crm->host = host;
  995. crm->method = method;
  996. }
  997. GPR_ASSERT(slots <= UINT32_MAX);
  998. chand->registered_method_slots = (uint32_t)slots;
  999. chand->registered_method_max_probes = max_probes;
  1000. }
  1001. gpr_mu_lock(&s->mu_global);
  1002. chand->next = &s->root_channel_data;
  1003. chand->prev = chand->next->prev;
  1004. chand->next->prev = chand->prev->next = chand;
  1005. gpr_mu_unlock(&s->mu_global);
  1006. GRPC_CHANNEL_INTERNAL_REF(channel, "connectivity");
  1007. memset(&op, 0, sizeof(op));
  1008. op.set_accept_stream = true;
  1009. op.set_accept_stream_fn = accept_stream;
  1010. op.set_accept_stream_user_data = chand;
  1011. op.on_connectivity_state_change = &chand->channel_connectivity_changed;
  1012. op.connectivity_state = &chand->connectivity_state;
  1013. op.disconnect = gpr_atm_acq_load(&s->shutdown_flag) != 0;
  1014. grpc_transport_perform_op(exec_ctx, transport, &op);
  1015. }
  1016. void done_published_shutdown(grpc_exec_ctx *exec_ctx, void *done_arg,
  1017. grpc_cq_completion *storage) {
  1018. (void)done_arg;
  1019. gpr_free(storage);
  1020. }
  1021. static void listener_destroy_done(grpc_exec_ctx *exec_ctx, void *s,
  1022. bool success) {
  1023. grpc_server *server = s;
  1024. gpr_mu_lock(&server->mu_global);
  1025. server->listeners_destroyed++;
  1026. maybe_finish_shutdown(exec_ctx, server);
  1027. gpr_mu_unlock(&server->mu_global);
  1028. }
  1029. void grpc_server_shutdown_and_notify(grpc_server *server,
  1030. grpc_completion_queue *cq, void *tag) {
  1031. listener *l;
  1032. shutdown_tag *sdt;
  1033. channel_broadcaster broadcaster;
  1034. grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
  1035. GRPC_API_TRACE("grpc_server_shutdown_and_notify(server=%p, cq=%p, tag=%p)", 3,
  1036. (server, cq, tag));
  1037. /* lock, and gather up some stuff to do */
  1038. gpr_mu_lock(&server->mu_global);
  1039. grpc_cq_begin_op(cq, tag);
  1040. if (server->shutdown_published) {
  1041. grpc_cq_end_op(&exec_ctx, cq, tag, 1, done_published_shutdown, NULL,
  1042. gpr_malloc(sizeof(grpc_cq_completion)));
  1043. gpr_mu_unlock(&server->mu_global);
  1044. goto done;
  1045. }
  1046. server->shutdown_tags =
  1047. gpr_realloc(server->shutdown_tags,
  1048. sizeof(shutdown_tag) * (server->num_shutdown_tags + 1));
  1049. sdt = &server->shutdown_tags[server->num_shutdown_tags++];
  1050. sdt->tag = tag;
  1051. sdt->cq = cq;
  1052. if (gpr_atm_acq_load(&server->shutdown_flag)) {
  1053. gpr_mu_unlock(&server->mu_global);
  1054. goto done;
  1055. }
  1056. server->last_shutdown_message_time = gpr_now(GPR_CLOCK_REALTIME);
  1057. channel_broadcaster_init(server, &broadcaster);
  1058. gpr_atm_rel_store(&server->shutdown_flag, 1);
  1059. /* collect all unregistered then registered calls */
  1060. gpr_mu_lock(&server->mu_call);
  1061. kill_pending_work_locked(&exec_ctx, server);
  1062. gpr_mu_unlock(&server->mu_call);
  1063. maybe_finish_shutdown(&exec_ctx, server);
  1064. gpr_mu_unlock(&server->mu_global);
  1065. /* Shutdown listeners */
  1066. for (l = server->listeners; l; l = l->next) {
  1067. grpc_closure_init(&l->destroy_done, listener_destroy_done, server);
  1068. l->destroy(&exec_ctx, server, l->arg, &l->destroy_done);
  1069. }
  1070. channel_broadcaster_shutdown(&exec_ctx, &broadcaster, 1, 0);
  1071. done:
  1072. grpc_exec_ctx_finish(&exec_ctx);
  1073. }
  1074. void grpc_server_cancel_all_calls(grpc_server *server) {
  1075. channel_broadcaster broadcaster;
  1076. grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
  1077. GRPC_API_TRACE("grpc_server_cancel_all_calls(server=%p)", 1, (server));
  1078. gpr_mu_lock(&server->mu_global);
  1079. channel_broadcaster_init(server, &broadcaster);
  1080. gpr_mu_unlock(&server->mu_global);
  1081. channel_broadcaster_shutdown(&exec_ctx, &broadcaster, 0, 1);
  1082. grpc_exec_ctx_finish(&exec_ctx);
  1083. }
  1084. void grpc_server_destroy(grpc_server *server) {
  1085. listener *l;
  1086. grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
  1087. GRPC_API_TRACE("grpc_server_destroy(server=%p)", 1, (server));
  1088. gpr_mu_lock(&server->mu_global);
  1089. GPR_ASSERT(gpr_atm_acq_load(&server->shutdown_flag) || !server->listeners);
  1090. GPR_ASSERT(server->listeners_destroyed == num_listeners(server));
  1091. while (server->listeners) {
  1092. l = server->listeners;
  1093. server->listeners = l->next;
  1094. gpr_free(l);
  1095. }
  1096. gpr_mu_unlock(&server->mu_global);
  1097. server_unref(&exec_ctx, server);
  1098. grpc_exec_ctx_finish(&exec_ctx);
  1099. }
  1100. void grpc_server_add_listener(
  1101. grpc_exec_ctx *exec_ctx, grpc_server *server, void *arg,
  1102. void (*start)(grpc_exec_ctx *exec_ctx, grpc_server *server, void *arg,
  1103. grpc_pollset **pollsets, size_t pollset_count),
  1104. void (*destroy)(grpc_exec_ctx *exec_ctx, grpc_server *server, void *arg,
  1105. grpc_closure *on_done)) {
  1106. listener *l = gpr_malloc(sizeof(listener));
  1107. l->arg = arg;
  1108. l->start = start;
  1109. l->destroy = destroy;
  1110. l->next = server->listeners;
  1111. server->listeners = l;
  1112. }
  1113. static grpc_call_error queue_call_request(grpc_exec_ctx *exec_ctx,
  1114. grpc_server *server, size_t cq_idx,
  1115. requested_call *rc) {
  1116. call_data *calld = NULL;
  1117. request_matcher *rm = NULL;
  1118. int request_id;
  1119. if (gpr_atm_acq_load(&server->shutdown_flag)) {
  1120. fail_call(exec_ctx, server, cq_idx, rc);
  1121. return GRPC_CALL_OK;
  1122. }
  1123. request_id = gpr_stack_lockfree_pop(server->request_freelist);
  1124. if (request_id == -1) {
  1125. /* out of request ids: just fail this one */
  1126. fail_call(exec_ctx, server, cq_idx, rc);
  1127. return GRPC_CALL_OK;
  1128. }
  1129. switch (rc->type) {
  1130. case BATCH_CALL:
  1131. rm = &server->unregistered_request_matchers[cq_idx];
  1132. break;
  1133. case REGISTERED_CALL:
  1134. rm = &rc->data.registered.registered_method->request_matchers[cq_idx];
  1135. break;
  1136. }
  1137. server->requested_calls[request_id] = *rc;
  1138. gpr_free(rc);
  1139. if (gpr_stack_lockfree_push(rm->requests, request_id)) {
  1140. /* this was the first queued request: we need to lock and start
  1141. matching calls */
  1142. gpr_mu_lock(&server->mu_call);
  1143. while ((calld = rm->pending_head) != NULL) {
  1144. request_id = gpr_stack_lockfree_pop(rm->requests);
  1145. if (request_id == -1) break;
  1146. rm->pending_head = calld->pending_next;
  1147. gpr_mu_unlock(&server->mu_call);
  1148. gpr_mu_lock(&calld->mu_state);
  1149. if (calld->state == ZOMBIED) {
  1150. gpr_mu_unlock(&calld->mu_state);
  1151. grpc_closure_init(
  1152. &calld->kill_zombie_closure, kill_zombie,
  1153. grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0));
  1154. grpc_exec_ctx_enqueue(exec_ctx, &calld->kill_zombie_closure, true,
  1155. NULL);
  1156. } else {
  1157. GPR_ASSERT(calld->state == PENDING);
  1158. calld->state = ACTIVATED;
  1159. gpr_mu_unlock(&calld->mu_state);
  1160. publish_call(exec_ctx, server, calld, cq_idx,
  1161. &server->requested_calls[request_id]);
  1162. }
  1163. gpr_mu_lock(&server->mu_call);
  1164. }
  1165. gpr_mu_unlock(&server->mu_call);
  1166. }
  1167. return GRPC_CALL_OK;
  1168. }
  1169. grpc_call_error grpc_server_request_call(
  1170. grpc_server *server, grpc_call **call, grpc_call_details *details,
  1171. grpc_metadata_array *initial_metadata,
  1172. grpc_completion_queue *cq_bound_to_call,
  1173. grpc_completion_queue *cq_for_notification, void *tag) {
  1174. grpc_call_error error;
  1175. grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
  1176. requested_call *rc = gpr_malloc(sizeof(*rc));
  1177. GRPC_API_TRACE(
  1178. "grpc_server_request_call("
  1179. "server=%p, call=%p, details=%p, initial_metadata=%p, "
  1180. "cq_bound_to_call=%p, cq_for_notification=%p, tag=%p)",
  1181. 7, (server, call, details, initial_metadata, cq_bound_to_call,
  1182. cq_for_notification, tag));
  1183. size_t cq_idx;
  1184. for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) {
  1185. if (server->cqs[cq_idx] == cq_for_notification) {
  1186. break;
  1187. }
  1188. }
  1189. if (cq_idx == server->cq_count) {
  1190. gpr_free(rc);
  1191. error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
  1192. goto done;
  1193. }
  1194. grpc_cq_begin_op(cq_for_notification, tag);
  1195. details->reserved = NULL;
  1196. rc->type = BATCH_CALL;
  1197. rc->server = server;
  1198. rc->tag = tag;
  1199. rc->cq_bound_to_call = cq_bound_to_call;
  1200. rc->call = call;
  1201. rc->data.batch.details = details;
  1202. rc->initial_metadata = initial_metadata;
  1203. error = queue_call_request(&exec_ctx, server, cq_idx, rc);
  1204. done:
  1205. grpc_exec_ctx_finish(&exec_ctx);
  1206. return error;
  1207. }
  1208. grpc_call_error grpc_server_request_registered_call(
  1209. grpc_server *server, void *rmp, grpc_call **call, gpr_timespec *deadline,
  1210. grpc_metadata_array *initial_metadata, grpc_byte_buffer **optional_payload,
  1211. grpc_completion_queue *cq_bound_to_call,
  1212. grpc_completion_queue *cq_for_notification, void *tag) {
  1213. grpc_call_error error;
  1214. grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
  1215. requested_call *rc = gpr_malloc(sizeof(*rc));
  1216. registered_method *rm = rmp;
  1217. GRPC_API_TRACE(
  1218. "grpc_server_request_registered_call("
  1219. "server=%p, rmp=%p, call=%p, deadline=%p, initial_metadata=%p, "
  1220. "optional_payload=%p, cq_bound_to_call=%p, cq_for_notification=%p, "
  1221. "tag=%p)",
  1222. 9, (server, rmp, call, deadline, initial_metadata, optional_payload,
  1223. cq_bound_to_call, cq_for_notification, tag));
  1224. size_t cq_idx;
  1225. for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) {
  1226. if (server->cqs[cq_idx] == cq_for_notification) {
  1227. break;
  1228. }
  1229. }
  1230. if (cq_idx == server->cq_count) {
  1231. gpr_free(rc);
  1232. error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
  1233. goto done;
  1234. }
  1235. if ((optional_payload == NULL) !=
  1236. (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)) {
  1237. gpr_free(rc);
  1238. error = GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
  1239. goto done;
  1240. }
  1241. grpc_cq_begin_op(cq_for_notification, tag);
  1242. rc->type = REGISTERED_CALL;
  1243. rc->server = server;
  1244. rc->tag = tag;
  1245. rc->cq_bound_to_call = cq_bound_to_call;
  1246. rc->call = call;
  1247. rc->data.registered.registered_method = rm;
  1248. rc->data.registered.deadline = deadline;
  1249. rc->initial_metadata = initial_metadata;
  1250. rc->data.registered.optional_payload = optional_payload;
  1251. error = queue_call_request(&exec_ctx, server, cq_idx, rc);
  1252. done:
  1253. grpc_exec_ctx_finish(&exec_ctx);
  1254. return error;
  1255. }
  1256. static void fail_call(grpc_exec_ctx *exec_ctx, grpc_server *server,
  1257. size_t cq_idx, requested_call *rc) {
  1258. *rc->call = NULL;
  1259. rc->initial_metadata->count = 0;
  1260. server_ref(server);
  1261. grpc_cq_end_op(exec_ctx, server->cqs[cq_idx], rc->tag, 0, done_request_event,
  1262. rc, &rc->completion);
  1263. }
  1264. const grpc_channel_args *grpc_server_get_channel_args(grpc_server *server) {
  1265. return server->channel_args;
  1266. }
  1267. int grpc_server_has_open_connections(grpc_server *server) {
  1268. int r;
  1269. gpr_mu_lock(&server->mu_global);
  1270. r = server->root_channel_data.next != &server->root_channel_data;
  1271. gpr_mu_unlock(&server->mu_global);
  1272. return r;
  1273. }