2 * Sherlock Library -- Object Buckets
4 * (c) 2001--2004 Martin Mares <mj@ucw.cz>
6 * This software may be freely distributed and used according to the terms
7 * of the GNU Lesser General Public License.
10 #ifndef _SHERLOCK_BUCKET_H
11 #define _SHERLOCK_BUCKET_H
14 * Format: The object pool is merely a sequence of object buckets.
15 * Each bucket starts with struct obuck_header and it's padded
16 * by zeros to a multiple of OBUCK_ALIGN bytes.
18 * Locking: Each operation on the pool is protected by a flock.
20 * The buckets emulate fastbuf streams. Read streams act as normal files,
21 * but there can be only one write stream which is non-seekable and you
22 * also shouldn't open new read streams when writing.
24 * fork()'ing if you don't have any bucket open is safe.
27 extern byte *obuck_name; /* Internal, for use by buckettool only! */
30 #define OBUCK_ALIGN (1<<OBUCK_SHIFT)
31 #define OBUCK_MAGIC 0xdeadf00d
32 #define OBUCK_INCOMPLETE_MAGIC 0xdeadfeel
33 #define OBUCK_TRAILER 0xfeedcafe
34 #define OBUCK_OID_DELETED (~(oid_t)0)
35 #define OBUCK_OID_FIRST_SPECIAL (~(oid_t)0xffff)
38 u32 magic; /* OBUCK_MAGIC should dwell here */
39 oid_t oid; /* ID of this object or OBUCK_OID_DELETED */
40 u32 length; /* Length of data in the bucket */
41 u32 type; /* Data type */
42 /* Bucket data continue here */
46 BUCKET_TYPE_COMPAT = 0x7fffffff, /* and less -- buckets created by older versions of Sherlock */
47 BUCKET_TYPE_PLAIN = 0x80000000, /* plain textual buckets */
48 BUCKET_TYPE_V30 = 0x80000001, /* v3.0 uncompressed buckets */
49 BUCKET_TYPE_V30C = 0x80000002 /* v3.0 compressed buckets */
54 void obuck_init(int writeable); /* Initialize the bucket module */
55 void obuck_cleanup(void); /* Clean up the bucket module */
56 void obuck_sync(void); /* Flush all buffers to disk */
57 void obuck_lock_read(void); /* Explicit locking to make sure other threads don't touch buckets now */
58 void obuck_lock_write(void);
59 void obuck_unlock(void);
60 oid_t obuck_predict_last_oid(void); /* Get OID corresponding to the next to be created bucket (i.e., bucket file size estimate) */
62 /* Searching for buckets */
63 void obuck_find_by_oid(struct obuck_header *hdrp);
64 int obuck_find_first(struct obuck_header *hdrp, int full);
65 int obuck_find_next(struct obuck_header *hdrp, int full);
67 /* Reading current bucket */
68 struct fastbuf *obuck_fetch(void);
70 /* Creating buckets */
71 struct fastbuf *obuck_create(u32 type);
72 void obuck_create_end(struct fastbuf *b, struct obuck_header *hdrp);
74 /* Deleting buckets */
75 void obuck_delete(oid_t oid);
77 /* Fast reading of the whole pool */
78 struct fastbuf *obuck_slurp_pool(struct obuck_header *hdrp);
80 /* Convert bucket ID to file position (for size limitations etc.) */
82 static inline sh_off_t obuck_get_pos(oid_t oid)
84 return ((sh_off_t) oid) << OBUCK_SHIFT;
87 /* Calculate size of bucket which contains given amount of data */
89 static inline uns obuck_bucket_size(uns len)
91 return ALIGN(sizeof(struct obuck_header) + len + 4, OBUCK_ALIGN);
94 /* Shaking down bucket file */
95 void obuck_shakedown(int (*kibitz)(struct obuck_header *old, oid_t new, byte *buck));