#if !defined(_XCECTX_H_) #define _XCECTX_H_ 1 #include #include "config.h" /* XCE_MAXHOSTNAME_LEN */ #include "netio.h" #include "request.h" #include "vtaskmgr.h" #include "xce/types.h" typedef enum { XCE_CTX_INIT = 0, XCE_CTX_RUN, XCE_CTX_DOWN, XCE_CTX_BUSY, XCE_CTX_ERR } xce_ctx_state_t; typedef int (*xce_request_handler_t)(xce_request_t*, void*); typedef struct { xce_ctx_state_t state; xce_peerinfo_t myinfo; iomgr_t iomgr; vtaskmgr_t vtaskmgr; endpoint_t* ep; xce_request_handler_t handler; void* handler_args; cbuf_t wbuf; dataset_t* dataset; /* Redirect-hint address captured from the last redirect reply by * handle_reply() (which only sees xce_ctx_t) and read by the failover * rotator on the next retry. Empty host ("") means no hint. Advisory only; * correctness never depends on it. */ char redirect_hint_host[XCE_MAXHOSTNAME_LEN]; uint16_t redirect_hint_port; struct { union { char* debugmsg; dataset_t* get; uint64_t jobid; xce_clusterconf_t* clusterconf; xce_ctrlstatus_t* ctrlstatus; } u; } reply; } xce_ctx_t; extern int xce_ctx_init(xce_ctx_t*, char*, char*); extern void xce_ctx_fini(xce_ctx_t*); extern int xce_ctx_set_handler(xce_ctx_t*, xce_request_handler_t, void*); extern int xce_ctx_start(xce_ctx_t*); extern int xce_ctx_stop(xce_ctx_t*); extern int xce_wakeup(xce_ctx_t*, int); extern int xce_try_wakeup(xce_ctx_t*, int); extern int xce_ctx_set_endpoint(xce_ctx_t*, endpoint_t*); extern int xce_ctx_reconnect(xce_ctx_t*, char*, int); extern void xce_block_tasks(xce_ctx_t*); extern void xce_unblock_tasks(xce_ctx_t*); /* * xce_ctx_capture_redirect_hint: copy a redirect address carried on a reply * into the ctx's redirect_hint_host/port fields as a best-effort failover hint * (Req 2.2, 8.3). Called by handle_reply() BEFORE the capnp-owned reply (and * its redirect_host string) is freed. * * When `host` is NULL/empty or `port` is 0 there is no usable address: the hint * is left untouched (it stays empty). Otherwise the host is bounded-copied into * the fixed-size field (truncated + NUL-terminated, never overflowing) and the * port is stored. A NULL ctx is a safe no-op. Advisory only — correctness never * depends on the hint. */ extern void xce_ctx_capture_redirect_hint(xce_ctx_t*, const char* host, uint16_t port); #endif