server.cc 51 KB

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