(
&self,
sandbox_id: &str,
connected: bool,
)
| 1290 | } |
| 1291 | |
| 1292 | async fn set_supervisor_session_state( |
| 1293 | &self, |
| 1294 | sandbox_id: &str, |
| 1295 | connected: bool, |
| 1296 | ) -> Result<(), String> { |
| 1297 | let _guard = self.sync_lock.lock().await; |
| 1298 | |
| 1299 | // Use CAS to update sandbox phase based on supervisor session state |
| 1300 | let result = self |
| 1301 | .store |
| 1302 | .update_message_cas::<Sandbox, _>(sandbox_id, 0, |sandbox| { |
| 1303 | let current_phase = |
| 1304 | SandboxPhase::try_from(sandbox.phase()).unwrap_or(SandboxPhase::Unknown); |
| 1305 | |
| 1306 | // Skip if sandbox is in terminal state |
| 1307 | if current_phase == SandboxPhase::Deleting || current_phase == SandboxPhase::Error { |
| 1308 | return; |
| 1309 | } |
| 1310 | |
| 1311 | let sandbox_name = sandbox.object_name().to_string(); |
| 1312 | if connected { |
| 1313 | ensure_supervisor_ready_status(&mut sandbox.status, &sandbox_name); |
| 1314 | sandbox.set_phase(SandboxPhase::Ready as i32); |
| 1315 | } else if current_phase == SandboxPhase::Ready { |
| 1316 | ensure_supervisor_not_ready_status(&mut sandbox.status, &sandbox_name); |
| 1317 | sandbox.set_phase(SandboxPhase::Provisioning as i32); |
| 1318 | } |
| 1319 | }) |
| 1320 | .await; |
| 1321 | |
| 1322 | // Handle not found gracefully (sandbox may have been deleted) |
| 1323 | let sandbox = match result { |
| 1324 | Ok(s) => s, |
| 1325 | Err(crate::persistence::PersistenceError::Database(ref msg)) |
| 1326 | if msg.contains("not found") => |
| 1327 | { |
| 1328 | return Ok(()); |
| 1329 | } |
| 1330 | Err(crate::persistence::PersistenceError::Conflict { |
| 1331 | current_resource_version, |
| 1332 | }) => { |
| 1333 | return Err(format!( |
| 1334 | "concurrent modification detected (current resource_version: {})", |
| 1335 | current_resource_version |
| 1336 | .map_or_else(|| "unknown".to_string(), |v| v.to_string()) |
| 1337 | )); |
| 1338 | } |
| 1339 | Err(e) => return Err(e.to_string()), |
| 1340 | }; |
| 1341 | |
| 1342 | self.sandbox_index.update_from_sandbox(&sandbox); |
| 1343 | self.sandbox_watch_bus.notify(sandbox_id); |
| 1344 | Ok(()) |
| 1345 | } |
| 1346 | |
| 1347 | async fn apply_deleted(&self, sandbox_id: &str) -> Result<(), String> { |
| 1348 | let _guard = self.sync_lock.lock().await; |
no test coverage detected