nats.zig/deps/nats.c/src/srvpool.h
torque 79a45fd2e3
git subrepo clone (merge) --branch=v3.6.1 https://github.com/nats-io/nats.c.git deps/nats.c
subrepo:
  subdir:   "deps/nats.c"
  merged:   "66cec7f"
upstream:
  origin:   "https://github.com/nats-io/nats.c.git"
  branch:   "v3.6.1"
  commit:   "66cec7f"
git-subrepo:
  version:  "0.4.6"
  commit:   "b8b46501e"
2023-08-15 00:21:33 -07:00

85 lines
2.8 KiB
C

// Copyright 2015-2019 The NATS Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef SRVPOOL_H_
#define SRVPOOL_H_
#include "status.h"
#include "hash.h"
// Tracks individual backend servers.
typedef struct __natsSrv
{
natsUrl *url;
bool didConnect;
bool isImplicit;
int reconnects;
char *tlsName;
int lastAuthErrCode;
} natsSrv;
typedef struct __natsSrvPool
{
natsSrv **srvrs;
natsStrHash *urls;
int size;
int cap;
bool randomize;
char *user;
char *pwd;
} natsSrvPool;
// This is defined in natsp.h, but natsp.h includes this file. Alternatively,
// we would need to move the defs above in natsp.h.
struct __natsOptions;
#define natsSrvPool_GetSize(p) ((p)->size)
#define natsSrvPool_GetSrv(p,i) ((p)->srvrs[(i)])
#define natsSrvPool_SetSrvDidConnect(p,i,c) (natsSrvPool_GetSrv((p),(i))->didConnect=(c))
#define natsSrvPool_SetSrvReconnects(p,i,r) (natsSrvPool_GetSrv((p),(i))->reconnects=(r))
// Create the server pool using the options given.
// We will place a Url option first, followed by any
// Server Options. We will randomize the server pool unlesss
// the NoRandomize flag is set.
natsStatus
natsSrvPool_Create(natsSrvPool **newPool, struct __natsOptions *opts);
// Return the server corresponding to given `cur` with current position
// in the pool.
natsSrv*
natsSrvPool_GetCurrentServer(natsSrvPool *pool, const natsSrv *cur, int *index);
// Pop the current server and put onto the end of the list. Select head of list as long
// as number of reconnect attempts under MaxReconnect.
natsSrv*
natsSrvPool_GetNextServer(natsSrvPool *pool, struct __natsOptions *opts, const natsSrv *cur);
// Go through the list of the given URLs and add them to the pool if not already
// present.
natsStatus
natsSrvPool_addNewURLs(natsSrvPool *pool, const natsUrl *curUrl, char **urls, int urlCount, const char *tlsName, bool *added);
// Returns an array of servers (as a copy). User is responsible to free the memory.
natsStatus
natsSrvPool_GetServers(natsSrvPool *pool, bool implicitOnly, char ***servers, int *count);
// Destroy the pool, freeing up all memory used.
void
natsSrvPool_Destroy(natsSrvPool *pool);
#endif /* SRVPOOL_H_ */