Skip to content

Commit fc961ae

Browse files
committed
Increase backup logging
1 parent d1d71b7 commit fc961ae

File tree

6 files changed

+51
-12
lines changed

6 files changed

+51
-12
lines changed

lib/imap/backup/account/backup.rb

+10-4
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,33 @@ def initialize(account:, refresh: false)
1818
# Runs the backup
1919
# @return [void]
2020
def run
21-
Logger.logger.info "Running backup of account: #{account.username}"
21+
Logger.logger.info "Running backup of account '#{account.username}'"
2222
# start the connection so we get logging messages in the right order
2323
account.client.login
2424

25-
Account::FolderEnsurer.new(account: account).run
26-
Account::LocalOnlyFolderDeleter.new(account: account).run if account.mirror_mode
25+
run_pre_backup_tasks
2726
backup_folders = Account::BackupFolders.new(
2827
client: account.client, account: account
2928
).to_a
3029
if backup_folders.none?
31-
Logger.logger.warn "Account #{account.username}: No folders found to backup"
30+
Logger.logger.warn "No folders found to backup for account '#{account.username}'"
3231
return
3332
end
33+
Logger.logger.debug "Starting backup of #{backup_folders.count} folders"
3434
backup_folders.each do |folder|
3535
Account::FolderBackup.new(account: account, folder: folder, refresh: refresh).run
3636
end
37+
Logger.logger.debug "Backup of account '#{account.username}' complete"
3738
end
3839

3940
private
4041

4142
attr_reader :account
4243
attr_reader :refresh
44+
45+
def run_pre_backup_tasks
46+
Account::FolderEnsurer.new(account: account).run
47+
Account::LocalOnlyFolderDeleter.new(account: account).run if account.mirror_mode
48+
end
4349
end
4450
end

lib/imap/backup/account/folder.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,14 @@ def initialize(client, name)
3131

3232
# @raise any error that occurs more than 10 times
3333
def exist?
34+
Logger.logger.debug "Checking whether folder '#{name}' exists"
3435
retry_on_error(errors: EXAMINE_RETRY_CLASSES) do
3536
examine
3637
end
38+
Logger.logger.debug "Folder '#{name}' exists"
3739
true
3840
rescue FolderNotFound
41+
Logger.logger.debug "Folder '#{name}' does not exist"
3942
false
4043
end
4144

@@ -62,8 +65,11 @@ def uid_validity
6265
# @raise any error that occurs more than 10 times
6366
# @return [Array<Integer>] the folders message UIDs
6467
def uids
68+
Logger.logger.debug "Fetching UIDs for folder '#{name}'"
6569
examine
66-
client.uid_search(["ALL"]).sort
70+
result = client.uid_search(["ALL"]).sort
71+
Logger.logger.debug "#{result.count} UIDs found for folder '#{name}'"
72+
result
6773
rescue FolderNotFound
6874
[]
6975
rescue NoMethodError

lib/imap/backup/account/folder_backup.rb

+4-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def initialize(account:, folder:, refresh: false)
2222
# @raise [RuntimeError] if the configured download strategy is incorrect
2323
# @return [void]
2424
def run
25-
Logger.logger.debug "[#{folder.name}] running backup"
25+
Logger.logger.debug "Running backup for folder '#{folder.name}'"
2626

2727
folder_ok = folder_ok?
2828
return if !folder_ok
@@ -36,6 +36,7 @@ def run
3636
# After the transaction the serializer will have any appended messages
3737
# so we can check differences between the server and the local backup
3838
LocalOnlyMessageDeleter.new(folder, raw_serializer).run if account.mirror_mode
39+
Logger.logger.debug "Backup for folder '#{folder.name}' complete"
3940
end
4041

