Mercurial > hg > freeDiameter
annotate extensions/rt_load_balance/rt_load_balance.c @ 1284:38e4a7c318ac
Fix a number of compilation warnings
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Sun, 04 Jan 2015 00:55:57 +0800 |
parents | e831cabceab0 |
children | 46656b52ae97 |
rev | line source |
---|---|
1043 | 1 /********************************************************************************************************* |
2 * Software License Agreement (BSD License) * | |
3 * Author: Thomas Klausner <tk@giga.or.at> * | |
4 * * | |
1273
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
5 * Copyright (c) 2013, 2014 Thomas Klausner * |
1043 | 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; |
1273
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
61 /* other routing mechanisms need to add to the |
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
62 * appropriate entries so their base value is high |
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
63 * enough that they are considered */ |
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
64 |
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
65 /* logarithmic scaling */ |
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
66 int load_log = 0; |
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
67 while (load > 0) { |
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
68 load_log++; |
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
69 load /= 2; |
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
70 } |
1284
38e4a7c318ac
Fix a number of compilation warnings
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1273
diff
changeset
|
71 score = cand->score; |
1273
e831cabceab0
Switch to logarithmic scaling.
Thomas Klausner <tk@giga.or.at>
parents:
1270
diff
changeset
|
72 cand->score -= load_log; |
1270
f6ad5596aac7
Put debugging message at debug log level.
Thomas Klausner <tk@giga.or.at>
parents:
1221
diff
changeset
|
73 TRACE_DEBUG(FULL, "evaluated peer `%.*s', score was %d, now %d", (int)cand->diamidlen, cand->diamid, score, cand->score); |
1042
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 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
76 return 0; |
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 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
79 /* handler */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
80 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
|
81 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
82 /* entry point */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
83 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
|
84 { |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
85 /* 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
|
86 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
|
87 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
88 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
|
89 return 0; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
90 } |
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 /* Unload */ |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
93 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
|
94 { |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
95 /* 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
|
96 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
|
97 return ; |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
98 } |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
99 |
dcc0eff204cf
Add extension that balances load over multiple peers based on outstanding requests.
Thomas Klausner <tk@giga.or.at>
parents:
diff
changeset
|
100 EXTENSION_ENTRY("rt_load_balance", rt_load_balance_entry); |