mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-13 23:14:46 +00:00
2fcb500481
Guillaume Dallaire contributed the URI hashing algorithm for use with proxy-caches. It provides the advantage of optimizing the cache hit rate.
158 lines
4.3 KiB
C
158 lines
4.3 KiB
C
/*
|
|
include/proto/backend.h
|
|
Functions prototypes for the backend.
|
|
|
|
Copyright (C) 2000-2007 Willy Tarreau - w@1wt.eu
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation, version 2.1
|
|
exclusively.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef _PROTO_BACKEND_H
|
|
#define _PROTO_BACKEND_H
|
|
|
|
#include <common/config.h>
|
|
|
|
#include <types/backend.h>
|
|
#include <types/session.h>
|
|
|
|
#include <proto/queue.h>
|
|
|
|
int assign_server(struct session *s);
|
|
int assign_server_address(struct session *s);
|
|
int assign_server_and_queue(struct session *s);
|
|
int connect_server(struct session *s);
|
|
int srv_count_retry_down(struct session *t, int conn_err);
|
|
int srv_retryable_connect(struct session *t);
|
|
int srv_redispatch_connect(struct session *t);
|
|
|
|
void recount_servers(struct proxy *px);
|
|
void recalc_server_map(struct proxy *px);
|
|
|
|
|
|
/*
|
|
* This function tries to find a running server with free connection slots for
|
|
* the proxy <px> following the round-robin method.
|
|
* If any server is found, it will be returned and px->srv_rr_idx will be updated
|
|
* to point to the next server. If no valid server is found, NULL is returned.
|
|
*/
|
|
static inline struct server *get_server_rr_with_conns(struct proxy *px)
|
|
{
|
|
int newidx;
|
|
struct server *srv;
|
|
|
|
if (px->srv_map_sz == 0)
|
|
return NULL;
|
|
|
|
if (px->srv_rr_idx < 0 || px->srv_rr_idx >= px->srv_map_sz)
|
|
px->srv_rr_idx = 0;
|
|
newidx = px->srv_rr_idx;
|
|
|
|
do {
|
|
srv = px->srv_map[newidx++];
|
|
if (!srv->maxconn || srv->cur_sess < srv_dynamic_maxconn(srv)) {
|
|
px->srv_rr_idx = newidx;
|
|
return srv;
|
|
}
|
|
if (newidx == px->srv_map_sz)
|
|
newidx = 0;
|
|
} while (newidx != px->srv_rr_idx);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/*
|
|
* This function tries to find a running server for the proxy <px> following
|
|
* the round-robin method.
|
|
* If any server is found, it will be returned and px->srv_rr_idx will be updated
|
|
* to point to the next server. If no valid server is found, NULL is returned.
|
|
*/
|
|
static inline struct server *get_server_rr(struct proxy *px)
|
|
{
|
|
if (px->srv_map_sz == 0)
|
|
return NULL;
|
|
|
|
if (px->srv_rr_idx < 0 || px->srv_rr_idx >= px->srv_map_sz)
|
|
px->srv_rr_idx = 0;
|
|
return px->srv_map[px->srv_rr_idx++];
|
|
}
|
|
|
|
|
|
/*
|
|
* This function tries to find a running server for the proxy <px> following
|
|
* the source hash method. Depending on the number of active/backup servers,
|
|
* it will either look for active servers, or for backup servers.
|
|
* If any server is found, it will be returned. If no valid server is found,
|
|
* NULL is returned.
|
|
*/
|
|
static inline struct server *get_server_sh(const struct proxy *px,
|
|
const char *addr, int len)
|
|
{
|
|
unsigned int h, l;
|
|
|
|
if (px->srv_map_sz == 0)
|
|
return NULL;
|
|
|
|
l = h = 0;
|
|
if (px->srv_act > 1 || (px->srv_act == 0 && px->srv_bck > 1)) {
|
|
while ((l + sizeof (int)) <= len) {
|
|
h ^= ntohl(*(unsigned int *)(&addr[l]));
|
|
l += sizeof (int);
|
|
}
|
|
h %= px->srv_map_sz;
|
|
}
|
|
return px->srv_map[h];
|
|
}
|
|
|
|
/*
|
|
* This function tries to find a running server for the proxy <px> following
|
|
* the URI hash method. In order to optimize cache hits, the hash computation
|
|
* ends at the question mark. Depending on the number of active/backup servers,
|
|
* it will either look for active servers, or for backup servers.
|
|
* If any server is found, it will be returned. If no valid server is found,
|
|
* NULL is returned.
|
|
*
|
|
* This code was contributed by Guillaume Dallaire, who also selected this hash
|
|
* algorithm out of a tens because it gave him the best results.
|
|
*
|
|
*/
|
|
static inline struct server *get_server_uh(struct proxy *px, char *uri, int uri_len)
|
|
{
|
|
unsigned long hash = 0;
|
|
int c;
|
|
|
|
if (px->srv_map_sz == 0)
|
|
return NULL;
|
|
|
|
while (uri_len--) {
|
|
c = *uri++;
|
|
if (c == '?')
|
|
break;
|
|
hash = c + (hash << 6) + (hash << 16) - hash;
|
|
}
|
|
|
|
return px->srv_map[hash % px->srv_map_sz];
|
|
}
|
|
|
|
|
|
#endif /* _PROTO_BACKEND_H */
|
|
|
|
/*
|
|
* Local variables:
|
|
* c-indent-level: 8
|
|
* c-basic-offset: 8
|
|
* End:
|
|
*/
|