"Fossies" - the Fresh Open Source Software Archive

Member "haproxy-2.0.0/include/types/backend.h" (16 Jun 2019, 8418 Bytes) of package /linux/misc/haproxy-2.0.0.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "backend.h" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 1.9.3_vs_1.9.4.

    1 /*
    2  * include/types/backend.h
    3  * This file assembles definitions for backends
    4  *
    5  * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu
    6  *
    7  * This library is free software; you can redistribute it and/or
    8  * modify it under the terms of the GNU Lesser General Public
    9  * License as published by the Free Software Foundation, version 2.1
   10  * exclusively.
   11  *
   12  * This library is distributed in the hope that it will be useful,
   13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   15  * Lesser General Public License for more details.
   16  *
   17  * You should have received a copy of the GNU Lesser General Public
   18  * License along with this library; if not, write to the Free Software
   19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
   20  */
   21 
   22 #ifndef _TYPES_BACKEND_H
   23 #define _TYPES_BACKEND_H
   24 
   25 #include <common/config.h>
   26 #include <common/hathreads.h>
   27 
   28 #include <types/lb_chash.h>
   29 #include <types/lb_fas.h>
   30 #include <types/lb_fwlc.h>
   31 #include <types/lb_fwrr.h>
   32 #include <types/lb_map.h>
   33 #include <types/server.h>
   34 
   35 /* Parameters for lbprm.algo */
   36 
   37 /* Lower bits define the kind of load balancing method, which means the type of
   38  * algorithm, and which criterion it is based on. For this reason, those bits
   39  * also include information about dependencies, so that the config parser can
   40  * detect incompatibilities.
   41  */
   42 
   43 /* LB parameters are on the lower 8 bits. Depends on the LB kind. */
   44 
   45 /* BE_LB_HASH_* is used with BE_LB_KIND_HI */
   46 #define BE_LB_HASH_SRC  0x00000  /* hash source IP */
   47 #define BE_LB_HASH_URI  0x00001  /* hash HTTP URI */
   48 #define BE_LB_HASH_PRM  0x00002  /* hash HTTP URL parameter */
   49 #define BE_LB_HASH_HDR  0x00003  /* hash HTTP header value */
   50 #define BE_LB_HASH_RDP  0x00004  /* hash RDP cookie value */
   51 #define BE_LB_HASH_RND  0x00008  /* hash a random value */
   52 
   53 /* BE_LB_RR_* is used with BE_LB_KIND_RR */
   54 #define BE_LB_RR_DYN    0x00000  /* dynamic round robin (default) */
   55 #define BE_LB_RR_STATIC 0x00001  /* static round robin */
   56 #define BE_LB_RR_RANDOM 0x00002  /* random round robin */
   57 
   58 /* BE_LB_CB_* is used with BE_LB_KIND_CB */
   59 #define BE_LB_CB_LC     0x00000  /* least-connections */
   60 #define BE_LB_CB_FAS    0x00001  /* first available server (opposite of leastconn) */
   61 
   62 #define BE_LB_PARM      0x000FF  /* mask to get/clear the LB param */
   63 
   64 /* Required input(s) */
   65 #define BE_LB_NEED_NONE 0x00000  /* no input needed            */
   66 #define BE_LB_NEED_ADDR 0x00100  /* only source address needed */
   67 #define BE_LB_NEED_DATA 0x00200  /* some payload is needed     */
   68 #define BE_LB_NEED_HTTP 0x00400  /* an HTTP request is needed  */
   69 /* not used: 0x0800 */
   70 #define BE_LB_NEED      0x00F00  /* mask to get/clear dependencies */
   71 
   72 /* Algorithm */
   73 #define BE_LB_KIND_NONE 0x00000  /* algorithm not set */
   74 #define BE_LB_KIND_RR   0x01000  /* round-robin */
   75 #define BE_LB_KIND_CB   0x02000  /* connection-based */
   76 #define BE_LB_KIND_HI   0x03000  /* hash of input (see hash inputs above) */
   77 #define BE_LB_KIND      0x07000  /* mask to get/clear LB algorithm */
   78 
   79 /* All known variants of load balancing algorithms. These can be cleared using
   80  * the BE_LB_ALGO mask. For a check, using BE_LB_KIND is preferred.
   81  */
   82 #define BE_LB_ALGO_NONE (BE_LB_KIND_NONE | BE_LB_NEED_NONE)    /* not defined */
   83 #define BE_LB_ALGO_RR   (BE_LB_KIND_RR | BE_LB_NEED_NONE)      /* round robin */
   84 #define BE_LB_ALGO_RND  (BE_LB_KIND_RR | BE_LB_NEED_NONE | BE_LB_RR_RANDOM) /* random value */
   85 #define BE_LB_ALGO_LC   (BE_LB_KIND_CB | BE_LB_NEED_NONE | BE_LB_CB_LC)    /* least connections */
   86 #define BE_LB_ALGO_FAS  (BE_LB_KIND_CB | BE_LB_NEED_NONE | BE_LB_CB_FAS)   /* first available server */
   87 #define BE_LB_ALGO_SRR  (BE_LB_KIND_RR | BE_LB_NEED_NONE | BE_LB_RR_STATIC) /* static round robin */
   88 #define BE_LB_ALGO_SH   (BE_LB_KIND_HI | BE_LB_NEED_ADDR | BE_LB_HASH_SRC) /* hash: source IP */
   89 #define BE_LB_ALGO_UH   (BE_LB_KIND_HI | BE_LB_NEED_HTTP | BE_LB_HASH_URI) /* hash: HTTP URI  */
   90 #define BE_LB_ALGO_PH   (BE_LB_KIND_HI | BE_LB_NEED_HTTP | BE_LB_HASH_PRM) /* hash: HTTP URL parameter */
   91 #define BE_LB_ALGO_HH   (BE_LB_KIND_HI | BE_LB_NEED_HTTP | BE_LB_HASH_HDR) /* hash: HTTP header value  */
   92 #define BE_LB_ALGO_RCH  (BE_LB_KIND_HI | BE_LB_NEED_DATA | BE_LB_HASH_RDP) /* hash: RDP cookie value   */
   93 #define BE_LB_ALGO      (BE_LB_KIND    | BE_LB_NEED      | BE_LB_PARM    ) /* mask to clear algo */
   94 
   95 /* Higher bits define how a given criterion is mapped to a server. In fact it
   96  * designates the LB function by itself. The dynamic algorithms will also have
   97  * the DYN bit set. These flags are automatically set at the end of the parsing.
   98  */
   99 #define BE_LB_LKUP_NONE   0x00000  /* not defined */
  100 #define BE_LB_LKUP_MAP    0x10000  /* static map based lookup */
  101 #define BE_LB_LKUP_RRTREE 0x20000  /* FWRR tree lookup */
  102 #define BE_LB_LKUP_LCTREE 0x30000  /* FWLC tree lookup */
  103 #define BE_LB_LKUP_CHTREE 0x40000  /* consistent hash  */
  104 #define BE_LB_LKUP_FSTREE 0x50000  /* FAS tree lookup */
  105 #define BE_LB_LKUP        0x70000  /* mask to get just the LKUP value */
  106 
  107 /* additional properties */
  108 #define BE_LB_PROP_DYN    0x80000 /* bit to indicate a dynamic algorithm */
  109 
  110 /* hash types */
  111 #define BE_LB_HASH_MAP    0x000000 /* map-based hash (default) */
  112 #define BE_LB_HASH_CONS   0x100000 /* consistent hashbit to indicate a dynamic algorithm */
  113 #define BE_LB_HASH_TYPE   0x100000 /* get/clear hash types */
  114 
  115 /* additional modifier on top of the hash function (only avalanche right now) */
  116 #define BE_LB_HMOD_AVAL   0x200000  /* avalanche modifier */
  117 #define BE_LB_HASH_MOD    0x200000  /* get/clear hash modifier */
  118 
  119 /* BE_LB_HFCN_* is the hash function, to be used with BE_LB_HASH_FUNC */
  120 #define BE_LB_HFCN_SDBM   0x000000 /* sdbm hash */
  121 #define BE_LB_HFCN_DJB2   0x400000 /* djb2 hash */
  122 #define BE_LB_HFCN_WT6    0x800000 /* wt6 hash */
  123 #define BE_LB_HFCN_CRC32  0xC00000 /* crc32 hash */
  124 #define BE_LB_HASH_FUNC   0xC00000 /* get/clear hash function */
  125 
  126 
  127 /* various constants */
  128 
  129 /* The scale factor between user weight and effective weight allows smooth
  130  * weight modulation even with small weights (eg: 1). It should not be too high
  131  * though because it limits the number of servers in FWRR mode in order to
  132  * prevent any integer overflow. The max number of servers per backend is
  133  * limited to about (2^32-1)/256^2/scale ~= 65535.9999/scale. A scale of 16
  134  * looks like a good value, as it allows 4095 servers per backend while leaving
  135  * modulation steps of about 6% for servers with the lowest weight (1).
  136  */
  137 #define BE_WEIGHT_SCALE 16
  138 
  139 /* LB parameters for all algorithms */
  140 struct lbprm {
  141     union { /* LB parameters depending on the algo type */
  142         struct lb_map map;
  143         struct lb_fwrr fwrr;
  144         struct lb_fwlc fwlc;
  145         struct lb_chash chash;
  146         struct lb_fas fas;
  147     };
  148     int algo;           /* load balancing algorithm and variants: BE_LB_* */
  149     int tot_wact, tot_wbck;     /* total effective weights of active and backup servers */
  150     int tot_weight;         /* total effective weight of servers participating to LB */
  151     int tot_used;           /* total number of servers used for LB */
  152     int wmult;          /* ratio between user weight and effective weight */
  153     int wdiv;           /* ratio between effective weight and user weight */
  154     int hash_balance_factor;    /* load balancing factor * 100, 0 if disabled */
  155     char *arg_str;          /* name of the URL parameter/header/cookie used for hashing */
  156     int   arg_len;          /* strlen(arg_str), computed only once */
  157     int   arg_opt1;         /* extra option 1 for the LB algo (algo-specific) */
  158     int   arg_opt2;         /* extra option 2 for the LB algo (algo-specific) */
  159     int   arg_opt3;         /* extra option 3 for the LB algo (algo-specific) */
  160     struct server *fbck;        /* first backup server when !PR_O_USE_ALL_BK, or NULL */
  161     __decl_hathreads(HA_SPINLOCK_T lock);
  162 
  163     /* Call backs for some actions. Any of them may be NULL (thus should be ignored). */
  164     void (*update_server_eweight)(struct server *);  /* to be called after eweight change */
  165     void (*set_server_status_up)(struct server *);   /* to be called after status changes to UP */
  166     void (*set_server_status_down)(struct server *); /* to be called after status changes to DOWN */
  167     void (*server_take_conn)(struct server *);       /* to be called when connection is assigned */
  168     void (*server_drop_conn)(struct server *);       /* to be called when connection is dropped */
  169 };
  170 
  171 #endif /* _TYPES_BACKEND_H */
  172 
  173 /*
  174  * Local variables:
  175  *  c-indent-level: 8
  176  *  c-basic-offset: 8
  177  * End:
  178  */