annotate extensions/rt_randomize/rt_randomize.c @ 1278:2a7b32176d2e

Add extension to randomly choose one of the highest-scored hosts, by increasing their score by one.
author Thomas Klausner <tk@giga.or.at>
date Wed, 06 Aug 2014 15:21:16 +0200
parents
children 38e4a7c318ac
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1278
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
1 /*********************************************************************************************************
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
2 * Software License Agreement (BSD License) *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
3 * Author: Thomas Klausner <tk@giga.or.at> *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
4 * *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
5 * Copyright (c) 2014 Thomas Klausner *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
6 * All rights reserved. *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
7 * *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
8 * Written under contract by nfotex IT GmbH, http://nfotex.com/ *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
9 * *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
10 * Redistribution and use of this software in source and binary forms, with or without modification, are *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
11 * permitted provided that the following conditions are met: *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
12 * *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
13 * * Redistributions of source code must retain the above *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
14 * copyright notice, this list of conditions and the *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
15 * following disclaimer. *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
16 * *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
17 * * Redistributions in binary form must reproduce the above *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
18 * copyright notice, this list of conditions and the *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
19 * following disclaimer in the documentation and/or other *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
20 * materials provided with the distribution. *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
21 * *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
24 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
25 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
28 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
30 *********************************************************************************************************/
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
31
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
32 #include <freeDiameter/extension.h>
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
33
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
34 /*
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
35 * Load balancing extension. If there are multiple highest-rated hosts with the same score,
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
36 * randomly increase the score of one of them.
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
37 */
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
38
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
39 #include <stdlib.h>
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
40
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
41 static int seed;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
42
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
43 static int rt_randomizing(void * cbdata, struct msg ** pmsg, struct fd_list * candidates)
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
44 {
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
45 struct fd_list *lic;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
46 struct msg * msg = *pmsg;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
47 int max_score = -1;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
48 int max_score_count = 0;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
49
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
50 TRACE_ENTRY("%p %p %p", cbdata, msg, candidates);
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
51
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
52 CHECK_PARAMS(msg && candidates);
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
53
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
54 /* Check if it is worth processing the message */
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
55 if (FD_IS_LIST_EMPTY(candidates))
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
56 return 0;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
57
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
58 /* find out maximal score and how many candidates have it */
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
59 for (lic = candidates->next; lic != candidates; lic = lic->next) {
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
60 struct rtd_candidate * cand = (struct rtd_candidate *) lic;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
61 if (max_score < cand->score) {
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
62 max_score = cand->score;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
63 max_score_count = 1;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
64 }
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
65 else if (cand->score == max_score) {
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
66 max_score_count++;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
67 }
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
68 }
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
69
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
70 /* if there is more than one with positive score, randomly increase one of their scores by one */
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
71 if (max_score >= 0 && max_score_count > 1) {
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
72 int lucky_candidate = rand_r(&seed) % max_score_count;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
73 int i = 0;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
74
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
75 for (lic = candidates->next; lic != candidates; lic = lic->next) {
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
76 struct rtd_candidate * cand = (struct rtd_candidate *) lic;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
77 if (cand->score == max_score) {
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
78 if (i == lucky_candidate) {
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
79 cand->score++;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
80 break;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
81 }
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
82 i++;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
83 }
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
84 }
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
85 }
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
86
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
87 return 0;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
88 }
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
89
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
90 /* handler */
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
91 static struct fd_rt_out_hdl * rt_randomizing_hdl = NULL;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
92
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
93 /* entry point */
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
94 static int rt_randomize_entry(char * conffile)
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
95 {
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
96 /* Register the callback */
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
97 CHECK_FCT(fd_rt_out_register(rt_randomizing, NULL, 4, &rt_randomizing_hdl));
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
98 seed = (int)time(NULL);
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
99 TRACE_DEBUG(INFO, "Extension 'Randomizing' initialized");
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
100 return 0;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
101 }
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
102
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
103 /* Unload */
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
104 void fd_ext_fini(void)
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
105 {
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
106 /* Unregister the callbacks */
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
107 CHECK_FCT_DO(fd_rt_out_unregister(rt_randomizing_hdl, NULL), /* continue */);
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
108 return ;
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
109 }
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
110
2a7b32176d2e Add extension to randomly choose one of the highest-scored hosts,
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
111 EXTENSION_ENTRY("rt_randomize", rt_randomize_entry);
"Welcome to our mercurial repository"