From: Hannes Laimer <h.laimer@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup v7 5/6] api: add get_active_operations endpoint
Date: Fri, 4 Feb 2022 11:17:28 +0000 [thread overview]
Message-ID: <20220204111729.22107-6-h.laimer@proxmox.com> (raw)
In-Reply-To: <20220204111729.22107-1-h.laimer@proxmox.com>
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
pbs-datastore/src/task_tracking.rs | 61 ++++++++++++++++++++++--------
src/api2/admin/datastore.rs | 31 ++++++++++++++-
2 files changed, 75 insertions(+), 17 deletions(-)
diff --git a/pbs-datastore/src/task_tracking.rs b/pbs-datastore/src/task_tracking.rs
index a02d9a17..c0a419e4 100644
--- a/pbs-datastore/src/task_tracking.rs
+++ b/pbs-datastore/src/task_tracking.rs
@@ -1,6 +1,7 @@
use anyhow::Error;
use libc::pid_t;
use nix::unistd::Pid;
+use std::iter::Sum;
use std::path::PathBuf;
use pbs_api_types::Operation;
@@ -8,12 +9,46 @@ use proxmox_sys::fs::{file_read_optional_string, open_file_locked, replace_file,
use proxmox_sys::linux::procfs;
use serde::{Deserialize, Serialize};
+#[derive(Deserialize, Serialize, Clone, Copy, Default)]
+pub struct ActiveOperationStats {
+ pub read: i64,
+ pub write: i64,
+}
+
+impl Sum<Self> for ActiveOperationStats {
+ fn sum<I>(iter: I) -> Self
+ where
+ I: Iterator<Item = Self>,
+ {
+ iter.fold(Self::default(), |a, b| Self {
+ read: a.read + b.read,
+ write: a.write + b.write,
+ })
+ }
+}
+
#[derive(Deserialize, Serialize, Clone)]
struct TaskOperations {
pid: u32,
starttime: u64,
- reading_operations: i64,
- writing_operations: i64,
+ active_operations: ActiveOperationStats,
+}
+
+pub fn get_active_operations(name: &str) -> Result<ActiveOperationStats, Error> {
+ let path = PathBuf::from(format!("{}/{}", crate::ACTIVE_OPERATIONS_DIR, name));
+
+ Ok(match file_read_optional_string(&path)? {
+ Some(data) => serde_json::from_str::<Vec<TaskOperations>>(&data)?
+ .iter()
+ .filter_map(
+ |task| match procfs::check_process_running(task.pid as pid_t) {
+ Some(stat) if task.starttime == stat.starttime => Some(task.active_operations),
+ _ => None,
+ },
+ )
+ .sum(),
+ None => ActiveOperationStats::default(),
+ })
}
pub fn update_active_operations(name: &str, operation: Operation, count: i64) -> Result<(), Error> {
@@ -43,8 +78,8 @@ pub fn update_active_operations(name: &str, operation: Operation, count: i64) ->
if pid == task.pid {
updated = true;
match operation {
- Operation::Read => task.reading_operations += count,
- Operation::Write => task.writing_operations += count,
+ Operation::Read => task.active_operations.read += count,
+ Operation::Write => task.active_operations.write += count,
};
}
Some(task.clone())
@@ -57,18 +92,12 @@ pub fn update_active_operations(name: &str, operation: Operation, count: i64) ->
};
if !updated {
- updated_tasks.push(match operation {
- Operation::Read => TaskOperations {
- pid,
- starttime,
- reading_operations: 1,
- writing_operations: 0,
- },
- Operation::Write => TaskOperations {
- pid,
- starttime,
- reading_operations: 0,
- writing_operations: 1,
+ updated_tasks.push(TaskOperations {
+ pid,
+ starttime,
+ active_operations: match operation {
+ Operation::Read => ActiveOperationStats { read: 1, write: 0 },
+ Operation::Write => ActiveOperationStats { read: 0, write: 1 },
},
})
}
diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
index ce710938..aa7c818d 100644
--- a/src/api2/admin/datastore.rs
+++ b/src/api2/admin/datastore.rs
@@ -43,7 +43,7 @@ use pbs_api_types::{ Authid, BackupContent, Counts, CryptMode,
use pbs_client::pxar::create_zip;
use pbs_datastore::{
check_backup_owner, DataStore, BackupDir, BackupGroup, StoreProgress, LocalChunkReader,
- CATALOG_NAME,
+ CATALOG_NAME, task_tracking
};
use pbs_datastore::backup_info::BackupInfo;
use pbs_datastore::cached_chunk_reader::CachedChunkReader;
@@ -1590,6 +1590,30 @@ pub fn get_rrd_stats(
)
}
+#[api(
+ input: {
+ properties: {
+ store: {
+ schema: DATASTORE_SCHEMA,
+ },
+ },
+ },
+ access: {
+ permission: &Permission::Privilege(&["datastore", "{store}"], PRIV_DATASTORE_AUDIT, true),
+ },
+)]
+/// Read datastore stats
+pub fn get_active_operations(
+ store: String,
+ _param: Value,
+) -> Result<Value, Error> {
+ let active_operations = task_tracking::get_active_operations(&store)?;
+ Ok(json!({
+ "read": active_operations.read,
+ "write": active_operations.write,
+ }))
+}
+
#[api(
input: {
properties: {
@@ -1947,6 +1971,11 @@ pub fn set_backup_owner(
#[sortable]
const DATASTORE_INFO_SUBDIRS: SubdirMap = &[
+ (
+ "active-operations",
+ &Router::new()
+ .get(&API_METHOD_GET_ACTIVE_OPERATIONS)
+ ),
(
"catalog",
&Router::new()
--
2.30.2
next prev parent reply other threads:[~2022-02-04 11:19 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-04 11:17 [pbs-devel] [PATCH proxmox-backup v7 0/6] closes #3071: maintenance mode for datastore Hannes Laimer
2022-02-04 11:17 ` [pbs-devel] [PATCH proxmox-backup v7 1/6] api-types: add maintenance type Hannes Laimer
2022-02-08 9:40 ` Wolfgang Bumiller
2022-02-04 11:17 ` [pbs-devel] [PATCH proxmox-backup v7 2/6] datastore: add check for maintenance in lookup Hannes Laimer
2022-02-08 9:43 ` Wolfgang Bumiller
2022-02-04 11:17 ` [pbs-devel] [PATCH proxmox-backup v7 3/6] pbs-datastore: add active operations tracking Hannes Laimer
2022-02-08 10:13 ` Wolfgang Bumiller
2022-02-04 11:17 ` [pbs-devel] [PATCH proxmox-backup v7 4/6] api: make maintenance_type updatable Hannes Laimer
2022-02-04 11:17 ` Hannes Laimer [this message]
2022-02-04 11:17 ` [pbs-devel] [PATCH proxmox-backup v7 6/6] ui: add option to change the maintenance type Hannes Laimer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220204111729.22107-6-h.laimer@proxmox.com \
--to=h.laimer@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.