tdb: automatically identify Jenkins hash tdbs
[metze/ctdb/wip.git] / lib / tdb / common / open.c
1  /* 
2    Unix SMB/CIFS implementation.
3
4    trivial database library
5
6    Copyright (C) Andrew Tridgell              1999-2005
7    Copyright (C) Paul `Rusty' Russell              2000
8    Copyright (C) Jeremy Allison                    2000-2003
9
10      ** NOTE! The following LGPL license applies to the tdb
11      ** library. This does NOT imply that all of Samba is released
12      ** under the LGPL
13
14    This library is free software; you can redistribute it and/or
15    modify it under the terms of the GNU Lesser General Public
16    License as published by the Free Software Foundation; either
17    version 3 of the License, or (at your option) any later version.
18
19    This library is distributed in the hope that it will be useful,
20    but WITHOUT ANY WARRANTY; without even the implied warranty of
21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22    Lesser General Public License for more details.
23
24    You should have received a copy of the GNU Lesser General Public
25    License along with this library; if not, see <http://www.gnu.org/licenses/>.
26 */
27
28 #include "tdb_private.h"
29
30 /* all contexts, to ensure no double-opens (fcntl locks don't nest!) */
31 static struct tdb_context *tdbs = NULL;
32
33 /* We use two hashes to double-check they're using the right hash function. */
34 void tdb_header_hash(struct tdb_context *tdb,
35                      uint32_t *magic1_hash, uint32_t *magic2_hash)
36 {
37         TDB_DATA hash_key;
38         uint32_t tdb_magic = TDB_MAGIC;
39
40         hash_key.dptr = discard_const_p(unsigned char, TDB_MAGIC_FOOD);
41         hash_key.dsize = sizeof(TDB_MAGIC_FOOD);
42         *magic1_hash = tdb->hash_fn(&hash_key);
43
44         hash_key.dptr = (unsigned char *)CONVERT(tdb_magic);
45         hash_key.dsize = sizeof(tdb_magic);
46         *magic2_hash = tdb->hash_fn(&hash_key);
47
48         /* Make sure at least one hash is non-zero! */
49         if (*magic1_hash == 0 && *magic2_hash == 0)
50                 *magic1_hash = 1;
51 }
52
53 /* initialise a new database with a specified hash size */
54 static int tdb_new_database(struct tdb_context *tdb, int hash_size)
55 {
56         struct tdb_header *newdb;
57         size_t size;
58         int ret = -1;
59
60         /* We make it up in memory, then write it out if not internal */
61         size = sizeof(struct tdb_header) + (hash_size+1)*sizeof(tdb_off_t);
62         if (!(newdb = (struct tdb_header *)calloc(size, 1))) {
63                 tdb->ecode = TDB_ERR_OOM;
64                 return -1;
65         }
66
67         /* Fill in the header */
68         newdb->version = TDB_VERSION;
69         newdb->hash_size = hash_size;
70
71         tdb_header_hash(tdb, &newdb->magic1_hash, &newdb->magic2_hash);
72
73         if (tdb->flags & TDB_INTERNAL) {
74                 tdb->map_size = size;
75                 tdb->map_ptr = (char *)newdb;
76                 memcpy(&tdb->header, newdb, sizeof(tdb->header));
77                 /* Convert the `ondisk' version if asked. */
78                 CONVERT(*newdb);
79                 return 0;
80         }
81         if (lseek(tdb->fd, 0, SEEK_SET) == -1)
82                 goto fail;
83
84         if (ftruncate(tdb->fd, 0) == -1)
85                 goto fail;
86
87         /* This creates an endian-converted header, as if read from disk */
88         CONVERT(*newdb);
89         memcpy(&tdb->header, newdb, sizeof(tdb->header));
90         /* Don't endian-convert the magic food! */
91         memcpy(newdb->magic_food, TDB_MAGIC_FOOD, strlen(TDB_MAGIC_FOOD)+1);
92         /* we still have "ret == -1" here */
93         if (tdb_write_all(tdb->fd, newdb, size))
94                 ret = 0;
95
96   fail:
97         SAFE_FREE(newdb);
98         return ret;
99 }
100
101
102
103 static int tdb_already_open(dev_t device,
104                             ino_t ino)
105 {
106         struct tdb_context *i;
107
108         for (i = tdbs; i; i = i->next) {
109                 if (i->device == device && i->inode == ino) {
110                         return 1;
111                 }
112         }
113
114         return 0;
115 }
116
117 /* open the database, creating it if necessary 
118
119    The open_flags and mode are passed straight to the open call on the
120    database file. A flags value of O_WRONLY is invalid. The hash size
121    is advisory, use zero for a default value.
122
123    Return is NULL on error, in which case errno is also set.  Don't 
124    try to call tdb_error or tdb_errname, just do strerror(errno).
125
126    @param name may be NULL for internal databases. */
127 struct tdb_context *tdb_open(const char *name, int hash_size, int tdb_flags,
128                       int open_flags, mode_t mode)
129 {
130         return tdb_open_ex(name, hash_size, tdb_flags, open_flags, mode, NULL, NULL);
131 }
132
133 /* a default logging function */
134 static void null_log_fn(struct tdb_context *tdb, enum tdb_debug_level level, const char *fmt, ...) PRINTF_ATTRIBUTE(3, 4);
135 static void null_log_fn(struct tdb_context *tdb, enum tdb_debug_level level, const char *fmt, ...)
136 {
137 }
138
139 static bool check_header_hash(struct tdb_context *tdb,
140                               bool default_hash, uint32_t *m1, uint32_t *m2)
141 {
142         tdb_header_hash(tdb, m1, m2);
143         if (tdb->header.magic1_hash == *m1 &&
144             tdb->header.magic2_hash == *m2) {
145                 return true;
146         }
147
148         /* If they explicitly set a hash, always respect it. */
149         if (!default_hash)
150                 return false;
151
152         /* Otherwise, try the other inbuilt hash. */
153         tdb->hash_fn = tdb_jenkins_hash;
154         return check_header_hash(tdb, false, m1, m2);
155 }
156
157 struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
158                                 int open_flags, mode_t mode,
159                                 const struct tdb_logging_context *log_ctx,
160                                 tdb_hash_func hash_fn)
161 {
162         struct tdb_context *tdb;
163         struct stat st;
164         int rev = 0, locked = 0;
165         unsigned char *vp;
166         uint32_t vertest;
167         unsigned v;
168         const char *hash_alg;
169         uint32_t magic1, magic2;
170
171         if (!(tdb = (struct tdb_context *)calloc(1, sizeof *tdb))) {
172                 /* Can't log this */
173                 errno = ENOMEM;
174                 goto fail;
175         }
176         tdb_io_init(tdb);
177         tdb->fd = -1;
178 #ifdef TDB_TRACE
179         tdb->tracefd = -1;
180 #endif
181         tdb->name = NULL;
182         tdb->map_ptr = NULL;
183         tdb->flags = tdb_flags;
184         tdb->open_flags = open_flags;
185         if (log_ctx) {
186                 tdb->log = *log_ctx;
187         } else {
188                 tdb->log.log_fn = null_log_fn;
189                 tdb->log.log_private = NULL;
190         }
191
192         if (hash_fn) {
193                 tdb->hash_fn = hash_fn;
194                 hash_alg = "the user defined";
195         } else {
196                 tdb->hash_fn = tdb_old_hash;
197                 hash_alg = "either default";
198         }
199
200         /* cache the page size */
201         tdb->page_size = getpagesize();
202         if (tdb->page_size <= 0) {
203                 tdb->page_size = 0x2000;
204         }
205
206         tdb->max_dead_records = (tdb_flags & TDB_VOLATILE) ? 5 : 0;
207
208         if ((open_flags & O_ACCMODE) == O_WRONLY) {
209                 TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: can't open tdb %s write-only\n",
210                          name));
211                 errno = EINVAL;
212                 goto fail;
213         }
214
215         if (hash_size == 0)
216                 hash_size = DEFAULT_HASH_SIZE;
217         if ((open_flags & O_ACCMODE) == O_RDONLY) {
218                 tdb->read_only = 1;
219                 /* read only databases don't do locking or clear if first */
220                 tdb->flags |= TDB_NOLOCK;
221                 tdb->flags &= ~TDB_CLEAR_IF_FIRST;
222         }
223
224         if ((tdb->flags & TDB_ALLOW_NESTING) &&
225             (tdb->flags & TDB_DISALLOW_NESTING)) {
226                 tdb->ecode = TDB_ERR_NESTING;
227                 TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_open_ex: "
228                         "allow_nesting and disallow_nesting are not allowed together!"));
229                 errno = EINVAL;
230                 goto fail;
231         }
232
233         if (getenv("TDB_NO_FSYNC")) {
234                 tdb->flags |= TDB_NOSYNC;
235         }
236
237         /*
238          * TDB_ALLOW_NESTING is the default behavior.
239          * Note: this may change in future versions!
240          */
241         if (!(tdb->flags & TDB_DISALLOW_NESTING)) {
242                 tdb->flags |= TDB_ALLOW_NESTING;
243         }
244
245         /* internal databases don't mmap or lock, and start off cleared */
246         if (tdb->flags & TDB_INTERNAL) {
247                 tdb->flags |= (TDB_NOLOCK | TDB_NOMMAP);
248                 tdb->flags &= ~TDB_CLEAR_IF_FIRST;
249                 if (tdb_new_database(tdb, hash_size) != 0) {
250                         TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: tdb_new_database failed!"));
251                         goto fail;
252                 }
253                 goto internal;
254         }
255
256         if ((tdb->fd = open(name, open_flags, mode)) == -1) {
257                 TDB_LOG((tdb, TDB_DEBUG_WARNING, "tdb_open_ex: could not open file %s: %s\n",
258                          name, strerror(errno)));
259                 goto fail;      /* errno set by open(2) */
260         }
261
262         /* on exec, don't inherit the fd */
263         v = fcntl(tdb->fd, F_GETFD, 0);
264         fcntl(tdb->fd, F_SETFD, v | FD_CLOEXEC);
265
266         /* ensure there is only one process initialising at once */
267         if (tdb_nest_lock(tdb, OPEN_LOCK, F_WRLCK, TDB_LOCK_WAIT) == -1) {
268                 TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: failed to get open lock on %s: %s\n",
269                          name, strerror(errno)));
270                 goto fail;      /* errno set by tdb_brlock */
271         }
272
273         /* we need to zero database if we are the only one with it open */
274         if ((tdb_flags & TDB_CLEAR_IF_FIRST) &&
275             (!tdb->read_only) &&
276             (locked = (tdb_nest_lock(tdb, ACTIVE_LOCK, F_WRLCK, TDB_LOCK_NOWAIT|TDB_LOCK_PROBE) == 0))) {
277                 open_flags |= O_CREAT;
278                 if (ftruncate(tdb->fd, 0) == -1) {
279                         TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_open_ex: "
280                                  "failed to truncate %s: %s\n",
281                                  name, strerror(errno)));
282                         goto fail; /* errno set by ftruncate */
283                 }
284         }
285
286         errno = 0;
287         if (read(tdb->fd, &tdb->header, sizeof(tdb->header)) != sizeof(tdb->header)
288             || strcmp(tdb->header.magic_food, TDB_MAGIC_FOOD) != 0) {
289                 if (!(open_flags & O_CREAT) || tdb_new_database(tdb, hash_size) == -1) {
290                         if (errno == 0) {
291                                 errno = EIO; /* ie bad format or something */
292                         }
293                         goto fail;
294                 }
295                 rev = (tdb->flags & TDB_CONVERT);
296         } else if (tdb->header.version != TDB_VERSION
297                    && !(rev = (tdb->header.version==TDB_BYTEREV(TDB_VERSION)))) {
298                 /* wrong version */
299                 errno = EIO;
300                 goto fail;
301         }
302         vp = (unsigned char *)&tdb->header.version;
303         vertest = (((uint32_t)vp[0]) << 24) | (((uint32_t)vp[1]) << 16) |
304                   (((uint32_t)vp[2]) << 8) | (uint32_t)vp[3];
305         tdb->flags |= (vertest==TDB_VERSION) ? TDB_BIGENDIAN : 0;
306         if (!rev)
307                 tdb->flags &= ~TDB_CONVERT;
308         else {
309                 tdb->flags |= TDB_CONVERT;
310                 tdb_convert(&tdb->header, sizeof(tdb->header));
311         }
312         if (fstat(tdb->fd, &st) == -1)
313                 goto fail;
314
315         if (tdb->header.rwlocks != 0) {
316                 TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: spinlocks no longer supported\n"));
317                 goto fail;
318         }
319
320         if ((tdb->header.magic1_hash == 0) && (tdb->header.magic2_hash == 0)) {
321                 /* older TDB without magic hash references */
322         } else if (!check_header_hash(tdb, !hash_fn, &magic1, &magic2)) {
323                 TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_open_ex: "
324                          "%s was not created with %s hash function we are using\n"
325                          "magic1_hash[0x%08X %s 0x%08X] "
326                          "magic2_hash[0x%08X %s 0x%08X]\n",
327                          name, hash_alg,
328                          tdb->header.magic1_hash,
329                          (tdb->header.magic1_hash == magic1) ? "==" : "!=",
330                          magic1,
331                          tdb->header.magic2_hash,
332                          (tdb->header.magic2_hash == magic2) ? "==" : "!=",
333                          magic2));
334                 errno = EINVAL;
335                 goto fail;
336         }
337
338         /* Is it already in the open list?  If so, fail. */
339         if (tdb_already_open(st.st_dev, st.st_ino)) {
340                 TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: "
341                          "%s (%d,%d) is already open in this process\n",
342                          name, (int)st.st_dev, (int)st.st_ino));
343                 errno = EBUSY;
344                 goto fail;
345         }
346
347         if (!(tdb->name = (char *)strdup(name))) {
348                 errno = ENOMEM;
349                 goto fail;
350         }
351
352         tdb->map_size = st.st_size;
353         tdb->device = st.st_dev;
354         tdb->inode = st.st_ino;
355         tdb_mmap(tdb);
356         if (locked) {
357                 if (tdb_nest_unlock(tdb, ACTIVE_LOCK, F_WRLCK, false) == -1) {
358                         TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: "
359                                  "failed to release ACTIVE_LOCK on %s: %s\n",
360                                  name, strerror(errno)));
361                         goto fail;
362                 }
363
364         }
365
366         /* We always need to do this if the CLEAR_IF_FIRST flag is set, even if
367            we didn't get the initial exclusive lock as we need to let all other
368            users know we're using it. */
369
370         if (tdb_flags & TDB_CLEAR_IF_FIRST) {
371                 /* leave this lock in place to indicate it's in use */
372                 if (tdb_nest_lock(tdb, ACTIVE_LOCK, F_RDLCK, TDB_LOCK_WAIT) == -1) {
373                         goto fail;
374                 }
375         }
376
377         /* if needed, run recovery */
378         if (tdb_transaction_recover(tdb) == -1) {
379                 goto fail;
380         }
381
382 #ifdef TDB_TRACE
383         {
384                 char tracefile[strlen(name) + 32];
385
386                 snprintf(tracefile, sizeof(tracefile),
387                          "%s.trace.%li", name, (long)getpid());
388                 tdb->tracefd = open(tracefile, O_WRONLY|O_CREAT|O_EXCL, 0600);
389                 if (tdb->tracefd >= 0) {
390                         tdb_enable_seqnum(tdb);
391                         tdb_trace_open(tdb, "tdb_open", hash_size, tdb_flags,
392                                        open_flags);
393                 } else
394                         TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: failed to open trace file %s!\n", tracefile));
395         }
396 #endif
397
398  internal:
399         /* Internal (memory-only) databases skip all the code above to
400          * do with disk files, and resume here by releasing their
401          * open lock and hooking into the active list. */
402         if (tdb_nest_unlock(tdb, OPEN_LOCK, F_WRLCK, false) == -1) {
403                 goto fail;
404         }
405         tdb->next = tdbs;
406         tdbs = tdb;
407         return tdb;
408
409  fail:
410         { int save_errno = errno;
411
412         if (!tdb)
413                 return NULL;
414
415 #ifdef TDB_TRACE
416         close(tdb->tracefd);
417 #endif
418         if (tdb->map_ptr) {
419                 if (tdb->flags & TDB_INTERNAL)
420                         SAFE_FREE(tdb->map_ptr);
421                 else
422                         tdb_munmap(tdb);
423         }
424         SAFE_FREE(tdb->name);
425         if (tdb->fd != -1)
426                 if (close(tdb->fd) != 0)
427                         TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: failed to close tdb->fd on error!\n"));
428         SAFE_FREE(tdb->lockrecs);
429         SAFE_FREE(tdb);
430         errno = save_errno;
431         return NULL;
432         }
433 }
434
435 /*
436  * Set the maximum number of dead records per hash chain
437  */
438
439 void tdb_set_max_dead(struct tdb_context *tdb, int max_dead)
440 {
441         tdb->max_dead_records = max_dead;
442 }
443
444 /**
445  * Close a database.
446  *
447  * @returns -1 for error; 0 for success.
448  **/
449 int tdb_close(struct tdb_context *tdb)
450 {
451         struct tdb_context **i;
452         int ret = 0;
453
454         if (tdb->transaction) {
455                 tdb_transaction_cancel(tdb);
456         }
457         tdb_trace(tdb, "tdb_close");
458
459         if (tdb->map_ptr) {
460                 if (tdb->flags & TDB_INTERNAL)
461                         SAFE_FREE(tdb->map_ptr);
462                 else
463                         tdb_munmap(tdb);
464         }
465         SAFE_FREE(tdb->name);
466         if (tdb->fd != -1) {
467                 ret = close(tdb->fd);
468                 tdb->fd = -1;
469         }
470         SAFE_FREE(tdb->lockrecs);
471
472         /* Remove from contexts list */
473         for (i = &tdbs; *i; i = &(*i)->next) {
474                 if (*i == tdb) {
475                         *i = tdb->next;
476                         break;
477                 }
478         }
479
480 #ifdef TDB_TRACE
481         close(tdb->tracefd);
482 #endif
483         memset(tdb, 0, sizeof(*tdb));
484         SAFE_FREE(tdb);
485
486         return ret;
487 }
488
489 /* register a loging function */
490 void tdb_set_logging_function(struct tdb_context *tdb,
491                               const struct tdb_logging_context *log_ctx)
492 {
493         tdb->log = *log_ctx;
494 }
495
496 void *tdb_get_logging_private(struct tdb_context *tdb)
497 {
498         return tdb->log.log_private;
499 }
500
501 static int tdb_reopen_internal(struct tdb_context *tdb, bool active_lock)
502 {
503 #if !defined(LIBREPLACE_PREAD_NOT_REPLACED) || \
504         !defined(LIBREPLACE_PWRITE_NOT_REPLACED)
505         struct stat st;
506 #endif
507
508         if (tdb->flags & TDB_INTERNAL) {
509                 return 0; /* Nothing to do. */
510         }
511
512         if (tdb_have_extra_locks(tdb)) {
513                 TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_reopen: reopen not allowed with locks held\n"));
514                 goto fail;
515         }
516
517         if (tdb->transaction != 0) {
518                 TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_reopen: reopen not allowed inside a transaction\n"));
519                 goto fail;
520         }
521
522 /* If we have real pread & pwrite, we can skip reopen. */
523 #if !defined(LIBREPLACE_PREAD_NOT_REPLACED) || \
524         !defined(LIBREPLACE_PWRITE_NOT_REPLACED)
525         if (tdb_munmap(tdb) != 0) {
526                 TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: munmap failed (%s)\n", strerror(errno)));
527                 goto fail;
528         }
529         if (close(tdb->fd) != 0)
530                 TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: WARNING closing tdb->fd failed!\n"));
531         tdb->fd = open(tdb->name, tdb->open_flags & ~(O_CREAT|O_TRUNC), 0);
532         if (tdb->fd == -1) {
533                 TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: open failed (%s)\n", strerror(errno)));
534                 goto fail;
535         }
536         if (fstat(tdb->fd, &st) != 0) {
537                 TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: fstat failed (%s)\n", strerror(errno)));
538                 goto fail;
539         }
540         if (st.st_ino != tdb->inode || st.st_dev != tdb->device) {
541                 TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: file dev/inode has changed!\n"));
542                 goto fail;
543         }
544         tdb_mmap(tdb);
545 #endif /* fake pread or pwrite */
546
547         /* We may still think we hold the active lock. */
548         tdb->num_lockrecs = 0;
549         SAFE_FREE(tdb->lockrecs);
550
551         if (active_lock && tdb_nest_lock(tdb, ACTIVE_LOCK, F_RDLCK, TDB_LOCK_WAIT) == -1) {
552                 TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: failed to obtain active lock\n"));
553                 goto fail;
554         }
555
556         return 0;
557
558 fail:
559         tdb_close(tdb);
560         return -1;
561 }
562
563 /* reopen a tdb - this can be used after a fork to ensure that we have an independent
564    seek pointer from our parent and to re-establish locks */
565 int tdb_reopen(struct tdb_context *tdb)
566 {
567         return tdb_reopen_internal(tdb, tdb->flags & TDB_CLEAR_IF_FIRST);
568 }
569
570 /* reopen all tdb's */
571 int tdb_reopen_all(int parent_longlived)
572 {
573         struct tdb_context *tdb;
574
575         for (tdb=tdbs; tdb; tdb = tdb->next) {
576                 bool active_lock = (tdb->flags & TDB_CLEAR_IF_FIRST);
577
578                 /*
579                  * If the parent is longlived (ie. a
580                  * parent daemon architecture), we know
581                  * it will keep it's active lock on a
582                  * tdb opened with CLEAR_IF_FIRST. Thus
583                  * for child processes we don't have to
584                  * add an active lock. This is essential
585                  * to improve performance on systems that
586                  * keep POSIX locks as a non-scalable data
587                  * structure in the kernel.
588                  */
589                 if (parent_longlived) {
590                         /* Ensure no clear-if-first. */
591                         active_lock = false;
592                 }
593
594                 if (tdb_reopen_internal(tdb, active_lock) != 0)
595                         return -1;
596         }
597
598         return 0;
599 }