diff --git a/cmd/zfs_object_agent/zettaobject/src/public_connection.rs b/cmd/zfs_object_agent/zettaobject/src/public_connection.rs index d8a591f1e004..39d32b43936b 100644 --- a/cmd/zfs_object_agent/zettaobject/src/public_connection.rs +++ b/cmd/zfs_object_agent/zettaobject/src/public_connection.rs @@ -3,6 +3,7 @@ use std::path::Path; use std::sync::Arc; use std::sync::Mutex; +use anyhow::Context; use futures::stream::StreamExt; use log::*; use nvpair::NvList; @@ -23,7 +24,9 @@ use crate::pool::*; use crate::pool_destroy; use crate::pool_destroy::DestroyingPool; use crate::server::return_ok; +use crate::server::return_result; use crate::server::ConnectionState; +use crate::server::FailureMessage; use crate::server::HandlerReturn; use crate::server::Server; @@ -99,8 +102,24 @@ impl PublicConnectionState { bucket: Option, guid: Option, } - let request: GetPoolsRequest = nvpair::from_nvlist(&nvl)?; - let bucket_access = BucketAccess::new(request.protocol.clone()).await?; + let request: GetPoolsRequest = + match nvpair::from_nvlist(&nvl).context("bad or insufficient parameters") { + Ok(request) => request, + Err(e) => { + let result = Err::<(), _>(FailureMessage::new(e)); + return return_result((), result, true); + } + }; + let bucket_access = match BucketAccess::new(request.protocol.clone()) + .await + .context("connection error") + { + Ok(bucket_access) => bucket_access, + Err(e) => { + let result = Err::<(), _>(FailureMessage::new(e)); + return return_result((), result, true); + } + }; let buckets = if let Some(bucket) = request.bucket { vec![bucket] } else { diff --git a/lib/libzutil/zutil_import.c b/lib/libzutil/zutil_import.c index 6626691da586..3729710b030d 100644 --- a/lib/libzutil/zutil_import.c +++ b/lib/libzutil/zutil_import.c @@ -1901,6 +1901,13 @@ zpool_find_import_agent(libpc_handle_t *hdl, importargs_t *iarg, nvlist_t *resp = zoa_send_recv_msg(hdl, msg, AGENT_PUBLIC_PROTOCOL_VERSION, ZFS_PUBLIC_SOCKET, NULL); + char *err; + if (nvlist_lookup_string(resp, "errstr", &err) == 0) { + fprintf(stderr, "Agent pool scan failed: %s\n", err); + fnvlist_free(resp); + return; + } + nvlist_t *pools = NULL; (void) nvlist_lookup_nvlist(resp, "pools", &pools);