refactor: remove old pod crates
This commit is contained in:
@@ -22,8 +22,7 @@ toml = { workspace = true }
|
||||
manifest = { workspace = true }
|
||||
secrets = { workspace = true }
|
||||
session-store = { workspace = true }
|
||||
pod-store = { workspace = true }
|
||||
pod-registry = { workspace = true }
|
||||
fs4 = { workspace = true }
|
||||
provider = { workspace = true }
|
||||
ticket = { workspace = true }
|
||||
serde = { workspace = true, features = ["derive"] }
|
||||
|
||||
@@ -16,7 +16,7 @@ Owns:
|
||||
Does not own:
|
||||
|
||||
- durable transcript authority (`session-store`)
|
||||
- Worker current state (`pod-store`)
|
||||
- Worker current state (`session-store` worker metadata)
|
||||
- Worker lifecycle policy (`worker`)
|
||||
- product CLI ownership (`yoi`)
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ fn resolve_socket(worker_name: &str, override_path: Option<PathBuf>) -> PathBuf
|
||||
if let Some(p) = override_path {
|
||||
return p;
|
||||
}
|
||||
manifest::paths::pod_socket_path(worker_name).unwrap_or_else(|| {
|
||||
manifest::paths::worker_socket_path(worker_name).unwrap_or_else(|| {
|
||||
PathBuf::from("/tmp")
|
||||
.join("yoi")
|
||||
.join(worker_name)
|
||||
@@ -317,7 +317,7 @@ async fn connect_live_pod(
|
||||
if !allow_registry_fallback {
|
||||
return None;
|
||||
}
|
||||
let registry_socket = picker::live_socket_for_pod(worker_name)?;
|
||||
let registry_socket = picker::live_socket_for_worker(worker_name)?;
|
||||
if registry_socket == preferred_socket {
|
||||
return None;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ use crossterm::event::{
|
||||
Event as TermEvent, KeyCode, KeyEvent, KeyModifiers, MouseButton, MouseEvent, MouseEventKind,
|
||||
poll, read,
|
||||
};
|
||||
use pod_store::FsWorkerStore;
|
||||
use protocol::stream::{JsonLineReader, JsonLineWriter};
|
||||
use protocol::{ErrorCode, Event, Method, Segment, WorkerStatus};
|
||||
use ratatui::Frame;
|
||||
@@ -31,6 +30,7 @@ use ratatui::text::{Line, Span};
|
||||
use ratatui::widgets::{Block, Borders, Clear, Paragraph, Widget, Wrap};
|
||||
use serde::Serialize;
|
||||
use session_store::FsStore;
|
||||
use session_store::FsWorkerStore;
|
||||
use ticket::config::{GitBranchName, TicketConfig, TicketOrchestrationConfig};
|
||||
use ticket::{
|
||||
LocalTicketBackend, MarkdownText, TicketBackend, TicketIdOrSlug, TicketStateChange,
|
||||
@@ -46,7 +46,7 @@ use crate::role_session_registry::{
|
||||
};
|
||||
use crate::worker_list::{
|
||||
StoredMetadataState, WorkerList, WorkerListEntry, WorkerVisibilitySource,
|
||||
read_reachable_live_pod_infos, read_stored_worker_infos,
|
||||
read_reachable_live_worker_infos, read_stored_worker_infos,
|
||||
};
|
||||
#[cfg(not(feature = "e2e-test"))]
|
||||
use crate::workspace_panel::build_workspace_panel;
|
||||
@@ -522,9 +522,9 @@ fn default_store_dir() -> Result<PathBuf, DashboardError> {
|
||||
})
|
||||
}
|
||||
|
||||
fn default_pod_store_dir() -> Result<PathBuf, DashboardError> {
|
||||
fn default_worker_metadata_dir() -> Result<PathBuf, DashboardError> {
|
||||
manifest::paths::data_dir()
|
||||
.map(|dir| dir.join("pods"))
|
||||
.map(|dir| dir.join("workers"))
|
||||
.ok_or_else(|| {
|
||||
DashboardError::Io(io::Error::new(
|
||||
io::ErrorKind::NotFound,
|
||||
@@ -3423,9 +3423,10 @@ async fn load_worker_list(
|
||||
) -> Result<WorkerList, DashboardError> {
|
||||
let store_dir = default_store_dir()?;
|
||||
let store = FsStore::new(&store_dir)?;
|
||||
let pod_store = FsWorkerStore::new(default_pod_store_dir()?).map_err(io::Error::other)?;
|
||||
let stored = read_stored_worker_infos(&store, &pod_store)?;
|
||||
let live = read_reachable_live_pod_infos(&store)
|
||||
let worker_metadata_store =
|
||||
FsWorkerStore::new(default_worker_metadata_dir()?).map_err(io::Error::other)?;
|
||||
let stored = read_stored_worker_infos(&store, &worker_metadata_store)?;
|
||||
let live = read_reachable_live_worker_infos(&store)
|
||||
.await
|
||||
.unwrap_or_default();
|
||||
Ok(WorkerList::from_workspace_sources(
|
||||
|
||||
+12
-11
@@ -1,7 +1,7 @@
|
||||
//! Inline-viewport "pick a Worker to attach or restore" UX.
|
||||
//!
|
||||
//! Reads live Worker allocations from the runtime registry and stopped Worker state
|
||||
//! from the pod-store name-keyed metadata. Picking a live row attaches to
|
||||
//! from the session-store worker metadata name-keyed metadata. Picking a live row attaches to
|
||||
//! its socket; picking a stopped row restores via the Worker runtime command.
|
||||
|
||||
use std::io;
|
||||
@@ -9,7 +9,6 @@ use std::path::PathBuf;
|
||||
use std::time::Duration;
|
||||
|
||||
use crossterm::event::{self, Event as TermEvent, KeyCode, KeyEventKind, KeyModifiers};
|
||||
use pod_store::FsWorkerStore;
|
||||
use ratatui::Terminal;
|
||||
use ratatui::backend::CrosstermBackend;
|
||||
use ratatui::layout::{Constraint, Layout};
|
||||
@@ -18,11 +17,12 @@ use ratatui::text::{Line, Span};
|
||||
use ratatui::widgets::Paragraph;
|
||||
use ratatui::{Frame, TerminalOptions, Viewport};
|
||||
use session_store::FsStore;
|
||||
use session_store::FsWorkerStore;
|
||||
|
||||
use crate::worker_list::{
|
||||
LiveWorkerInfo, StoredMetadataState, StoredWorkerInfo, WorkerList, WorkerListEntry,
|
||||
WorkerVisibilitySource, live_socket_for_pod as worker_list_live_socket_for_pod,
|
||||
read_reachable_live_pod_infos, read_stored_worker_infos,
|
||||
WorkerVisibilitySource, live_socket_for_worker as worker_list_live_socket_for_worker,
|
||||
read_reachable_live_worker_infos, read_stored_worker_infos,
|
||||
};
|
||||
|
||||
const MAX_ROWS: usize = 10;
|
||||
@@ -156,9 +156,10 @@ fn list_for_options(
|
||||
pub async fn run(options: PickerOptions) -> Result<PickerOutcome, PickerError> {
|
||||
let store_dir = default_store_dir()?;
|
||||
let store = FsStore::new(&store_dir)?;
|
||||
let pod_store = FsWorkerStore::new(default_pod_store_dir()?).map_err(io::Error::other)?;
|
||||
let stored_workers = read_stored_worker_infos(&store, &pod_store)?;
|
||||
let live_workers = read_reachable_live_pod_infos(&store)
|
||||
let worker_metadata_store =
|
||||
FsWorkerStore::new(default_worker_metadata_dir()?).map_err(io::Error::other)?;
|
||||
let stored_workers = read_stored_worker_infos(&store, &worker_metadata_store)?;
|
||||
let live_workers = read_reachable_live_worker_infos(&store)
|
||||
.await
|
||||
.unwrap_or_default();
|
||||
let mut list = list_for_options(&options, stored_workers, live_workers);
|
||||
@@ -223,9 +224,9 @@ fn default_store_dir() -> Result<PathBuf, PickerError> {
|
||||
})
|
||||
}
|
||||
|
||||
fn default_pod_store_dir() -> Result<PathBuf, PickerError> {
|
||||
fn default_worker_metadata_dir() -> Result<PathBuf, PickerError> {
|
||||
manifest::paths::data_dir()
|
||||
.map(|dir| dir.join("pods"))
|
||||
.map(|dir| dir.join("workers"))
|
||||
.ok_or_else(|| {
|
||||
PickerError::Io(io::Error::new(
|
||||
io::ErrorKind::NotFound,
|
||||
@@ -235,8 +236,8 @@ fn default_pod_store_dir() -> Result<PathBuf, PickerError> {
|
||||
})
|
||||
}
|
||||
|
||||
pub(crate) fn live_socket_for_pod(worker_name: &str) -> Option<PathBuf> {
|
||||
worker_list_live_socket_for_pod(worker_name)
|
||||
pub(crate) fn live_socket_for_worker(worker_name: &str) -> Option<PathBuf> {
|
||||
worker_list_live_socket_for_worker(worker_name)
|
||||
}
|
||||
|
||||
fn make_inline_terminal() -> io::Result<Terminal<CrosstermBackend<io::Stdout>>> {
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
use std::collections::{BTreeMap, BTreeSet};
|
||||
use std::io;
|
||||
use std::fs::File;
|
||||
use std::io::{self, Read};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::time::Duration;
|
||||
|
||||
use client::WorkerClient;
|
||||
use pod_registry::{LockFileGuard, default_registry_path};
|
||||
use pod_store::{WorkerActiveSegmentRef, WorkerMetadata, WorkerMetadataStore};
|
||||
use manifest::paths;
|
||||
use protocol::{Event, WorkerStatus};
|
||||
use serde::Deserialize;
|
||||
use session_store::{FsStore, SegmentId, SessionId};
|
||||
use session_store::{WorkerActiveSegmentRef, WorkerMetadata, WorkerMetadataStore};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub(crate) struct WorkerList {
|
||||
@@ -314,11 +316,14 @@ pub(crate) enum WorkerEntryDiagnosticKind {
|
||||
|
||||
pub(crate) fn read_stored_worker_infos(
|
||||
store: &FsStore,
|
||||
pod_store: &impl WorkerMetadataStore,
|
||||
worker_metadata_store: &impl WorkerMetadataStore,
|
||||
) -> Result<Vec<StoredWorkerInfo>, io::Error> {
|
||||
let mut records = Vec::new();
|
||||
for worker_name in pod_store.list_names().map_err(io::Error::other)? {
|
||||
let info = match pod_store.read_by_name(&worker_name) {
|
||||
for worker_name in worker_metadata_store
|
||||
.list_names()
|
||||
.map_err(io::Error::other)?
|
||||
{
|
||||
let info = match worker_metadata_store.read_by_name(&worker_name) {
|
||||
Ok(Some(metadata)) => stored_info_from_metadata(store, worker_name, metadata),
|
||||
Ok(None) => corrupt_stored_info(
|
||||
worker_name,
|
||||
@@ -331,16 +336,24 @@ pub(crate) fn read_stored_worker_infos(
|
||||
Ok(records)
|
||||
}
|
||||
|
||||
pub(crate) fn read_live_pod_infos() -> Result<Vec<LiveWorkerInfo>, io::Error> {
|
||||
let path = default_registry_path()?;
|
||||
let guard = LockFileGuard::open(&path)?;
|
||||
Ok(guard
|
||||
.data()
|
||||
pub(crate) fn read_live_worker_infos() -> Result<Vec<LiveWorkerInfo>, io::Error> {
|
||||
let path = paths::worker_allocation_path().ok_or_else(|| {
|
||||
io::Error::new(
|
||||
io::ErrorKind::NotFound,
|
||||
"could not resolve worker allocation path",
|
||||
)
|
||||
})?;
|
||||
let table = match read_worker_allocation_table(&path) {
|
||||
Ok(table) => table,
|
||||
Err(err) if err.kind() == io::ErrorKind::NotFound => return Ok(Vec::new()),
|
||||
Err(err) => return Err(err),
|
||||
};
|
||||
Ok(table
|
||||
.allocations
|
||||
.iter()
|
||||
.into_iter()
|
||||
.map(|allocation| LiveWorkerInfo {
|
||||
worker_name: allocation.worker_name.clone(),
|
||||
socket_path: allocation.socket.clone(),
|
||||
worker_name: allocation.worker_name,
|
||||
socket_path: allocation.socket,
|
||||
status: None,
|
||||
reachable: false,
|
||||
segment_id: allocation.segment_id,
|
||||
@@ -349,20 +362,49 @@ pub(crate) fn read_live_pod_infos() -> Result<Vec<LiveWorkerInfo>, io::Error> {
|
||||
.collect())
|
||||
}
|
||||
|
||||
pub(crate) async fn read_reachable_live_pod_infos(
|
||||
store: &FsStore,
|
||||
) -> Result<Vec<LiveWorkerInfo>, io::Error> {
|
||||
let records = read_live_pod_infos()?;
|
||||
probe_reachable_live_pod_infos(store, records).await
|
||||
fn read_worker_allocation_table(path: &Path) -> Result<WorkerAllocationTable, io::Error> {
|
||||
let mut file = File::open(path)?;
|
||||
fs4::fs_std::FileExt::lock_shared(&file)?;
|
||||
let mut contents = String::new();
|
||||
let read_result = file.read_to_string(&mut contents);
|
||||
let unlock_result = fs4::fs_std::FileExt::unlock(&file);
|
||||
read_result?;
|
||||
unlock_result?;
|
||||
|
||||
if contents.trim().is_empty() {
|
||||
return Ok(WorkerAllocationTable::default());
|
||||
}
|
||||
serde_json::from_str(&contents).map_err(io::Error::other)
|
||||
}
|
||||
|
||||
async fn probe_reachable_live_pod_infos(
|
||||
#[derive(Debug, Default, Deserialize)]
|
||||
struct WorkerAllocationTable {
|
||||
#[serde(default)]
|
||||
allocations: Vec<WorkerAllocationRecord>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct WorkerAllocationRecord {
|
||||
worker_name: String,
|
||||
socket: PathBuf,
|
||||
#[serde(default)]
|
||||
segment_id: Option<SegmentId>,
|
||||
}
|
||||
|
||||
pub(crate) async fn read_reachable_live_worker_infos(
|
||||
store: &FsStore,
|
||||
) -> Result<Vec<LiveWorkerInfo>, io::Error> {
|
||||
let records = read_live_worker_infos()?;
|
||||
probe_reachable_live_worker_infos(store, records).await
|
||||
}
|
||||
|
||||
async fn probe_reachable_live_worker_infos(
|
||||
_store: &FsStore,
|
||||
records: Vec<LiveWorkerInfo>,
|
||||
) -> Result<Vec<LiveWorkerInfo>, io::Error> {
|
||||
let mut handles = Vec::with_capacity(records.len());
|
||||
for record in records {
|
||||
handles.push(tokio::spawn(probe_live_pod_info(record)));
|
||||
handles.push(tokio::spawn(probe_live_worker_info(record)));
|
||||
}
|
||||
|
||||
let mut reachable = Vec::with_capacity(handles.len());
|
||||
@@ -378,15 +420,15 @@ async fn probe_reachable_live_pod_infos(
|
||||
Ok(reachable)
|
||||
}
|
||||
|
||||
async fn probe_live_pod_info(mut record: LiveWorkerInfo) -> Result<LiveWorkerInfo, io::Error> {
|
||||
async fn probe_live_worker_info(mut record: LiveWorkerInfo) -> Result<LiveWorkerInfo, io::Error> {
|
||||
let status = probe_live_status(&record.socket_path).await?;
|
||||
record.reachable = true;
|
||||
record.status = status;
|
||||
Ok(record)
|
||||
}
|
||||
|
||||
pub(crate) fn live_socket_for_pod(worker_name: &str) -> Option<PathBuf> {
|
||||
read_live_pod_infos()
|
||||
pub(crate) fn live_socket_for_worker(worker_name: &str) -> Option<PathBuf> {
|
||||
read_live_worker_infos()
|
||||
.ok()?
|
||||
.into_iter()
|
||||
.find(|worker| worker.worker_name == worker_name)
|
||||
@@ -560,10 +602,10 @@ mod tests {
|
||||
use std::sync::Arc;
|
||||
|
||||
use llm_engine::llm_client::types::RequestConfig;
|
||||
use pod_store::FsWorkerStore;
|
||||
use pod_store::{WorkerActiveSegmentRef, WorkerMetadataStore};
|
||||
use protocol::stream::JsonLineWriter;
|
||||
use session_store::FsWorkerStore;
|
||||
use session_store::{LogEntry, Store, new_segment_id, new_session_id};
|
||||
use session_store::{WorkerActiveSegmentRef, WorkerMetadataStore};
|
||||
use tempfile::tempdir;
|
||||
use tokio::net::UnixListener;
|
||||
use tokio::sync::Barrier;
|
||||
@@ -877,7 +919,7 @@ mod tests {
|
||||
|
||||
let records = tokio::time::timeout(
|
||||
LIVE_STATUS_PROBE_TIMEOUT * 3,
|
||||
probe_reachable_live_pod_infos(&store, records),
|
||||
probe_reachable_live_worker_infos(&store, records),
|
||||
)
|
||||
.await
|
||||
.expect("status probes should complete")
|
||||
@@ -907,7 +949,7 @@ mod tests {
|
||||
std::future::pending::<()>().await;
|
||||
});
|
||||
|
||||
let records = probe_reachable_live_pod_infos(
|
||||
let records = probe_reachable_live_worker_infos(
|
||||
&store,
|
||||
vec![live_probe_record("silent", socket_path.clone())],
|
||||
)
|
||||
@@ -985,12 +1027,12 @@ mod tests {
|
||||
fn read_stored_worker_infos_reports_corrupt_metadata() {
|
||||
let dir = tempdir().unwrap();
|
||||
let store = FsStore::new(dir.path()).unwrap();
|
||||
let pod_store = FsWorkerStore::new(dir.path().join("pods")).unwrap();
|
||||
let pod_dir = dir.path().join("pods").join("broken");
|
||||
std::fs::create_dir_all(&pod_dir).unwrap();
|
||||
std::fs::write(pod_dir.join("metadata.json"), "{not-json").unwrap();
|
||||
let worker_metadata_store = FsWorkerStore::new(dir.path().join("workers")).unwrap();
|
||||
let worker_metadata_dir = dir.path().join("workers").join("broken");
|
||||
std::fs::create_dir_all(&worker_metadata_dir).unwrap();
|
||||
std::fs::write(worker_metadata_dir.join("metadata.json"), "{not-json").unwrap();
|
||||
|
||||
let records = read_stored_worker_infos(&store, &pod_store).unwrap();
|
||||
let records = read_stored_worker_infos(&store, &worker_metadata_store).unwrap();
|
||||
assert_eq!(records.len(), 1);
|
||||
assert_eq!(records[0].worker_name, "broken");
|
||||
assert!(matches!(
|
||||
@@ -1003,10 +1045,10 @@ mod tests {
|
||||
fn read_stored_worker_infos_reads_metadata() {
|
||||
let dir = tempdir().unwrap();
|
||||
let store = FsStore::new(dir.path()).unwrap();
|
||||
let pod_store = FsWorkerStore::new(dir.path().join("pods")).unwrap();
|
||||
let worker_metadata_store = FsWorkerStore::new(dir.path().join("workers")).unwrap();
|
||||
let session_id = new_session_id();
|
||||
let segment_id = new_segment_id();
|
||||
pod_store
|
||||
worker_metadata_store
|
||||
.write(&WorkerMetadata::new(
|
||||
"agent",
|
||||
Some(WorkerActiveSegmentRef::active_segment(
|
||||
@@ -1015,7 +1057,7 @@ mod tests {
|
||||
))
|
||||
.unwrap();
|
||||
|
||||
let records = read_stored_worker_infos(&store, &pod_store).unwrap();
|
||||
let records = read_stored_worker_infos(&store, &worker_metadata_store).unwrap();
|
||||
assert_eq!(records.len(), 1);
|
||||
assert_eq!(records[0].worker_name, "agent");
|
||||
assert_eq!(records[0].metadata_state, StoredMetadataState::Present);
|
||||
|
||||
Reference in New Issue
Block a user