Mercurial > dovecot > original-hg > dovecot-1.2
diff src/lib-index/mail-cache-fields.c @ 6296:205ee38f10d1 HEAD
Drop fields that haven't been used for 30 days when compressing.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 13 Aug 2007 20:16:55 +0300 |
parents | 6f66ce9491ad |
children | 65c69a53a7be |
line wrap: on
line diff
--- a/src/lib-index/mail-cache-fields.c Mon Aug 13 20:16:07 2007 +0300 +++ b/src/lib-index/mail-cache-fields.c Mon Aug 13 20:16:55 2007 +0300 @@ -211,6 +211,7 @@ const char *p, *names, *end; void *orig_key, *orig_value; unsigned int new_fields_count; + time_t max_drop_time; uint32_t offset, i; if (mail_cache_header_fields_get_offset(cache, &offset) < 0) @@ -275,6 +276,9 @@ for (i = 0; i < cache->fields_count; i++) cache->field_file_map[i] = (uint32_t)-1; + max_drop_time = cache->index->map->hdr.day_stamp - + MAIL_CACHE_FIELD_DROP_SECS; + memset(&field, 0, sizeof(field)); for (i = 0; i < field_hdr->fields_count; i++) { for (p = names; p != end && *p != '\0'; p++) ; @@ -317,6 +321,8 @@ "Duplicated field in header: %s", names); return -1; } + cache->fields[field.idx].used = TRUE; + cache->field_file_map[field.idx] = i; cache->file_field_map[i] = field.idx; @@ -324,6 +330,11 @@ if (last_used[i] > cache->fields[field.idx].last_used) cache->fields[field.idx].last_used = last_used[i]; + if (cache->fields[field.idx].last_used < max_drop_time) { + /* time to drop this field */ + cache->need_compress_file_seq = cache->hdr->file_seq; + } + names = p + 1; } return 0; @@ -341,7 +352,8 @@ buffer_append(dest, data, size); } for (i = 0; i < cache->fields_count; i++) { - if (cache->field_file_map[i] != (uint32_t)-1) + if (cache->field_file_map[i] != (uint32_t)-1 || + !cache->fields[i].used) continue; data = CONST_PTR_OFFSET(&cache->fields[i], offset); buffer_append(dest, data, size); @@ -362,7 +374,8 @@ buffer_append(dest, &byte, 1); } for (i = 0; i < cache->fields_count; i++) { - if (cache->field_file_map[i] != (uint32_t)-1) + if (cache->field_file_map[i] != (uint32_t)-1 || + !cache->fields[i].used) continue; data = CONST_PTR_OFFSET(&cache->fields[i], offset); byte = (uint8_t)*data; @@ -435,7 +448,12 @@ uint32_t i; memset(&hdr, 0, sizeof(hdr)); - hdr.fields_count = cache->fields_count; + hdr.fields_count = cache->file_fields_count; + for (i = 0; i < cache->fields_count; i++) { + if (cache->field_file_map[i] == (uint32_t)-1 && + cache->fields[i].used) + hdr.fields_count++; + } buffer_append(dest, &hdr, sizeof(hdr)); /* we have to keep the field order for the existing fields. */ @@ -451,14 +469,17 @@ i_assert(buffer_get_used_size(dest) == sizeof(hdr) + (sizeof(uint32_t)*2 + 2) * hdr.fields_count); + /* add fields' names */ for (i = 0; i < cache->file_fields_count; i++) { field = cache->file_field_map[i]; name = cache->fields[field].field.name; buffer_append(dest, name, strlen(name)+1); } for (i = 0; i < cache->fields_count; i++) { - if (cache->field_file_map[i] != (uint32_t)-1) + if (cache->field_file_map[i] != (uint32_t)-1 || + !cache->fields[i].used) continue; + name = cache->fields[i].field.name; buffer_append(dest, name, strlen(name)+1); }