From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 5D3B771D7A for ; Fri, 9 Apr 2021 16:18:07 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 53B84279C0 for ; Fri, 9 Apr 2021 16:18:07 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id C3C88279B7 for ; Fri, 9 Apr 2021 16:18:05 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 8E29241F3C for ; Fri, 9 Apr 2021 16:18:05 +0200 (CEST) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Fri, 9 Apr 2021 16:18:04 +0200 Message-Id: <20210409141804.2496-2-d.csapak@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210409141804.2496-1-d.csapak@proxmox.com> References: <20210409141804.2496-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.166 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [backup.rs] Subject: [pbs-devel] [PATCH proxmox-backup 2/2] api2/tape/backup: commit pool even after an error X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 09 Apr 2021 14:18:07 -0000 when we encounter an error (including a manually aborted task), try to commit the pool, so that catalogs get written out. This prevents that after an aborted backup, we have inconsistent inventory and catalog, since the updated media set for the media gets written to the inventory at the beginning. Signed-off-by: Dominik Csapak --- also not sure here if i missed something, but solves the problem we had when aborted a backup before we could write the catalog to disk src/api2/tape/backup.rs | 103 +++++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 49 deletions(-) diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs index ec35038a..300decc8 100644 --- a/src/api2/tape/backup.rs +++ b/src/api2/tape/backup.rs @@ -437,66 +437,71 @@ fn backup_worker( let mut need_catalog = false; // avoid writing catalog for empty jobs - for (group_number, group) in group_list.into_iter().enumerate() { - progress.done_groups = group_number as u64; - progress.done_snapshots = 0; - progress.group_snapshots = 0; - - let mut snapshot_list = group.list_backups(&datastore.base_path())?; - - BackupInfo::sort_list(&mut snapshot_list, true); // oldest first - - if latest_only { - progress.group_snapshots = 1; - if let Some(info) = snapshot_list.pop() { - if pool_writer.contains_snapshot(datastore_name, &info.backup_dir.to_string()) { - task_log!(worker, "skip snapshot {}", info.backup_dir); - continue; - } + let result: Result<(), Error> = try_block!({ + for (group_number, group) in group_list.into_iter().enumerate() { + progress.done_groups = group_number as u64; + progress.done_snapshots = 0; + progress.group_snapshots = 0; + + let mut snapshot_list = group.list_backups(&datastore.base_path())?; + + BackupInfo::sort_list(&mut snapshot_list, true); // oldest first + + if latest_only { + progress.group_snapshots = 1; + if let Some(info) = snapshot_list.pop() { + if pool_writer.contains_snapshot(datastore_name, &info.backup_dir.to_string()) { + task_log!(worker, "skip snapshot {}", info.backup_dir); + continue; + } - need_catalog = true; + need_catalog = true; - let snapshot_name = info.backup_dir.to_string(); - if !backup_snapshot(worker, &mut pool_writer, datastore.clone(), info.backup_dir)? { - errors = true; - } else { - summary.snapshot_list.push(snapshot_name); - } - progress.done_snapshots = 1; - task_log!( - worker, - "percentage done: {}", - progress - ); - } - } else { - progress.group_snapshots = snapshot_list.len() as u64; - for (snapshot_number, info) in snapshot_list.into_iter().enumerate() { - if pool_writer.contains_snapshot(datastore_name, &info.backup_dir.to_string()) { - task_log!(worker, "skip snapshot {}", info.backup_dir); - continue; + let snapshot_name = info.backup_dir.to_string(); + if !backup_snapshot(worker, &mut pool_writer, datastore.clone(), info.backup_dir)? { + errors = true; + } else { + summary.snapshot_list.push(snapshot_name); + } + progress.done_snapshots = 1; + task_log!( + worker, + "percentage done: {}", + progress + ); } + } else { + progress.group_snapshots = snapshot_list.len() as u64; + for (snapshot_number, info) in snapshot_list.into_iter().enumerate() { + if pool_writer.contains_snapshot(datastore_name, &info.backup_dir.to_string()) { + task_log!(worker, "skip snapshot {}", info.backup_dir); + continue; + } - need_catalog = true; + need_catalog = true; - let snapshot_name = info.backup_dir.to_string(); - if !backup_snapshot(worker, &mut pool_writer, datastore.clone(), info.backup_dir)? { - errors = true; - } else { - summary.snapshot_list.push(snapshot_name); + let snapshot_name = info.backup_dir.to_string(); + if !backup_snapshot(worker, &mut pool_writer, datastore.clone(), info.backup_dir)? { + errors = true; + } else { + summary.snapshot_list.push(snapshot_name); + } + progress.done_snapshots = snapshot_number as u64 + 1; + task_log!( + worker, + "percentage done: {}", + progress + ); } - progress.done_snapshots = snapshot_number as u64 + 1; - task_log!( - worker, - "percentage done: {}", - progress - ); } } - } + Ok(()) + }); pool_writer.commit()?; + let _ = result?; + if need_catalog { task_log!(worker, "append media catalog"); -- 2.20.1