Changeset 988 for vendor/current/source3/lib/serverid.c
- Timestamp:
- Nov 24, 2016, 1:14:11 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source3/lib/serverid.c
r860 r988 22 22 #include "serverid.h" 23 23 #include "util_tdb.h" 24 #include "dbwrap.h" 25 #include "lib/util/tdb_wrap.h" 24 #include "dbwrap/dbwrap.h" 25 #include "dbwrap/dbwrap_open.h" 26 #include "lib/tdb_wrap/tdb_wrap.h" 27 #include "lib/param/param.h" 28 #include "ctdbd_conn.h" 29 #include "messages.h" 30 #include "lib/messages_dgm.h" 26 31 27 32 struct serverid_key { 28 33 pid_t pid; 34 uint32_t task_id; 29 35 uint32_t vnn; 30 36 }; … … 35 41 }; 36 42 37 static struct db_context *db_ptr = NULL; 38 39 static struct db_context *serverid_init(TALLOC_CTX *mem_ctx, 40 bool readonly) 41 { 42 db_ptr = db_open(mem_ctx, lock_path("serverid.tdb"), 43 0, TDB_DEFAULT|TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH, 44 readonly ? O_RDONLY : O_RDWR | O_CREAT, 45 0644); 46 return db_ptr; 43 static struct db_context *serverid_db(void) 44 { 45 static struct db_context *db; 46 char *db_path; 47 48 if (db != NULL) { 49 return db; 50 } 51 52 db_path = lock_path("serverid.tdb"); 53 if (db_path == NULL) { 54 return NULL; 55 } 56 57 db = db_open(NULL, db_path, 0, 58 TDB_DEFAULT|TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH, 59 O_RDWR|O_CREAT, 0644, DBWRAP_LOCK_ORDER_2, 60 DBWRAP_FLAG_NONE); 61 TALLOC_FREE(db_path); 62 return db; 47 63 } 48 64 49 65 bool serverid_parent_init(TALLOC_CTX *mem_ctx) 50 66 { 51 /* 52 * Open the tdb in the parent process (smbd) so that our 53 * CLEAR_IF_FIRST optimization in tdb_reopen_all can properly 54 * work. 55 */ 56 57 if (serverid_init(mem_ctx, false) == NULL) { 67 struct db_context *db; 68 69 db = serverid_db(); 70 if (db == NULL) { 58 71 DEBUG(1, ("could not open serverid.tdb: %s\n", 59 72 strerror(errno))); … … 64 77 } 65 78 66 bool serverid_init_readonly(TALLOC_CTX *mem_ctx)67 {68 if (serverid_init(mem_ctx, true) == NULL) {69 DEBUG(1, ("could not open serverid.tdb: %s\n",70 strerror(errno)));71 return false;72 }73 74 return true;75 }76 77 static struct db_context *serverid_db(void)78 {79 if (db_ptr != NULL) {80 return db_ptr;81 }82 83 return serverid_init(NULL, false);84 }85 86 79 static void serverid_fill_key(const struct server_id *id, 87 80 struct serverid_key *key) … … 89 82 ZERO_STRUCTP(key); 90 83 key->pid = id->pid; 84 key->task_id = id->task_id; 91 85 key->vnn = id->vnn; 92 86 } … … 110 104 tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key)); 111 105 112 rec = db ->fetch_locked(db, talloc_tos(), tdbkey);106 rec = dbwrap_fetch_locked(db, talloc_tos(), tdbkey); 113 107 if (rec == NULL) { 114 108 DEBUG(1, ("Could not fetch_lock serverid.tdb record\n")); … … 121 115 122 116 tdbdata = make_tdb_data((uint8_t *)&data, sizeof(data)); 123 status = rec->store(rec, tdbdata, 0);117 status = dbwrap_record_store(rec, tdbdata, 0); 124 118 if (!NT_STATUS_IS_OK(status)) { 125 119 DEBUG(1, ("Storing serverid.tdb record failed: %s\n", … … 127 121 goto done; 128 122 } 129 ret = true; 130 done: 131 TALLOC_FREE(rec); 132 return ret; 133 } 134 135 bool serverid_register_msg_flags(const struct server_id id, bool do_reg, 136 uint32_t msg_flags) 137 { 138 struct db_context *db; 139 struct serverid_key key; 140 struct serverid_data *data; 141 struct db_record *rec; 142 TDB_DATA tdbkey; 143 NTSTATUS status; 144 bool ret = false; 145 146 db = serverid_db(); 147 if (db == NULL) { 148 return false; 149 } 150 151 serverid_fill_key(&id, &key); 152 tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key)); 153 154 rec = db->fetch_locked(db, talloc_tos(), tdbkey); 155 if (rec == NULL) { 156 DEBUG(1, ("Could not fetch_lock serverid.tdb record\n")); 157 return false; 158 } 159 160 if (rec->value.dsize != sizeof(struct serverid_data)) { 161 DEBUG(1, ("serverid record has unexpected size %d " 162 "(wanted %d)\n", (int)rec->value.dsize, 163 (int)sizeof(struct serverid_data))); 164 goto done; 165 } 166 167 data = (struct serverid_data *)rec->value.dptr; 168 169 if (do_reg) { 170 data->msg_flags |= msg_flags; 171 } else { 172 data->msg_flags &= ~msg_flags; 173 } 174 175 status = rec->store(rec, rec->value, 0); 176 if (!NT_STATUS_IS_OK(status)) { 177 DEBUG(1, ("Storing serverid.tdb record failed: %s\n", 178 nt_errstr(status))); 179 goto done; 180 } 123 124 if (lp_clustering()) { 125 register_with_ctdbd(messaging_ctdbd_connection(), id.unique_id, 126 NULL, NULL); 127 } 128 181 129 ret = true; 182 130 done: … … 202 150 tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key)); 203 151 204 rec = db ->fetch_locked(db, talloc_tos(), tdbkey);152 rec = dbwrap_fetch_locked(db, talloc_tos(), tdbkey); 205 153 if (rec == NULL) { 206 154 DEBUG(1, ("Could not fetch_lock serverid.tdb record\n")); … … 208 156 } 209 157 210 status = rec->delete_rec(rec);158 status = dbwrap_record_delete(rec); 211 159 if (!NT_STATUS_IS_OK(status)) { 212 160 DEBUG(1, ("Deleting serverid.tdb record failed: %s\n", … … 220 168 } 221 169 222 struct serverid_exists_state { 223 const struct server_id *id; 224 bool exists; 225 }; 226 227 static int server_exists_parse(TDB_DATA key, TDB_DATA data, void *priv) 228 { 229 struct serverid_exists_state *state = 230 (struct serverid_exists_state *)priv; 231 232 if (data.dsize != sizeof(struct serverid_data)) { 233 return -1; 234 } 235 236 /* 237 * Use memcmp, not direct compare. data.dptr might not be 238 * aligned. 239 */ 240 state->exists = (memcmp(&state->id->unique_id, data.dptr, 241 sizeof(state->id->unique_id)) == 0); 242 return 0; 243 } 244 245 bool serverid_exists(const struct server_id *id) 246 { 247 struct db_context *db; 248 struct serverid_exists_state state; 249 struct serverid_key key; 250 TDB_DATA tdbkey; 251 252 if (procid_is_me(id)) { 253 return true; 254 } 255 256 if (!process_exists(*id)) { 170 static bool serverid_exists_local(const struct server_id *id) 171 { 172 bool exists = process_exists_by_pid(id->pid); 173 uint64_t unique; 174 int ret; 175 176 if (!exists) { 257 177 return false; 258 178 } … … 262 182 } 263 183 264 db = serverid_db(); 265 if (db == NULL) { 266 return false; 267 } 268 269 serverid_fill_key(id, &key); 270 tdbkey = make_tdb_data((uint8_t *)&key, sizeof(key)); 271 272 state.id = id; 273 state.exists = false; 274 275 if (db->parse_record(db, tdbkey, server_exists_parse, &state) == -1) { 276 return false; 277 } 278 return state.exists; 184 ret = messaging_dgm_get_unique(id->pid, &unique); 185 if (ret != 0) { 186 return false; 187 } 188 189 return (unique == id->unique_id); 190 } 191 192 bool serverid_exists(const struct server_id *id) 193 { 194 if (procid_is_local(id)) { 195 return serverid_exists_local(id); 196 } 197 198 if (lp_clustering()) { 199 return ctdbd_process_exists(messaging_ctdbd_connection(), 200 id->vnn, id->pid); 201 } 202 203 return false; 279 204 } 280 205 … … 284 209 struct serverid_key key; 285 210 struct serverid_data data; 286 287 if (rec->key.dsize != sizeof(key)) { 211 TDB_DATA tdbkey; 212 TDB_DATA tdbdata; 213 214 tdbkey = dbwrap_record_get_key(rec); 215 tdbdata = dbwrap_record_get_value(rec); 216 217 if (tdbkey.dsize != sizeof(key)) { 288 218 DEBUG(1, ("Found invalid key length %d in serverid.tdb\n", 289 (int) rec->key.dsize));290 return false; 291 } 292 if ( rec->value.dsize != sizeof(data)) {219 (int)tdbkey.dsize)); 220 return false; 221 } 222 if (tdbdata.dsize != sizeof(data)) { 293 223 DEBUG(1, ("Found invalid value length %d in serverid.tdb\n", 294 (int) rec->value.dsize));295 return false; 296 } 297 298 memcpy(&key, rec->key.dptr, sizeof(key));299 memcpy(&data, rec->value.dptr, sizeof(data));224 (int)tdbdata.dsize)); 225 return false; 226 } 227 228 memcpy(&key, tdbkey.dptr, sizeof(key)); 229 memcpy(&data, tdbdata.dptr, sizeof(data)); 300 230 301 231 id->pid = key.pid; 232 id->task_id = key.task_id; 302 233 id->vnn = key.vnn; 303 234 id->unique_id = data.unique_id; … … 331 262 struct db_context *db; 332 263 struct serverid_traverse_read_state state; 264 NTSTATUS status; 333 265 334 266 db = serverid_db(); … … 338 270 state.fn = fn; 339 271 state.private_data = private_data; 340 return db->traverse_read(db, serverid_traverse_read_fn, &state); 272 273 status = dbwrap_traverse_read(db, serverid_traverse_read_fn, &state, 274 NULL); 275 return NT_STATUS_IS_OK(status); 341 276 } 342 277 … … 367 302 struct db_context *db; 368 303 struct serverid_traverse_state state; 304 NTSTATUS status; 369 305 370 306 db = serverid_db(); … … 374 310 state.fn = fn; 375 311 state.private_data = private_data; 376 return db->traverse(db, serverid_traverse_fn, &state); 377 } 378 379 uint64_t serverid_get_random_unique_id(void) 380 { 381 uint64_t unique_id = SERVERID_UNIQUE_ID_NOT_TO_VERIFY; 382 383 while (unique_id == SERVERID_UNIQUE_ID_NOT_TO_VERIFY) { 384 generate_random_buffer((uint8_t *)&unique_id, 385 sizeof(unique_id)); 386 } 387 388 return unique_id; 389 } 312 313 status = dbwrap_traverse(db, serverid_traverse_fn, &state, NULL); 314 return NT_STATUS_IS_OK(status); 315 }
Note:
See TracChangeset
for help on using the changeset viewer.