server.c 51 KB

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