From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 1045120EC80 for ; Thu, 18 Apr 2024 16:30:10 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 792381EBC2; Thu, 18 Apr 2024 16:30:11 +0200 (CEST) From: Hannes Laimer To: pbs-devel@lists.proxmox.com Date: Thu, 18 Apr 2024 16:29:11 +0200 Message-Id: <20240418142931.122618-4-h.laimer@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240418142931.122618-1-h.laimer@proxmox.com> References: <20240418142931.122618-1-h.laimer@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.051 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 PROLO_LEO1 0.1 Meta Catches all Leo drug variations so far 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. [datastore.rs, proxmox-backup-proxy.rs] Subject: [pbs-devel] [PATCH proxmox-backup v6 03/23] datastore: rename and simplify update-datastore-cache socket command 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: , Reply-To: Proxmox Backup Server development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" ... by always dropping the cache entry and not allowing it to be re-added based on the maintenance mode. The check is only needed for Lookup operations since lookups with those wouldn't fail based on maintenance mode alone. Already running tasks won't be affected and since they're the only ones holding a reference to a DataStore, it and the file handles it holds will be dropped automatically once the task finishes. Signed-off-by: Hannes Laimer --- pbs-datastore/src/datastore.rs | 26 ++++++++++---------------- src/api2/config/datastore.rs | 9 ++++----- src/bin/proxmox-backup-proxy.rs | 8 ++++---- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/pbs-datastore/src/datastore.rs b/pbs-datastore/src/datastore.rs index f95da761..e1028778 100644 --- a/pbs-datastore/src/datastore.rs +++ b/pbs-datastore/src/datastore.rs @@ -190,10 +190,15 @@ impl DataStore { )?) }; + let is_offline = config + .get_maintenance_mode() + .map_or(false, |m| m.is_offline()); let datastore = DataStore::with_store_and_config(chunk_store, config, Some(digest))?; let datastore = Arc::new(datastore); - datastore_cache.insert(name.to_string(), datastore.clone()); + if !is_offline { + datastore_cache.insert(name.to_string(), datastore.clone()); + } Ok(Arc::new(Self { inner: datastore, @@ -211,21 +216,10 @@ impl DataStore { Ok(()) } - /// trigger clearing cache entry based on maintenance mode. Entry will only - /// be cleared iff there is no other task running, if there is, the end of the - /// last running task will trigger the clearing of the cache entry. - pub fn update_datastore_cache(name: &str) -> Result<(), Error> { - let (config, _digest) = pbs_config::datastore::config()?; - let datastore: DataStoreConfig = config.lookup("datastore", name)?; - if datastore - .get_maintenance_mode() - .map_or(false, |m| m.is_offline()) - { - // the datastore drop handler does the checking if tasks are running and clears the - // cache entry, so we just have to trigger it here - let _ = DataStore::lookup_datastore(name, Some(Operation::Lookup)); - } - + /// removes datastore from cache + pub fn drop_from_datastore_cache(name: &str) -> Result<(), Error> { + let mut datastore_cache = DATASTORE_MAP.lock().unwrap(); + datastore_cache.remove(name); Ok(()) } diff --git a/src/api2/config/datastore.rs b/src/api2/config/datastore.rs index 87425ff5..af5f5429 100644 --- a/src/api2/config/datastore.rs +++ b/src/api2/config/datastore.rs @@ -389,16 +389,15 @@ pub fn update_datastore( data.tuning = update.tuning; } - let mut maintenance_mode_changed = false; + let mut drop_store_from_cache = false; if update.maintenance_mode.is_some() { - maintenance_mode_changed = data.maintenance_mode != update.maintenance_mode; - let maintenance_mode = match update.maintenance_mode { Some(mode_str) => Some(MaintenanceMode::deserialize( proxmox_schema::de::SchemaDeserializer::new(mode_str, &MaintenanceMode::API_SCHEMA), )?), None => None, }; + drop_store_from_cache = maintenance_mode.as_ref().map_or(false, |m| m.is_offline()); data.set_maintenance_mode(maintenance_mode)?; } @@ -413,7 +412,7 @@ pub fn update_datastore( } // tell the proxy it might have to clear a cache entry - if maintenance_mode_changed { + if drop_store_from_cache { tokio::spawn(async move { if let Ok(proxy_pid) = proxmox_rest_server::read_pid(pbs_buildcfg::PROXMOX_BACKUP_PROXY_PID_FN) @@ -422,7 +421,7 @@ pub fn update_datastore( let _ = proxmox_rest_server::send_raw_command( sock, &format!( - "{{\"command\":\"update-datastore-cache\",\"args\":\"{}\"}}\n", + "{{\"command\":\"drop-from-datastore-cache\",\"args\":\"{}\"}}\n", &name ), ) diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index f79ec2f5..073f85ac 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -289,11 +289,11 @@ async fn run() -> Result<(), Error> { Ok(Value::Null) })?; - // clear cache entry for datastore that is in a specific maintenance mode - command_sock.register_command("update-datastore-cache".to_string(), |value| { + // clear cache entry for datastore + command_sock.register_command("drop-from-datastore-cache".to_string(), |value| { if let Some(name) = value.and_then(Value::as_str) { - if let Err(err) = DataStore::update_datastore_cache(name) { - log::error!("could not trigger update datastore cache: {err}"); + if let Err(err) = DataStore::drop_from_datastore_cache(name) { + log::error!("could not drop datastore from cache: {err}"); } } Ok(Value::Null) -- 2.39.2 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel