- merged ctdb_store test from ronnie
[sahlberg/ctdb.git] / server / ctdb_tunables.c
1 /* 
2    ctdb tunables code
3
4    Copyright (C) Andrew Tridgell  2007
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20 #include "includes.h"
21 #include "../include/ctdb_private.h"
22
23 static const struct {
24         const char *name;
25         uint32_t default_v;
26         size_t offset;  
27 } tunable_map[] = {
28         { "MaxRedirectCount",     3,  offsetof(struct ctdb_tunable, max_redirect_count) },
29         { "SeqnumFrequency",      1,  offsetof(struct ctdb_tunable, seqnum_frequency) },
30         { "ControlTimeout",      60, offsetof(struct ctdb_tunable, control_timeout) },
31         { "TraverseTimeout",     20, offsetof(struct ctdb_tunable, traverse_timeout) },
32         { "KeepaliveInterval",    2,  offsetof(struct ctdb_tunable, keepalive_interval) },
33         { "KeepaliveLimit",       5,  offsetof(struct ctdb_tunable, keepalive_limit) },
34         { "MaxLACount",           7,  offsetof(struct ctdb_tunable, max_lacount) },
35         { "RecoverTimeout",       5,  offsetof(struct ctdb_tunable, recover_timeout) },
36         { "RecoverInterval",      1,  offsetof(struct ctdb_tunable, recover_interval) },
37         { "ElectionTimeout",      3,  offsetof(struct ctdb_tunable, election_timeout) },
38         { "TakeoverTimeout",      5,  offsetof(struct ctdb_tunable, takeover_timeout) },
39         { "MonitorInterval",     15,  offsetof(struct ctdb_tunable, monitor_interval) },
40         { "EventScriptTimeout",  20,  offsetof(struct ctdb_tunable, script_timeout) },
41         { "RecoveryGracePeriod", 60,  offsetof(struct ctdb_tunable, recovery_grace_period) },
42         { "RecoveryBanPeriod",  300,  offsetof(struct ctdb_tunable, recovery_ban_period) },
43         { "DatabaseHashSize", 10000,  offsetof(struct ctdb_tunable, database_hash_size) },
44 };
45
46 /*
47   set all tunables to defaults
48  */
49 void ctdb_tunables_set_defaults(struct ctdb_context *ctdb)
50 {
51         int i;
52         for (i=0;i<ARRAY_SIZE(tunable_map);i++) {
53                 *(uint32_t *)(tunable_map[i].offset + (uint8_t*)&ctdb->tunable) = tunable_map[i].default_v;
54         }
55 }
56
57
58 /*
59   get a tunable
60  */
61 int32_t ctdb_control_get_tunable(struct ctdb_context *ctdb, TDB_DATA indata, 
62                                  TDB_DATA *outdata)
63 {
64         struct ctdb_control_get_tunable *t = 
65                 (struct ctdb_control_get_tunable *)indata.dptr;
66         char *name;
67         uint32_t val;
68         int i;
69
70         if (indata.dsize < sizeof(*t) ||
71             t->length > indata.dsize - offsetof(struct ctdb_control_get_tunable, name)) {
72                 DEBUG(0,("Bad indata in ctdb_control_get_tunable\n"));
73                 return -1;
74         }
75
76         name = talloc_strndup(ctdb, (char*)t->name, t->length);
77         CTDB_NO_MEMORY(ctdb, name);
78
79         for (i=0;i<ARRAY_SIZE(tunable_map);i++) {
80                 if (strcasecmp(name, tunable_map[i].name) == 0) break;
81         }
82         talloc_free(name);
83         
84         if (i == ARRAY_SIZE(tunable_map)) {
85                 return -1;
86         }
87
88         val = *(uint32_t *)(tunable_map[i].offset + (uint8_t*)&ctdb->tunable);
89
90         outdata->dptr = (uint8_t *)talloc(outdata, uint32_t);
91         CTDB_NO_MEMORY(ctdb, outdata->dptr);
92
93         *(uint32_t *)outdata->dptr = val;
94         outdata->dsize = sizeof(uint32_t);
95
96         return 0;
97 }
98
99
100 /*
101   set a tunable
102  */
103 int32_t ctdb_control_set_tunable(struct ctdb_context *ctdb, TDB_DATA indata)
104 {
105         struct ctdb_control_set_tunable *t = 
106                 (struct ctdb_control_set_tunable *)indata.dptr;
107         char *name;
108         int i;
109
110         if (indata.dsize < sizeof(*t) ||
111             t->length > indata.dsize - offsetof(struct ctdb_control_set_tunable, name)) {
112                 DEBUG(0,("Bad indata in ctdb_control_set_tunable\n"));
113                 return -1;
114         }
115
116         name = talloc_strndup(ctdb, (char *)t->name, t->length);
117         CTDB_NO_MEMORY(ctdb, name);
118
119         for (i=0;i<ARRAY_SIZE(tunable_map);i++) {
120                 if (strcasecmp(name, tunable_map[i].name) == 0) break;
121         }
122
123         talloc_free(name);
124         
125         if (i == ARRAY_SIZE(tunable_map)) {
126                 return -1;
127         }
128         
129         *(uint32_t *)(tunable_map[i].offset + (uint8_t*)&ctdb->tunable) = t->value;
130
131         return 0;
132 }
133
134 /*
135   list tunables
136  */
137 int32_t ctdb_control_list_tunables(struct ctdb_context *ctdb, TDB_DATA *outdata)
138 {
139         char *list = NULL;
140         int i;
141         struct ctdb_control_list_tunable *t;
142
143         list = talloc_strdup(outdata, tunable_map[0].name);
144         CTDB_NO_MEMORY(ctdb, list);
145
146         for (i=1;i<ARRAY_SIZE(tunable_map);i++) {
147                 list = talloc_asprintf_append(list, ":%s", tunable_map[i].name);
148                 CTDB_NO_MEMORY(ctdb, list);             
149         }
150
151         outdata->dsize = offsetof(struct ctdb_control_list_tunable, data) + 
152                 strlen(list) + 1;
153         outdata->dptr = talloc_size(outdata, outdata->dsize);
154         CTDB_NO_MEMORY(ctdb, outdata->dptr);
155
156         t = (struct ctdb_control_list_tunable *)outdata->dptr;
157         t->length = strlen(list)+1;
158
159         memcpy(t->data, list, t->length);
160         talloc_free(list);
161
162         return 0;       
163 }