Mercurial > hg > freeDiameter
annotate extensions/rt_load_balance/rt_load_balance.c @ 1221:6f75842935f6
Reduce candidate score down to 1 due to load balancing.
Before, the maximum reduction was 5.
author | Thomas Klausner <tk@giga.or.at> |
---|---|
date | Thu, 20 Jun 2013 11:51:24 +0200 |
parents | 581bbd48524a |
children | f6ad5596aac7 |
rev | line source |
---|---|
1043 | 1 /********************************************************************************************************* |
2 * Software License Agreement (BSD License) * | |
3 * Author: Thomas Klausner <tk@giga.or.at> * | |
4 * * | |
5 * Copyright (c) 2013, Thomas Klausner * | |
6 * All rights reserved. * | |
7 * * | |
8 * Written under contract by nfotex IT GmbH, http://nfotex.com/ * | |
9 * * | |
10 * Redistribution and use of this software in source and binary forms, with or without modification, are * | |
11 * permitted provided that the following conditions are met: * | |
12 * * | |
13 * * Redistributions of source code must retain the above * | |
14 * copyright notice, this list of conditions and the * | |
15 * following disclaimer. * | |
16 * * | |
17 * * Redistributions in binary form must reproduce the above * | |
18 * copyright notice, this list of conditions and the * | |
19 * following disclaimer in the documentation and/or other * | |
20 * materials provided with the distribution. * | |
21 * * | |
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * | |
23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * | |
24 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * | |
25 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * | |
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * | |
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * | |
28 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * | |
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * | |
30 *********************************************************************************************************/ | |
31 | |
1042
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
32 #include <freeDiameter/extension.h> |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
33 |
1043 | 34 /* |
1042
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
35 * Load balancing extension. Send request to least-loaded node. |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
36 */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
37 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
38 /* The callback for load balancing the requests across the peers */ |
1216
581bbd48524a
Change prototype of rt_out callbacks to allow disposal of messages
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1043
diff
changeset
|
39 static int rt_load_balancing(void * cbdata, struct msg ** pmsg, struct fd_list * candidates) |
1042
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
40 { |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
41 struct fd_list *lic; |
1216
581bbd48524a
Change prototype of rt_out callbacks to allow disposal of messages
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1043
diff
changeset
|
42 struct msg * msg = *pmsg; |
1042
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
43 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
44 TRACE_ENTRY("%p %p %p", cbdata, msg, candidates); |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
45 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
46 CHECK_PARAMS(msg && candidates); |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
47 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
48 /* Check if it is worth processing the message */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
49 if (FD_IS_LIST_EMPTY(candidates)) |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
50 return 0; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
51 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
52 /* load balancing */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
53 for (lic = candidates->next; lic != candidates; lic = lic->next) { |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
54 struct rtd_candidate * cand = (struct rtd_candidate *) lic; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
55 struct peer_hdr *peer; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
56 long to_receive, to_send, load; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
57 int score; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
58 CHECK_FCT(fd_peer_getbyid(cand->diamid, cand->diamidlen, 0, &peer)); |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
59 CHECK_FCT(fd_peer_get_load_pending(peer, &to_receive, &to_send)); |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
60 load = to_receive + to_send; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
61 score = cand->score; |
1221
6f75842935f6
Reduce candidate score down to 1 due to load balancing.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
62 if ((cand->score > 0) && (load >= cand->score)) |
6f75842935f6
Reduce candidate score down to 1 due to load balancing.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
63 cand->score = 1; |
1042
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
64 else |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
65 cand->score -= load; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
66 TRACE_DEBUG(INFO, "evaluated peer `%.*s', score was %d, now %d", (int)cand->diamidlen, cand->diamid, score, cand->score); |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
67 } |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
68 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
69 return 0; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
70 } |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
71 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
72 /* handler */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
73 static struct fd_rt_out_hdl * rt_load_balancing_hdl = NULL; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
74 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
75 /* entry point */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
76 static int rt_load_balance_entry(char * conffile) |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
77 { |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
78 /* Register the callback */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
79 CHECK_FCT(fd_rt_out_register(rt_load_balancing, NULL, 10, &rt_load_balancing_hdl)); |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
80 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
81 TRACE_DEBUG(INFO, "Extension 'Load Balancing' initialized"); |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
82 return 0; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
83 } |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
84 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
85 /* Unload */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
86 void fd_ext_fini(void) |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
87 { |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
88 /* Unregister the callbacks */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
89 CHECK_FCT_DO(fd_rt_out_unregister(rt_load_balancing_hdl, NULL), /* continue */); |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
90 return ; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
91 } |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
92 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
93 EXTENSION_ENTRY("rt_load_balance", rt_load_balance_entry); |