4142
private
@@ -47,12 +48,12 @@ def run
4748
def folder_ok?
4849
begin
4950
if !folder.exist?
50-
Logger.logger.info "[#{folder.name}] skipping folder as it does not exist"
51+
Logger.logger.info "Skipping backup for folder '#{folder.name}' as it does not exist"
5152
return false
5253
end
5354
rescue Encoding::UndefinedConversionError
5455
message = "Skipping backup for '#{folder.name}' " \
55-
"as it is not UTF-7 encoded correctly"
56+
"as it's name is not UTF-7 encoded correctly"
5657
Logger.logger.info message
5758
return false
5859
end

lib/imap/backup/cli/backup.rb

+3
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ def initialize(options)
2424
# @return [void]
2525
no_commands do
2626
def run
27+
Logger.logger.debug "Loading configuration"
2728
config = load_config(**options)
2829
exit_code = nil
2930
accounts = requested_accounts(config)
3031
if accounts.none?
3132
Logger.logger.warn "No matching accounts found to backup"
3233
return
3334
end
35+
Logger.logger.debug "Starting backup of #{accounts.count} accounts"
3436
accounts.each do |account|
3537
backup = Account::Backup.new(account: account, refresh: refresh)
3638
backup.run
@@ -43,6 +45,7 @@ def run
4345
Logger.logger.error message
4446
next
4547
end
48+
Logger.logger.debug "Backup complete"
4649
exit(exit_code) if exit_code
4750
end
4851
end

lib/imap/backup/client/default.rb

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def initialize(server, account, options)
2727
# @return [Array<String>] the account folders
2828
def list
2929
root = provider_root
30+
Logger.logger.debug "Listing all account folders"
3031
mailbox_lists = imap.list(root, "*")
3132

3233
return [] if mailbox_lists.nil?
@@ -105,7 +106,9 @@ def masked_password
105106
# in the reference.
106107
def provider_root
107108
@provider_root ||= begin
109+
Logger.logger.debug "Fetching provider root"
108110
root_info = imap.list("", "")[0]
111+
Logger.logger.debug "Provider root is '#{root_info.name}'"
109112
root_info.name
110113
end
111114
end

lib/imap/backup/downloader.rb

+24-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,19 @@ def initialize(folder, serializer, multi_fetch_size: 1, reset_seen_flags_after_f
1919
# Runs the downloader
2020
# @return [void]
2121
def run
22-
info("#{uids.count} new messages") if uids.any?
22+
debug("#{serializer_uids.count} already messages already downloaded")
23+
debug("#{folder_uids.count} messages on server")
24+
local_only_count = (serializer_uids - folder_uids).count
25+
if local_only_count.positive?
26+
debug("#{local_only_count} downloaded messages no longer on server")
27+
end
28+
29+
if uids.none?
30+
debug("no new messages on server — skipping")
31+
return
32+
end
33+
34+
info("#{uids.count} new messages")
2335

2436
uids.each_slice(multi_fetch_size).with_index do |block, i|
2537
multifetch_failed = download_block(block, i)
@@ -62,8 +74,8 @@ def download_block(block, index)
6274
end
6375
if uids_and_bodies.nil?
6476
if multi_fetch_size > 1
65-
uids = block.join(", ")
66-
debug("Multi fetch failed for UIDs #{uids}, switching to single fetches")
77+
uid_list = block.join(", ")
78+
debug("Multi fetch failed for UIDs #{uid_list}, switching to single fetches")
6779
return true
6880
else
6981
debug("Fetch failed for UID #{block[0]} - skipping")
@@ -96,8 +108,16 @@ def handle_uid_and_body(uid_and_body, index)
96108
error(e)
97109
end
98110

111+
def folder_uids
112+
@folder_uids ||= folder.uids
113+
end
114+
115+
def serializer_uids
116+
@serializer_uids ||= serializer.uids
117+
end
118+
99119
def uids
100-
@uids ||= folder.uids - serializer.uids
120+
@uids ||= folder_uids - serializer_uids
101121
end
102122

103123
def debug(message)

0 commit comments

Comments
 (0)