]> git.proxmox.com Git - pve-cluster.git/blame - data/src/memdb.h
pmxcfs: increase max filesize from 128k to 512k
[pve-cluster.git] / data / src / memdb.h
CommitLineData
fe000966
DM
1/*
2 Copyright (C) 2010 Proxmox Server Solutions GmbH
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU Affero General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Affero General Public License for more details.
13
14 You should have received a copy of the GNU Affero General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17 Author: Dietmar Maurer <dietmar@proxmox.com>
18
19*/
20
21#ifndef _PVE_MEMDB_H_
22#define _PVE_MEMDB_H_
23
24
25#include <stdio.h>
26#include <stdlib.h>
27
28#include <glib.h>
29#include <sys/statvfs.h>
30
342c3c55 31#define MEMDB_MAX_FILE_SIZE (512*1024)
fe000966
DM
32#define MEMDB_MAX_FSSIZE (30*1024*1024)
33#define MEMDB_MAX_INODES 10000
34
35#define MEMDB_BLOCKSIZE 4096
36#define MEMDB_BLOCKS ((MEMDB_MAX_FSSIZE + MEMDB_BLOCKSIZE - 1)/MEMDB_BLOCKSIZE)
37
38typedef struct memdb_tree_entry memdb_tree_entry_t;
39struct memdb_tree_entry {
40 guint64 parent;
41 guint64 inode;
42 guint64 version;
43 guint32 writer;
44 guint32 mtime;
45 guint32 size;
46 char type; /* DT_REG .. regular file, DT_DIR ... directory */
47 union {
48 GHashTable *entries;
49 gpointer value;
50 } data;
51 char name[0];
52};
53
54typedef struct {
55 guint64 inode;
56 char digest[32]; /* SHA256 digest */
57} memdb_index_extry_t;
58
59typedef struct {
60 guint64 version;
61 guint64 last_inode;
62 guint32 writer;
63 guint32 mtime;
64 guint32 size; /* number of entries */
65 guint32 bytes; /* total bytes allocated */
66 memdb_index_extry_t entries[0];
67} memdb_index_t;
68
69typedef struct db_backend db_backend_t;
70
71typedef struct {
72 char *path;
73 guint32 ltime;
74 guchar csum[32];
75} memdb_lock_info_t;
76
77typedef struct {
78 char *dbfilename;
79 gboolean errors;
80 memdb_tree_entry_t *root;
81 GHashTable *index; /* map version ==> memdb_tree_entry */
82 GHashTable *locks; /* contains memdb_lock_info_t */
89fde9ac 83 GMutex mutex;
fe000966
DM
84 db_backend_t *bdb;
85} memdb_t;
86
87memdb_t *
88memdb_open(const char *dbfilename);
89
90void
91memdb_close(memdb_t *memdb);
92
93gboolean
94memdb_checkpoint(memdb_t *memdb);
95
96gboolean
97memdb_recreate_vmlist(memdb_t *memdb);
98
99gboolean
100memdb_lock_expired(
101 memdb_t *memdb,
102 const char *path,
103 const guchar csum[32]);
104
105void
106memdb_update_locks(memdb_t *memdb);
107
108int
109memdb_statfs(
110 memdb_t *memdb,
111 struct statvfs *stbuf);
112
113int
114memdb_mkdir(
115 memdb_t *memdb,
116 const char *path,
117 guint32 writer,
118 guint32 mtime);
119
120int
121memdb_mtime(
122 memdb_t *memdb,
123 const char *path,
124 guint32 writer,
125 guint32 mtime);
126
127GList *
128memdb_readdir(
129 memdb_t *memdb,
130 const char *path);
131
132void
133memdb_dirlist_free(GList *dirlist);
134
135void
136tree_entry_debug(memdb_tree_entry_t *te);
137
138void
139tree_entry_print(memdb_tree_entry_t *te);
140
141memdb_tree_entry_t *
142memdb_tree_entry_new(const char *name);
143
144memdb_tree_entry_t *
145memdb_tree_entry_copy(
146 memdb_tree_entry_t *te,
147 gboolean with_data);
148
149void
150memdb_tree_entry_free(memdb_tree_entry_t *te);
151
152int
153memdb_delete(
154 memdb_t *memdb,
155 const char *path,
156 guint32 writer,
157 guint32 mtime);
158
159int
160memdb_read(
161 memdb_t *memdb,
162 const char *path,
163 gpointer *data_ret);
164
165int
166memdb_create(
167 memdb_t *memdb,
168 const char *path,
169 guint32 writer,
170 guint32 mtime);
171
172int
173memdb_write(
174 memdb_t *memdb,
175 const char *path,
176 guint32 writer,
177 guint32 mtime,
178 gconstpointer data,
179 size_t count,
180 off_t offset,
181 gboolean truncate);
182
183memdb_tree_entry_t *
184memdb_getattr(
185 memdb_t *memdb,
186 const char *path);
187
188int
189memdb_rename(
190 memdb_t *memdb,
191 const char *from,
192 const char *to,
193 guint32 writer,
194 guint32 mtime);
195
196void
197memdb_dump (
198 memdb_t *memdb);
199
200gboolean
201memdb_compute_checksum(
202 GHashTable *index,
203 memdb_tree_entry_t *root,
204 guchar *csum,
205 size_t csum_len);
206
207memdb_index_t *
208memdb_encode_index(
209 GHashTable *index,
210 memdb_tree_entry_t *root);
211
212void
213memdb_dump_index (memdb_index_t *idx);
214
215memdb_index_t *
216memdb_index_copy(memdb_index_t *idx);
217
218gboolean
219memdb_tree_entry_csum(
220 memdb_tree_entry_t *te,
221 guchar csum[32]);
222
223db_backend_t *
224bdb_backend_open(
225 const char *filename,
226 memdb_tree_entry_t *root,
227 GHashTable *index);
228
229void
230bdb_backend_close(db_backend_t *bdb);
231
232int
233bdb_backend_write(
234 db_backend_t *bdb,
235 guint64 inode,
236 guint64 parent,
237 guint64 version,
238 guint32 writer,
239 guint32 mtime,
240 guint32 size,
241 char type,
242 char *name,
243 gpointer value,
244 guint64 delete_inode);
245
246gboolean
247bdb_backend_commit_update(
248 memdb_t *memdb,
249 memdb_index_t *master,
250 memdb_index_t *slave,
251 GList *inodes);
252
253
254#endif /* _PVE_MEMDB_H_ */