fix: track config.csv ETag to avoid unnecessary syncs
All checks were successful
BotServer CI/CD / build (push) Successful in 5m2s

- Add ETag tracking for config.csv files in DriveMonitor
- Only download and sync config.csv when ETag changes
- Prevents unnecessary database updates on every check
- Uses __config__ prefix for config.csv state keys
This commit is contained in:
Rodrigo Rodriguez (Pragmatismo) 2026-04-12 19:49:28 -03:00
parent 1977c4c0af
commit 4cd469afc3

View file

@ -772,20 +772,30 @@ impl DriveMonitor {
}
debug!("check_gbot: Found config.csv at path: {}", path);
match client
.head_object()
.bucket(&self.bucket_name)
.key(&path)
.send()
.await
{
Ok(_head_res) => {
let response = client
.get_object()
.bucket(&self.bucket_name)
.key(&path)
.send()
.await?;
let etag = obj.e_tag().unwrap_or_default().to_string();
let config_state_key = format!("__config__{}", path);
let should_sync = {
let states = self.file_states.read().await;
match states.get(&config_state_key) {
Some(prev) => prev.etag != etag,
None => true,
}
};
if should_sync {
match client
.head_object()
.bucket(&self.bucket_name)
.key(&path)
.send()
.await
{
Ok(_head_res) => {
let response = client
.get_object()
.bucket(&self.bucket_name)
.key(&path)
.send()
.await?;
let bytes = response.body.collect().await?.into_bytes();
let csv_content = String::from_utf8(bytes.to_vec())
.map_err(|e| format!("UTF-8 error in {}: {}", path, e))?;
@ -902,6 +912,19 @@ impl DriveMonitor {
self.broadcast_theme_change(&csv_content).await?;
}
// Update file_states with config.csv ETag
let mut states = self.file_states.write().await;
states.insert(config_state_key, FileState { etag, indexed: false, last_failed_at: None, fail_count: 0 });
drop(states);
let file_states_clone = Arc::clone(&self.file_states);
let work_root_clone = self.work_root.clone();
let bucket_name_clone = self.bucket_name.clone();
tokio::spawn(async move {
if let Err(e) = Self::save_file_states_static(&file_states_clone, &work_root_clone, &bucket_name_clone).await {
warn!("Failed to save file states after config update: {}", e);
}
});
// Check for system-prompt-file and download it
let prompt_file_line = csv_content
.lines()
@ -950,6 +973,7 @@ impl DriveMonitor {
log::error!("Config file {} not found or inaccessible: {}", path, e);
}
}
}
}
if !list_objects.is_truncated.unwrap_or(false) {
break;