]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Add MAIL_FETCH_REFCOUNT_ID
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 28 Nov 2019 18:28:35 +0000 (20:28 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 10 Jan 2020 07:15:27 +0000 (07:15 +0000)
This returns a unique ID for the mail that is counted by
MAIL_FETCH_REFCOUNT. For example if the refcount is counted using the
file's st_nlinks, then the refcount-id is the file's inode number. This is
likely only going to be used by lazy_expunge_only_last_instance=yes
tracking.

src/lib-storage/index/dbox-multi/mdbox-mail.c
src/lib-storage/index/dbox-single/sdbox-mail.c
src/lib-storage/index/index-mail.c
src/lib-storage/index/maildir/maildir-mail.c
src/lib-storage/mail-storage.h

index 84b63900014ee5b6d81da9c75871149232509f06..1b48f4fedfa4804b8c6cb442bbfa8f816164255d 100644 (file)
@@ -186,6 +186,13 @@ mdbox_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
                *value_r = p_strdup_printf(mail->imail.mail.data_pool, "%u",
                                           refcount);
                return 0;
+       case MAIL_FETCH_REFCOUNT_ID:
+               if (mdbox_mail_lookup(mbox, _mail->transaction->view,
+                                     _mail->seq, &map_uid) < 0)
+                       return -1;
+               *value_r = p_strdup_printf(mail->imail.mail.data_pool, "%u",
+                                          map_uid);
+               return 0;
        case MAIL_FETCH_UIDL_BACKEND:
                if (!dbox_header_have_flag(&mbox->box, mbox->hdr_ext_id,
                                offsetof(struct mdbox_index_header, flags),
index 0357a97bdbe067bd1a06dbf1be5678d7cfa509d3..d53aa11a38e2def85f64b8441ac23d4738cac6c7 100644 (file)
@@ -79,6 +79,19 @@ sdbox_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
                *value_r = p_strdup_printf(mail->imail.mail.data_pool, "%lu",
                                           (unsigned long)st.st_nlink);
                return 0;
+       case MAIL_FETCH_REFCOUNT_ID:
+               if (sdbox_mail_file_set(mail) < 0)
+                       return -1;
+
+               _mail->transaction->stats.fstat_lookup_count++;
+               if (dbox_file_stat(mail->open_file, &st) < 0) {
+                       if (errno == ENOENT)
+                               mail_set_expunged(_mail);
+                       return -1;
+               }
+               *value_r = p_strdup_printf(mail->imail.mail.data_pool, "%llu",
+                                          (unsigned long long)st.st_ino);
+               return 0;
        case MAIL_FETCH_UIDL_BACKEND:
                if (!dbox_header_have_flag(&mbox->box, mbox->hdr_ext_id,
                                offsetof(struct sdbox_index_header, flags),
index 35778794694b14f1155519911d92fbdbbf4e181f..26d22311f9b129b1e65cd2d1f50256fc5e5f962f 100644 (file)
@@ -1601,6 +1601,7 @@ int index_mail_get_special(struct mail *_mail,
        case MAIL_FETCH_HEADER_MD5:
        case MAIL_FETCH_POP3_ORDER:
        case MAIL_FETCH_REFCOUNT:
+       case MAIL_FETCH_REFCOUNT_ID:
                *value_r = "";
                return 0;
        case MAIL_FETCH_MAILBOX_NAME:
index 759c717d024b3f7e7b10643d8b8e214d324317ae..c21215faba1ed939577dc32a327e673b19526f91 100644 (file)
@@ -581,6 +581,12 @@ maildir_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
                *value_r = p_strdup_printf(mail->mail.data_pool, "%lu",
                                           (unsigned long)st.st_nlink);
                return 0;
+       case MAIL_FETCH_REFCOUNT_ID:
+               if (maildir_mail_stat(_mail, &st) < 0)
+                       return -1;
+               *value_r = p_strdup_printf(mail->mail.data_pool, "%llu",
+                                          (unsigned long long)st.st_ino);
+               return 0;
        default:
                return index_mail_get_special(_mail, field, value_r);
        }
index fc5b1cfc070f97045d49be2372c187df09131576..48f2d6baf9a76f079a4bb5c60190026908ee2f86 100644 (file)
@@ -183,7 +183,8 @@ enum mail_fetch_field {
        MAIL_FETCH_GUID                 = 0x00200000,
        MAIL_FETCH_POP3_ORDER           = 0x00400000,
        MAIL_FETCH_REFCOUNT             = 0x00800000,
-       MAIL_FETCH_BODY_SNIPPET         = 0x01000000
+       MAIL_FETCH_BODY_SNIPPET         = 0x01000000,
+       MAIL_FETCH_REFCOUNT_ID          = 0x02000000,
 };
 
 enum mailbox_transaction_flags {