mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-30 08:49:26 +00:00
refactor(logging): normalize admin telemetry and error messages (#3430)
This commit is contained in:
+79
-11
@@ -19,7 +19,13 @@ use rustfs_ecstore::store::ECStore;
|
||||
use std::sync::{Arc, OnceLock};
|
||||
use store::object::ObjectStore;
|
||||
use sys::IamSys;
|
||||
use tracing::{error, info, instrument, warn};
|
||||
use tracing::{debug, error, info, instrument, warn};
|
||||
|
||||
const LOG_COMPONENT_IAM: &str = "iam";
|
||||
const LOG_SUBSYSTEM_RUNTIME: &str = "runtime";
|
||||
const LOG_SUBSYSTEM_OIDC: &str = "oidc";
|
||||
const EVENT_IAM_STATE: &str = "iam_state";
|
||||
const EVENT_OIDC_STATE: &str = "oidc_state";
|
||||
|
||||
pub mod cache;
|
||||
pub mod error;
|
||||
@@ -37,11 +43,23 @@ static OIDC_SYS: OnceLock<Arc<OidcSys>> = OnceLock::new();
|
||||
#[instrument(skip(ecstore))]
|
||||
pub async fn init_iam_sys(ecstore: Arc<ECStore>) -> Result<()> {
|
||||
if IAM_SYS.get().is_some() {
|
||||
info!("IAM system already initialized, skipping.");
|
||||
info!(
|
||||
event = EVENT_IAM_STATE,
|
||||
component = LOG_COMPONENT_IAM,
|
||||
subsystem = LOG_SUBSYSTEM_RUNTIME,
|
||||
state = "already_initialized",
|
||||
"IAM runtime already initialized"
|
||||
);
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
info!("Starting IAM system initialization sequence...");
|
||||
info!(
|
||||
event = EVENT_IAM_STATE,
|
||||
component = LOG_COMPONENT_IAM,
|
||||
subsystem = LOG_SUBSYSTEM_RUNTIME,
|
||||
state = "starting",
|
||||
"IAM runtime starting"
|
||||
);
|
||||
|
||||
// 1. Create the persistent storage adapter
|
||||
let storage_adapter = ObjectStore::new(ecstore);
|
||||
@@ -55,11 +73,23 @@ pub async fn init_iam_sys(ecstore: Arc<ECStore>) -> Result<()> {
|
||||
|
||||
// 4. Securely set the global singleton
|
||||
if IAM_SYS.set(iam_instance).is_err() {
|
||||
error!("Critical: Race condition detected during IAM initialization!");
|
||||
error!(
|
||||
event = EVENT_IAM_STATE,
|
||||
component = LOG_COMPONENT_IAM,
|
||||
subsystem = LOG_SUBSYSTEM_RUNTIME,
|
||||
state = "singleton_set_failed",
|
||||
"IAM runtime singleton set failed"
|
||||
);
|
||||
return Err(Error::IamSysAlreadyInitialized);
|
||||
}
|
||||
|
||||
info!("IAM system initialization completed successfully.");
|
||||
info!(
|
||||
event = EVENT_IAM_STATE,
|
||||
component = LOG_COMPONENT_IAM,
|
||||
subsystem = LOG_SUBSYSTEM_RUNTIME,
|
||||
state = "ready",
|
||||
"IAM runtime ready"
|
||||
);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -84,29 +114,67 @@ pub fn get_global_iam_sys() -> Option<Arc<IamSys<ObjectStore>>> {
|
||||
/// Initialize the global OIDC system. Non-fatal if no OIDC providers are configured.
|
||||
pub async fn init_oidc_sys() -> Result<()> {
|
||||
if OIDC_SYS.get().is_some() {
|
||||
info!("OIDC system already initialized, skipping.");
|
||||
debug!(
|
||||
event = EVENT_OIDC_STATE,
|
||||
component = LOG_COMPONENT_IAM,
|
||||
subsystem = LOG_SUBSYSTEM_OIDC,
|
||||
state = "already_initialized",
|
||||
"OIDC runtime already initialized"
|
||||
);
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
info!("Starting OIDC system initialization...");
|
||||
debug!(
|
||||
event = EVENT_OIDC_STATE,
|
||||
component = LOG_COMPONENT_IAM,
|
||||
subsystem = LOG_SUBSYSTEM_OIDC,
|
||||
state = "starting",
|
||||
"OIDC runtime starting"
|
||||
);
|
||||
|
||||
let oidc_sys = match OidcSys::new().await {
|
||||
Ok(sys) => {
|
||||
if sys.has_providers() {
|
||||
info!("OIDC system initialized with {} provider(s)", sys.list_providers().len());
|
||||
debug!(
|
||||
event = EVENT_OIDC_STATE,
|
||||
component = LOG_COMPONENT_IAM,
|
||||
subsystem = LOG_SUBSYSTEM_OIDC,
|
||||
provider_count = sys.list_providers().len(),
|
||||
state = "ready",
|
||||
"OIDC runtime ready"
|
||||
);
|
||||
} else {
|
||||
info!("No OIDC providers configured");
|
||||
debug!(
|
||||
event = EVENT_OIDC_STATE,
|
||||
component = LOG_COMPONENT_IAM,
|
||||
subsystem = LOG_SUBSYSTEM_OIDC,
|
||||
state = "empty",
|
||||
"OIDC runtime has no providers"
|
||||
);
|
||||
}
|
||||
sys
|
||||
}
|
||||
Err(e) => {
|
||||
warn!("OIDC initialization failed (non-fatal): {}", e);
|
||||
warn!(
|
||||
event = EVENT_OIDC_STATE,
|
||||
component = LOG_COMPONENT_IAM,
|
||||
subsystem = LOG_SUBSYSTEM_OIDC,
|
||||
state = "init_failed_non_fatal",
|
||||
error = %e,
|
||||
"OIDC runtime initialization failed"
|
||||
);
|
||||
OidcSys::empty().map_err(Error::StringError)?
|
||||
}
|
||||
};
|
||||
|
||||
if OIDC_SYS.set(Arc::new(oidc_sys)).is_err() {
|
||||
warn!("Race condition during OIDC initialization (non-fatal)");
|
||||
warn!(
|
||||
event = EVENT_OIDC_STATE,
|
||||
component = LOG_COMPONENT_IAM,
|
||||
subsystem = LOG_SUBSYSTEM_OIDC,
|
||||
state = "singleton_set_race",
|
||||
"OIDC runtime singleton set raced"
|
||||
);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
||||
+14
-10
@@ -54,7 +54,7 @@ use tokio::{
|
||||
},
|
||||
};
|
||||
use tracing::warn;
|
||||
use tracing::{error, info};
|
||||
use tracing::{debug, error};
|
||||
|
||||
const IAM_FORMAT_FILE: &str = "format.json";
|
||||
const IAM_FORMAT_VERSION_1: i32 = 1;
|
||||
@@ -153,10 +153,14 @@ where
|
||||
if let Err(e) = self.clone().load().await {
|
||||
if attempt == MAX_RETRIES - 1 {
|
||||
self.state.store(IamState::Error as u8, Ordering::SeqCst);
|
||||
warn!("IAM failed to load initial data after {} attempts: {:?}", MAX_RETRIES, e);
|
||||
warn!(
|
||||
attempts = MAX_RETRIES,
|
||||
error = ?e,
|
||||
"IAM initial load failed"
|
||||
);
|
||||
load_error = Some(e);
|
||||
} else {
|
||||
warn!("IAM load failed, retrying... attempt {}", attempt + 1);
|
||||
warn!(attempt = attempt + 1, max_attempts = MAX_RETRIES, "IAM load retry scheduled");
|
||||
tokio::time::sleep(INITIAL_LOAD_RETRY_DELAY).await;
|
||||
}
|
||||
} else {
|
||||
@@ -169,7 +173,7 @@ where
|
||||
}
|
||||
|
||||
self.state.store(IamState::Ready as u8, Ordering::SeqCst);
|
||||
info!("IAM System successfully initialized and marked as READY");
|
||||
debug!(state = "ready", "IAM manager ready");
|
||||
|
||||
// Background ticker for synchronization
|
||||
// Check if environment variable is set
|
||||
@@ -185,20 +189,20 @@ where
|
||||
loop {
|
||||
select! {
|
||||
_ = ticker.tick() => {
|
||||
info!("iam load ticker");
|
||||
debug!(source = "ticker", "IAM reload tick");
|
||||
if let Err(err) =s.clone().load().await{
|
||||
warn!("iam load err {:?}", err);
|
||||
warn!(source = "ticker", error = ?err, "IAM reload failed");
|
||||
}
|
||||
},
|
||||
i = receiver.recv() => {
|
||||
info!("iam load receiver");
|
||||
debug!(source = "receiver", "IAM reload signal received");
|
||||
match i {
|
||||
Some(t) => {
|
||||
let last = s.last_timestamp.load(Ordering::Relaxed);
|
||||
if last <= t {
|
||||
info!("iam load receiver load");
|
||||
debug!(source = "receiver", "IAM reload accepted");
|
||||
if let Err(err) =s.clone().load().await{
|
||||
warn!("iam load err {:?}", err);
|
||||
warn!(source = "receiver", error = ?err, "IAM reload failed");
|
||||
}
|
||||
ticker.reset();
|
||||
}
|
||||
@@ -1294,7 +1298,7 @@ where
|
||||
let cache = self.cache.snapshot();
|
||||
let users = Arc::clone(&cache.users);
|
||||
if let Some(x) = users.get(access_key) {
|
||||
warn!("user already exists: {:?}", x);
|
||||
warn!(error = ?x, "IAM user already exists");
|
||||
if x.credentials.is_temp() {
|
||||
return Err(Error::IAMActionNotAllowed);
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ use std::pin::Pin;
|
||||
use std::sync::{LazyLock, Mutex, MutexGuard, RwLock};
|
||||
use std::time::{Duration as StdDuration, Instant};
|
||||
use tokio::time::sleep;
|
||||
use tracing::{error, info, warn};
|
||||
use tracing::{debug, error, warn};
|
||||
use url::Url;
|
||||
|
||||
const OIDC_JWKS_REFRESH_INTERVAL: StdDuration = StdDuration::from_secs(24 * 60 * 60);
|
||||
@@ -76,7 +76,7 @@ fn lock_oidc_plugin_authn_metrics<'a, T>(mutex: &'a Mutex<T>, metric: &'static s
|
||||
match mutex.lock() {
|
||||
Ok(guard) => guard,
|
||||
Err(err) => {
|
||||
warn!("recovering poisoned OIDC plugin authn metrics lock: {}", metric);
|
||||
warn!(metric, "Recovering poisoned OIDC authn metrics lock");
|
||||
err.into_inner()
|
||||
}
|
||||
}
|
||||
@@ -417,18 +417,18 @@ impl OidcSys {
|
||||
for sourced_config in parsed_configs {
|
||||
let config = sourced_config.config;
|
||||
if !config.enabled {
|
||||
info!("OIDC provider '{}' is disabled, skipping", config.id);
|
||||
debug!(provider = %config.id, "OIDC provider disabled");
|
||||
continue;
|
||||
}
|
||||
|
||||
match Self::discover_provider(&config, &http_client).await {
|
||||
Ok(state) => {
|
||||
info!("OIDC provider '{}' discovered successfully", config.id);
|
||||
debug!(provider = %config.id, "OIDC provider discovered");
|
||||
provider_states.insert(config.id.clone(), state);
|
||||
configs.insert(config.id.clone(), config);
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Failed to discover OIDC provider '{}': {}", config.id, e);
|
||||
error!(provider = %config.id, error = %e, "OIDC provider discovery failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ use std::time::{Duration, Instant};
|
||||
use std::{collections::HashMap, sync::Arc};
|
||||
use tokio::sync::mpsc::{self, Sender};
|
||||
use tokio_util::sync::CancellationToken;
|
||||
use tracing::{debug, error, info, warn};
|
||||
use tracing::{debug, error, warn};
|
||||
|
||||
pub static IAM_CONFIG_PREFIX: LazyLock<String> = LazyLock::new(|| format!("{RUSTFS_CONFIG_PREFIX}/iam"));
|
||||
pub static IAM_CONFIG_USERS_PREFIX: LazyLock<String> = LazyLock::new(|| format!("{RUSTFS_CONFIG_PREFIX}/iam/users/"));
|
||||
@@ -307,11 +307,11 @@ impl ObjectStore {
|
||||
}
|
||||
Err(StorageError::PreconditionFailed) => {
|
||||
Self::complete_lazy_rewrite(path.as_str(), false);
|
||||
debug!("iam lazy rewrite skipped due to stale etag, path: {}", path);
|
||||
debug!(path = %path, state = "stale_etag", "IAM lazy rewrite skipped");
|
||||
}
|
||||
Err(err) => {
|
||||
Self::complete_lazy_rewrite(path.as_str(), false);
|
||||
warn!("iam lazy rewrite failed, path: {}, err: {}", path, err);
|
||||
warn!(path = %path, error = %err, state = "rewrite_failed", "IAM lazy rewrite failed");
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -377,7 +377,7 @@ impl ObjectStore {
|
||||
bucket = Self::BUCKET_NAME,
|
||||
prefix = %path,
|
||||
error = %err,
|
||||
"system path walk failed"
|
||||
"IAM config walk failed"
|
||||
);
|
||||
let _ = sender_on_error
|
||||
.send(StringOrErr {
|
||||
@@ -643,7 +643,7 @@ impl Store for ObjectStore {
|
||||
let outcome = match Self::decrypt_data_with_source(&data) {
|
||||
Ok(v) => v,
|
||||
Err(err) => {
|
||||
warn!("config decrypt failed, keeping file: {}, path: {}", err, path_ref);
|
||||
warn!(path = %path_ref, error = %err, "IAM config decrypt failed; keeping file");
|
||||
// keep the config file when decrypt failed - do not delete
|
||||
return Err(Error::ConfigNotFound);
|
||||
}
|
||||
@@ -692,7 +692,7 @@ impl Store for ObjectStore {
|
||||
tokio::time::sleep(std::time::Duration::from_millis(wait_ms)).await;
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Final failure saving IAM config to {}: {:?}", path_ref, e);
|
||||
error!(path = %path_ref, error = ?e, "IAM config save failed");
|
||||
return Err(e.into());
|
||||
}
|
||||
}
|
||||
@@ -717,7 +717,7 @@ impl Store for ObjectStore {
|
||||
debug!("Saving IAM identity to path: {}", path);
|
||||
|
||||
self.save_iam_config(user_identity, path).await.map_err(|e| {
|
||||
error!("ObjectStore save failure for {}: {:?}", name, e);
|
||||
error!(name, error = ?e, "IAM identity save failed");
|
||||
e
|
||||
})
|
||||
}
|
||||
@@ -739,10 +739,10 @@ impl Store for ObjectStore {
|
||||
.await
|
||||
.map_err(|err| {
|
||||
if is_err_config_not_found(&err) {
|
||||
warn!("load_user_identity failed: no such user, name: {name}, user_type: {user_type:?}");
|
||||
warn!(name, user_type = ?user_type, "IAM user identity missing");
|
||||
Error::NoSuchUser(name.to_owned())
|
||||
} else {
|
||||
warn!("load_user_identity failed: {err:?}, name: {name}, user_type: {user_type:?}");
|
||||
warn!(name, user_type = ?user_type, error = ?err, "IAM user identity load failed");
|
||||
err
|
||||
}
|
||||
})?;
|
||||
@@ -750,9 +750,7 @@ impl Store for ObjectStore {
|
||||
if u.credentials.is_expired() {
|
||||
let _ = self.delete_iam_config(get_user_identity_path(name, user_type)).await;
|
||||
let _ = self.delete_iam_config(get_mapped_policy_path(name, user_type, false)).await;
|
||||
warn!(
|
||||
"load_user_identity failed: user is expired, delete the user and mapped policy, name: {name}, user_type: {user_type:?}"
|
||||
);
|
||||
warn!(name, user_type = ?user_type, "IAM user identity expired and was removed");
|
||||
return Err(Error::NoSuchUser(name.to_owned()));
|
||||
}
|
||||
|
||||
@@ -776,7 +774,7 @@ impl Store for ObjectStore {
|
||||
let _ = self.delete_iam_config(get_user_identity_path(name, user_type)).await;
|
||||
let _ = self.delete_iam_config(get_mapped_policy_path(name, user_type, false)).await;
|
||||
}
|
||||
warn!("extract_jwt_claims failed: {err:?}, name: {name}, user_type: {user_type:?}");
|
||||
warn!(name, user_type = ?user_type, error = ?err, "IAM JWT claim extraction failed");
|
||||
return Err(Error::NoSuchUser(name.to_owned()));
|
||||
}
|
||||
}
|
||||
@@ -804,7 +802,7 @@ impl Store for ObjectStore {
|
||||
|
||||
while let Some(v) = rx.recv().await {
|
||||
if let Some(err) = v.err {
|
||||
warn!("list_iam_config_items {:?}", err);
|
||||
warn!(error = ?err, "IAM config item listing failed");
|
||||
let _ = ctx.cancel();
|
||||
|
||||
return Err(err);
|
||||
@@ -866,7 +864,7 @@ impl Store for ObjectStore {
|
||||
|
||||
while let Some(v) = rx.recv().await {
|
||||
if let Some(err) = v.err {
|
||||
warn!("list_iam_config_items {:?}", err);
|
||||
warn!(error = ?err, "IAM config item listing failed");
|
||||
let _ = ctx.cancel();
|
||||
|
||||
return Err(err);
|
||||
@@ -934,7 +932,7 @@ impl Store for ObjectStore {
|
||||
|
||||
while let Some(v) = rx.recv().await {
|
||||
if let Some(err) = v.err {
|
||||
warn!("list_iam_config_items {:?}", err);
|
||||
warn!(error = ?err, "IAM config item listing failed");
|
||||
let _ = ctx.cancel();
|
||||
|
||||
return Err(err);
|
||||
@@ -1009,7 +1007,7 @@ impl Store for ObjectStore {
|
||||
|
||||
while let Some(v) = rx.recv().await {
|
||||
if let Some(err) = v.err {
|
||||
warn!("list_iam_config_items {:?}", err);
|
||||
warn!(error = ?err, "IAM config item listing failed");
|
||||
let _ = ctx.cancel();
|
||||
|
||||
return Err(err);
|
||||
@@ -1044,7 +1042,7 @@ impl Store for ObjectStore {
|
||||
|
||||
let policy_name = rustfs_utils::path::dir(&policies_list[idx]);
|
||||
|
||||
info!("load policy: {}", policy_name);
|
||||
debug!(policy = %policy_name, "IAM policy loaded");
|
||||
|
||||
policy_docs_cache.insert(policy_name, p);
|
||||
}
|
||||
@@ -1059,7 +1057,7 @@ impl Store for ObjectStore {
|
||||
}
|
||||
|
||||
let policy_name = rustfs_utils::path::dir(&policies_list[idx]);
|
||||
info!("load policy: {}", policy_name);
|
||||
debug!(policy = %policy_name, "IAM policy loaded");
|
||||
policy_docs_cache.insert(policy_name, p);
|
||||
}
|
||||
|
||||
@@ -1083,7 +1081,7 @@ impl Store for ObjectStore {
|
||||
}
|
||||
|
||||
let name = rustfs_utils::path::dir(&item_name_list[idx]);
|
||||
info!("load reg user: {}", name);
|
||||
debug!(user = %name, "IAM regular user loaded");
|
||||
user_items_cache.insert(name, p);
|
||||
}
|
||||
break;
|
||||
@@ -1097,7 +1095,7 @@ impl Store for ObjectStore {
|
||||
}
|
||||
|
||||
let name = rustfs_utils::path::dir(&item_name_list[idx]);
|
||||
info!("load reg user: {}", name);
|
||||
debug!(user = %name, "IAM regular user loaded");
|
||||
user_items_cache.insert(name, p);
|
||||
}
|
||||
|
||||
@@ -1112,7 +1110,7 @@ impl Store for ObjectStore {
|
||||
|
||||
for item in item_name_list.iter() {
|
||||
let name = rustfs_utils::path::dir(item);
|
||||
info!("load group: {}", name);
|
||||
debug!(group = %name, "IAM group loaded");
|
||||
if let Err(err) = self.load_group(&name, &mut items_cache).await {
|
||||
return Err(Error::other(format!("load group failed: {err}")));
|
||||
};
|
||||
@@ -1140,7 +1138,7 @@ impl Store for ObjectStore {
|
||||
}
|
||||
|
||||
let name = item_name_list[idx].trim_end_matches(".json").to_owned();
|
||||
info!("load user policy: {}", name);
|
||||
debug!(user = %name, "IAM user policy loaded");
|
||||
items_cache.insert(name, p);
|
||||
}
|
||||
break;
|
||||
@@ -1156,7 +1154,7 @@ impl Store for ObjectStore {
|
||||
}
|
||||
|
||||
let name = item_name_list[idx].trim_end_matches(".json").to_owned();
|
||||
info!("load user policy: {}", name);
|
||||
debug!(user = %name, "IAM user policy loaded");
|
||||
items_cache.insert(name, p);
|
||||
}
|
||||
|
||||
@@ -1174,7 +1172,7 @@ impl Store for ObjectStore {
|
||||
for item in item_name_list.iter() {
|
||||
let name = item.trim_end_matches(".json");
|
||||
|
||||
info!("load group policy: {}", name);
|
||||
debug!(group = %name, "IAM group policy loaded");
|
||||
if let Err(err) = self.load_mapped_policy(name, UserType::Reg, true, &mut items_cache).await
|
||||
&& !is_err_no_such_policy(&err)
|
||||
{
|
||||
@@ -1193,7 +1191,7 @@ impl Store for ObjectStore {
|
||||
|
||||
for item in item_name_list.iter() {
|
||||
let name = rustfs_utils::path::dir(item);
|
||||
info!("load svc user: {}", name);
|
||||
debug!(user = %name, "IAM service user loaded");
|
||||
if let Err(err) = self.load_user(&name, UserType::Svc, &mut items_cache).await
|
||||
&& !is_err_no_such_user(&err)
|
||||
{
|
||||
@@ -1204,7 +1202,7 @@ impl Store for ObjectStore {
|
||||
for (_, v) in items_cache.iter() {
|
||||
let parent = v.credentials.parent_user.clone();
|
||||
if !user_items_cache.contains_key(&parent) {
|
||||
info!("load sts user policy: {}", parent);
|
||||
debug!(user = %parent, "IAM STS parent policy loaded");
|
||||
if let Err(err) = self
|
||||
.load_mapped_policy(&parent, UserType::Sts, false, &mut sts_policies_cache)
|
||||
.await
|
||||
@@ -1223,12 +1221,12 @@ impl Store for ObjectStore {
|
||||
// sts users
|
||||
if let Some(item_name_list) = listed_config_items.get(STS_LIST_KEY) {
|
||||
for item in item_name_list.iter() {
|
||||
info!("load sts user path: {}", item);
|
||||
debug!(path = %item, "IAM STS user path discovered");
|
||||
|
||||
let name = rustfs_utils::path::dir(item);
|
||||
info!("load sts user: {}", name);
|
||||
debug!(user = %name, "IAM STS user loaded");
|
||||
if let Err(err) = self.load_user(&name, UserType::Sts, &mut sts_items_cache).await {
|
||||
info!("load sts user failed: {}", err);
|
||||
debug!(user = %name, error = %err, "IAM STS user load failed");
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1237,12 +1235,12 @@ impl Store for ObjectStore {
|
||||
if let Some(item_name_list) = listed_config_items.get(POLICY_DB_STS_USERS_LIST_KEY) {
|
||||
for item in item_name_list.iter() {
|
||||
let name = item.trim_end_matches(".json");
|
||||
info!("load sts user policy: {}", name);
|
||||
debug!(user = %name, "IAM STS user policy loaded");
|
||||
if let Err(err) = self
|
||||
.load_mapped_policy(name, UserType::Sts, false, &mut sts_policies_cache)
|
||||
.await
|
||||
{
|
||||
info!("load sts user policy failed: {}", err);
|
||||
debug!(user = %name, error = %err, "IAM STS user policy load failed");
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1264,7 +1262,7 @@ impl Store for ObjectStore {
|
||||
cache.replace_sts_policies(sts_policies_cache);
|
||||
cache.build_user_group_memberships();
|
||||
} else {
|
||||
warn!("skip IAM full reload cache commit because one or more IAM caches changed during reload");
|
||||
warn!("IAM full reload cache commit skipped due to concurrent cache changes");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user