[dovecot-cvs] dovecot/src/lib-index mail-index-private.h, 1.7,
1.8 mail-index.c, 1.111, 1.112 mail-transaction-log-view.c,
1.4, 1.5 mail-transaction-log.c, 1.8,
1.9 mail-transaction-log.h, 1.1, 1.2
cras at procontrol.fi
cras at procontrol.fi
Thu Apr 29 03:08:02 EEST 2004
Update of /home/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv14645/lib-index
Modified Files:
mail-index-private.h mail-index.c mail-transaction-log-view.c
mail-transaction-log.c mail-transaction-log.h
Log Message:
Don't modify index file when creating new transaction log.
Index: mail-index-private.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-private.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- mail-index-private.h 28 Apr 2004 20:51:22 -0000 1.7
+++ mail-index-private.h 29 Apr 2004 00:08:00 -0000 1.8
@@ -70,7 +70,7 @@
uint32_t indexid;
int lock_type, shared_lock_count, excl_lock_count;
- unsigned int lock_id, opening_lock_id;
+ unsigned int lock_id;
char *copy_lock_path;
struct dotlock dotlock;
Index: mail-index.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index.c,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -d -r1.111 -r1.112
--- mail-index.c 28 Apr 2004 20:51:22 -0000 1.111
+++ mail-index.c 29 Apr 2004 00:08:00 -0000 1.112
@@ -538,10 +538,10 @@
mail_index_open2(struct mail_index *index, enum mail_index_open_flags flags)
{
struct mail_index_header hdr;
+ unsigned int lock_id = 0;
int ret;
- index->opening_lock_id = 0;
- ret = mail_index_try_open(index, &index->opening_lock_id);
+ ret = mail_index_try_open(index, &lock_id);
if (ret > 0)
hdr = *index->hdr;
else if (ret == 0) {
@@ -559,10 +559,8 @@
if (index->log == NULL)
return -1;
- if (index->opening_lock_id != 0) {
- mail_index_unlock(index, index->opening_lock_id);
- index->opening_lock_id = 0;
- }
+ if (lock_id != 0)
+ mail_index_unlock(index, lock_id);
return index->fd != -1 ? 1 : mail_index_create(index, &hdr);
}
Index: mail-transaction-log-view.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log-view.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- mail-transaction-log-view.c 28 Apr 2004 23:15:44 -0000 1.4
+++ mail-transaction-log-view.c 29 Apr 2004 00:08:00 -0000 1.5
@@ -88,8 +88,33 @@
mail_transaction_log_view_close_files(view);
ret = mail_transaction_log_file_find(view->log, min_file_seq, &file);
- if (ret <= 0)
- return -1;
+ if (ret <= 0) {
+ if (ret == 0 &&
+ min_file_seq == view->log->tail->hdr.file_seq-1 &&
+ min_file_offset == view->log->tail->hdr.prev_file_offset) {
+ /* we can skip this */
+ min_file_seq++;
+ min_file_offset =
+ sizeof(struct mail_transaction_log_header);
+ ret = mail_transaction_log_file_find(view->log,
+ min_file_seq,
+ &file);
+ }
+
+ if (ret == 0) {
+ mail_index_set_error(view->log->index,
+ "Lost transaction log file %s seq %u",
+ view->log->tail->filepath, min_file_seq);
+ }
+ if (ret <= 0)
+ return -1;
+
+ if (min_file_seq > max_file_seq) {
+ /* empty view */
+ max_file_seq = min_file_seq;
+ max_file_offset = min_file_offset;
+ }
+ }
end_offset = min_file_seq == max_file_seq ?
max_file_offset : (uoff_t)-1;
ret = mail_transaction_log_file_map(file, min_file_offset, end_offset);
Index: mail-transaction-log.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- mail-transaction-log.c 28 Apr 2004 23:15:44 -0000 1.8
+++ mail-transaction-log.c 29 Apr 2004 00:08:00 -0000 1.9
@@ -61,6 +61,12 @@
va_end(va);
}
+#define INDEX_HAS_MISSING_LOGS(index, file) \
+ ((file)->hdr.file_seq != (index)->hdr->log_file_seq && \
+ ((file)->hdr.file_seq != (index)->hdr->log_file_seq+1 || \
+ (file)->hdr.prev_file_offset != (index)->hdr->log_file_offset))
+
+
static int mail_transaction_log_check_file_seq(struct mail_transaction_log *log)
{
struct mail_index *index = log->index;
@@ -77,7 +83,7 @@
ret = mail_index_map(index, FALSE);
if (ret <= 0)
ret = -1;
- else if (file->hdr.file_seq != index->hdr->log_file_seq) {
+ else if (INDEX_HAS_MISSING_LOGS(index, file)) {
/* broken - fix it by creating a new log file */
ret = mail_transaction_log_rotate(log);
}
@@ -104,11 +110,10 @@
}
if (index->fd != -1 &&
- log->head->hdr.file_seq != index->hdr->log_file_seq) {
+ INDEX_HAS_MISSING_LOGS(index, log->head)) {
/* head log file isn't same as head index file -
shouldn't happen except in race conditions. lock them and
- check again - FIXME: missing error handling.
- FIXME: index->hdr check crashes if we created the log */
+ check again - FIXME: missing error handling. */
(void)mail_transaction_log_check_file_seq(log);
}
return log;
@@ -280,14 +285,13 @@
return 1;
}
-static int mail_transaction_log_file_create(struct mail_transaction_log *log,
- const char *path,
- dev_t dev, ino_t ino)
+static int
+mail_transaction_log_file_create(struct mail_transaction_log *log,
+ const char *path, dev_t dev, ino_t ino)
{
struct mail_index *index = log->index;
struct mail_transaction_log_header hdr;
struct stat st;
- unsigned int lock_id;
int fd, fd2, ret;
fd = file_dotlock_open(path, NULL, LOG_DOTLOCK_TIMEOUT,
@@ -326,37 +330,9 @@
hdr.indexid = index->indexid;
hdr.used_size = sizeof(hdr);
- if (index->fd != -1) {
- index->log_locked = TRUE; /* kludging around assert.. */
- if (mail_index_lock_exclusive(index, &lock_id) < 0) {
- (void)file_dotlock_delete(path, fd);
- index->log_locked = FALSE;
- return -1;
- }
-
- ret = mail_index_map(index, FALSE);
- if (ret > 0) {
- /* update log_file_* fields in header */
- struct mail_index_header idx_hdr;
-
- idx_hdr = *index->hdr;
- idx_hdr.log_file_seq++;
- idx_hdr.log_file_offset = sizeof(hdr);
- if (mail_index_write_header(index, &idx_hdr) < 0)
- ret = -1;
- }
- hdr.file_seq = index->hdr->log_file_seq;
- mail_index_unlock(index, lock_id);
- index->log_locked = FALSE;
-
- if (ret <= 0) {
- (void)file_dotlock_delete(path, fd);
- return -1;
- }
- } else {
- /* creating new index file */
- hdr.file_seq = index->hdr->log_file_seq+1;
- }
+ if (index->fd != -1)
+ hdr.prev_file_offset = index->hdr->log_file_offset;
+ hdr.file_seq = index->hdr->log_file_seq+1;
if (write_full(fd, &hdr, sizeof(hdr)) < 0) {
mail_index_file_set_syscall_error(index, path, "write_full()");
Index: mail-transaction-log.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- mail-transaction-log.h 27 Apr 2004 20:25:53 -0000 1.1
+++ mail-transaction-log.h 29 Apr 2004 00:08:00 -0000 1.2
@@ -6,6 +6,7 @@
struct mail_transaction_log_header {
uint32_t indexid;
uint32_t file_seq;
+ uint32_t prev_file_offset;
uint32_t used_size;
};
More information about the dovecot-cvs
mailing list