From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pbs-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id F2EEE1FF17F for <inbox@lore.proxmox.com>; Mon, 19 May 2025 13:48:10 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id AAA7B8E2B; Mon, 19 May 2025 13:48:05 +0200 (CEST) From: Christian Ebner <c.ebner@proxmox.com> To: pbs-devel@lists.proxmox.com Date: Mon, 19 May 2025 13:46:39 +0200 Message-Id: <20250519114640.303640-39-c.ebner@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250519114640.303640-1-c.ebner@proxmox.com> References: <20250519114640.303640-1-c.ebner@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.032 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pbs-devel] [RFC proxmox-backup 38/39] datastore: get and set owner for S3 store backend X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion <pbs-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pbs-devel>, <mailto:pbs-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pbs-devel/> List-Post: <mailto:pbs-devel@lists.proxmox.com> List-Help: <mailto:pbs-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel>, <mailto:pbs-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox Backup Server development discussion <pbs-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" <pbs-devel-bounces@lists.proxmox.com> Read or write the ownership information from/to the corresponding object in the S3 object store. Keep that information available if the bucket is reused as datastore. Signed-off-by: Christian Ebner <c.ebner@proxmox.com> --- pbs-datastore/src/datastore.rs | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/pbs-datastore/src/datastore.rs b/pbs-datastore/src/datastore.rs index 19d4ca02c..9c8b7de03 100644 --- a/pbs-datastore/src/datastore.rs +++ b/pbs-datastore/src/datastore.rs @@ -8,7 +8,7 @@ use std::time::{Duration, SystemTime}; use anyhow::{bail, format_err, Context, Error}; use nix::unistd::{unlinkat, UnlinkatFlags}; -use pbs_s3_client::{S3Client, S3ClientOptions}; +use pbs_s3_client::{PutObjectResponse, S3Client, S3ClientOptions}; use pbs_tools::lru_cache::LruCache; use tracing::{info, warn}; @@ -840,6 +840,22 @@ impl DataStore { backup_group: &pbs_api_types::BackupGroup, ) -> Result<Authid, Error> { let full_path = self.owner_path(ns, backup_group); + + if let DatastoreBackend::S3(s3_client) = self.backend()? { + let object_key = full_path + .to_str() + .ok_or_else(|| format_err!("unexpected owner path"))?; + let response = + proxmox_async::runtime::block_on(s3_client.get_object(object_key.into()))? + .ok_or_else(|| format_err!("fetching owner failed"))?; + let content = + proxmox_async::runtime::block_on(hyper::body::HttpBody::collect(response.content))?; + let owner = String::from_utf8(content.to_bytes().trim_ascii_end().to_vec())?; + return owner + .parse() + .map_err(|err| format_err!("parsing owner for {backup_group} failed: {err}")); + } + let owner = proxmox_sys::fs::file_read_firstline(full_path)?; owner .trim_end() // remove trailing newline @@ -868,6 +884,22 @@ impl DataStore { ) -> Result<(), Error> { let path = self.owner_path(ns, backup_group); + if let DatastoreBackend::S3(s3_client) = self.backend()? { + let object_key = path + .to_str() + .ok_or_else(|| format_err!("unexpected owner path"))?; + let data = hyper::body::Body::from(format!("{auth_id}\n")); + let response = + proxmox_async::runtime::block_on(s3_client.put_object(object_key.into(), data))?; + match response { + PutObjectResponse::NeedsRetry => bail!("failed to set owner, needs retry"), + PutObjectResponse::PreconditionFailed => { + bail!("failed to set owner, precondition failed") + } + PutObjectResponse::Success(_) => return Ok(()), + } + } + let mut open_options = std::fs::OpenOptions::new(); open_options.write(true); -- 2.39.5 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel