[dovecot-cvs] dovecot/src/lib-index mail-index-lock.c, 1.2,
1.3 mail-index-sync-update.c, 1.2, 1.3 mail-index.c, 1.107,
1.108 mail-transaction-log-view.c, 1.1,
1.2 mail-transaction-log.c, 1.2, 1.3
cras at procontrol.fi
cras at procontrol.fi
Wed Apr 28 04:21:45 EEST 2004
Update of /home/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv628/lib-index
Modified Files:
mail-index-lock.c mail-index-sync-update.c mail-index.c
mail-transaction-log-view.c mail-transaction-log.c
Log Message:
locking fixes, mmap_disable=yes fixes
Index: mail-index-lock.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-lock.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-index-lock.c 28 Apr 2004 00:21:00 -0000 1.2
+++ mail-index-lock.c 28 Apr 2004 01:21:42 -0000 1.3
@@ -241,6 +241,8 @@
index->excl_lock_count++;
if (mail_index_reopen(index, fd) < 0) {
+ /* FIXME: do this without another reopen which drops locks
+ and causes potential crashes */
i_assert(index->excl_lock_count == 1);
i_free(index->copy_lock_path);
index->copy_lock_path = NULL;
@@ -304,6 +306,17 @@
static int mail_index_copy_lock_finish(struct mail_index *index)
{
+ if (index->shared_lock_count > 0) {
+ /* leave ourself shared locked. */
+ if (file_try_lock(index->fd, F_RDLCK) <= 0) {
+ mail_index_file_set_syscall_error(index,
+ index->copy_lock_path,
+ "file_try_lock()");
+ return -1;
+ }
+ index->lock_id--;
+ }
+
if (fsync(index->fd) < 0) {
mail_index_file_set_syscall_error(index, index->copy_lock_path,
"fsync()");
@@ -318,40 +331,34 @@
i_free(index->copy_lock_path);
index->copy_lock_path = NULL;
-
- index->shared_lock_count = 0;
- index->lock_id += 2;
- index->lock_type = F_UNLCK;
return 0;
}
-void mail_index_unlock(struct mail_index *index, unsigned int lock_id)
+static void mail_index_excl_unlock_finish(struct mail_index *index)
{
- if (index->copy_lock_path != NULL ||
- (index->map != NULL && index->map->write_to_disk)) {
+ if (index->map != NULL && index->map->write_to_disk) {
i_assert(index->log_locked);
- i_assert(index->excl_lock_count > 0);
- i_assert(lock_id == index->lock_id+1);
- if (--index->excl_lock_count == 0) {
- if (index->map != NULL && index->map->write_to_disk) {
- if (index->copy_lock_path != NULL) {
- /* new mapping replaces the old */
- (void)unlink(index->copy_lock_path);
- i_free(index->copy_lock_path);
- index->copy_lock_path = NULL;
- }
- if (mail_index_copy(index) < 0) {
- mail_index_set_inconsistent(index);
- return;
- }
- }
- if (mail_index_copy_lock_finish(index) < 0)
- mail_index_set_inconsistent(index);
+ if (index->copy_lock_path != NULL) {
+ /* new mapping replaces the old */
+ (void)unlink(index->copy_lock_path);
+ i_free(index->copy_lock_path);
+ index->copy_lock_path = NULL;
}
- return;
+ if (mail_index_copy(index) < 0)
+ mail_index_set_inconsistent(index);
}
+ if (index->copy_lock_path != NULL) {
+ i_assert(index->log_locked);
+
+ if (mail_index_copy_lock_finish(index) < 0)
+ mail_index_set_inconsistent(index);
+ }
+}
+
+void mail_index_unlock(struct mail_index *index, unsigned int lock_id)
+{
if ((lock_id & 1) == 0) {
/* shared lock */
if (mail_index_is_locked(index, lock_id)) {
@@ -362,13 +369,15 @@
/* exclusive lock */
i_assert(lock_id == index->lock_id+1);
i_assert(index->excl_lock_count > 0);
- index->excl_lock_count--;
+ if (--index->excl_lock_count == 0)
+ mail_index_excl_unlock_finish(index);
}
if (index->shared_lock_count == 0 && index->excl_lock_count == 0) {
index->lock_id += 2;
index->lock_type = F_UNLCK;
- if (index->map != NULL) {
+ if (index->map != NULL &&
+ !MAIL_INDEX_MAP_IS_IN_MEMORY(index->map)) {
if (mprotect(index->map->mmap_base,
index->map->file_size, PROT_NONE) < 0)
mail_index_set_syscall_error(index,
Index: mail-index-sync-update.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-sync-update.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-index-sync-update.c 28 Apr 2004 00:21:00 -0000 1.2
+++ mail-index-sync-update.c 28 Apr 2004 01:21:42 -0000 1.3
@@ -263,6 +263,9 @@
memcpy(map->mmap_base, &ctx.hdr, sizeof(ctx.hdr));
if (msync(map->mmap_base, map->file_used_size, MS_SYNC) < 0)
return mail_index_set_syscall_error(index, "msync()");
+ } else {
+ map->hdr_copy = ctx.hdr;
+ map->hdr = &map->hdr_copy;
}
return ret;
Index: mail-index.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index.c,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -d -r1.107 -r1.108
--- mail-index.c 28 Apr 2004 00:21:00 -0000 1.107
+++ mail-index.c 28 Apr 2004 01:21:42 -0000 1.108
@@ -313,7 +313,7 @@
map->log_file_seq = map->hdr->log_file_seq;
map->log_file_offset = map->hdr->log_file_offset;
- index->hdr = map->mmap_base;
+ index->hdr = map->hdr;
index->map = map;
return 1;
}
Index: mail-transaction-log-view.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log-view.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- mail-transaction-log-view.c 27 Apr 2004 20:25:53 -0000 1.1
+++ mail-transaction-log-view.c 28 Apr 2004 01:21:42 -0000 1.2
@@ -151,13 +151,11 @@
{
va_list va;
- i_assert(view->file != NULL);
-
view->broken = TRUE;
va_start(va, fmt);
t_push();
- mail_transaction_log_file_set_corrupted(view->file, "%s",
+ mail_transaction_log_file_set_corrupted(view->log->head, "%s",
t_strdup_vprintf(fmt, va));
t_pop();
va_end(va);
Index: mail-transaction-log.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-transaction-log.c 28 Apr 2004 00:21:00 -0000 1.2
+++ mail-transaction-log.c 28 Apr 2004 01:21:42 -0000 1.3
@@ -102,7 +102,8 @@
log->head->hdr.file_seq != index->hdr->log_file_seq) {
/* 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 */
+ check again - FIXME: missing error handling.
+ FIXME: index->hdr check crashes if we created the log */
(void)mail_transaction_log_check_file_seq(log);
}
return log;
@@ -178,6 +179,7 @@
}
if (ret < 0) {
+ // FIXME: handle ESTALE
mail_index_file_set_syscall_error(file->log->index,
file->filepath, "pread()");
return -1;
@@ -542,6 +544,9 @@
}
size = file->hdr.used_size - file->buffer_offset - size;
+ if (size == 0)
+ return 1;
+
data = buffer_append_space_unsafe(file->buffer, size);
ret = pread(file->fd, data, size, offset);
More information about the dovecot-cvs
mailing list