atagen

roundabout

public
Star0
Watch0
56a853ebf2549fd63ad8a481423b088d23dd0dc1
1
ssh://brewery@pls.lobotomise.me:33/atagen/roundabout.git

Blame: src/proto.rs

6f5b84fad3efatagen2026-09-27 03:59 UTC1
use std::{
6f5b84fad3efatagen2026-09-27 03:59 UTC2
    io::{self, BufRead, BufReader, Write},
6f5b84fad3efatagen2026-09-27 03:59 UTC3
    os::unix::net::UnixStream,
6f5b84fad3efatagen2026-09-27 03:59 UTC4
    path::PathBuf,
6f5b84fad3efatagen2026-09-27 03:59 UTC5
};
6f5b84fad3efatagen2026-09-27 03:59 UTC6
6f5b84fad3efatagen2026-09-27 03:59 UTC7
use serde::{Deserialize, Serialize, de::DeserializeOwned};
6f5b84fad3efatagen2026-09-27 03:59 UTC8
6f5b84fad3efatagen2026-09-27 03:59 UTC9
use crate::{
6f5b84fad3efatagen2026-09-27 03:59 UTC10
    sched::{Need, Reason},
6f5b84fad3efatagen2026-09-27 03:59 UTC11
    units::{Bytes, Dur},
6f5b84fad3efatagen2026-09-27 03:59 UTC12
};
6f5b84fad3efatagen2026-09-27 03:59 UTC13
6f5b84fad3efatagen2026-09-27 03:59 UTC14
pub type LeaseId = u64;
6f5b84fad3efatagen2026-09-27 03:59 UTC15
6f5b84fad3efatagen2026-09-27 03:59 UTC16
#[derive(Clone, Debug, Serialize, Deserialize)]
6f5b84fad3efatagen2026-09-27 03:59 UTC17
pub struct Acquire {
6f5b84fad3efatagen2026-09-27 03:59 UTC18
    pub need: Need,
6f5b84fad3efatagen2026-09-27 03:59 UTC19
    pub cwd: PathBuf,
6f5b84fad3efatagen2026-09-27 03:59 UTC20
    pub cmd: Vec<String>,
6f5b84fad3efatagen2026-09-27 03:59 UTC21
    pub session: Option<String>,
6f5b84fad3efatagen2026-09-27 03:59 UTC22
    pub deadline: Option<Dur>,
6f5b84fad3efatagen2026-09-27 03:59 UTC23
}
6f5b84fad3efatagen2026-09-27 03:59 UTC24
6f5b84fad3efatagen2026-09-27 03:59 UTC25
#[derive(Debug, Serialize, Deserialize)]
6f5b84fad3efatagen2026-09-27 03:59 UTC26
#[serde(tag = "op", rename_all = "snake_case")]
6f5b84fad3efatagen2026-09-27 03:59 UTC27
pub enum Request {
6f5b84fad3efatagen2026-09-27 03:59 UTC28
    Acquire(Acquire),
6f5b84fad3efatagen2026-09-27 03:59 UTC29
    Started { pid: i32 },
6f5b84fad3efatagen2026-09-27 03:59 UTC30
    Usage { rss: Bytes },
6f5b84fad3efatagen2026-09-27 03:59 UTC31
    Done,
6f5b84fad3efatagen2026-09-27 03:59 UTC32
    Status,
6f5b84fad3efatagen2026-09-27 03:59 UTC33
    Kill { lease: LeaseId },
6f5b84fad3efatagen2026-09-27 03:59 UTC34
    Extend { lease: LeaseId, by: Dur },
6f5b84fad3efatagen2026-09-27 03:59 UTC35
    Watch { lease: LeaseId },
6f5b84fad3efatagen2026-09-27 03:59 UTC36
    Overdue { session: String },
6f5b84fad3efatagen2026-09-27 03:59 UTC37
}
6f5b84fad3efatagen2026-09-27 03:59 UTC38
6f5b84fad3efatagen2026-09-27 03:59 UTC39
#[derive(Clone, Debug, Serialize, Deserialize)]
6f5b84fad3efatagen2026-09-27 03:59 UTC40
pub struct LeaseInfo {
6f5b84fad3efatagen2026-09-27 03:59 UTC41
    pub id: LeaseId,
6f5b84fad3efatagen2026-09-27 03:59 UTC42
    pub cmd: Vec<String>,
6f5b84fad3efatagen2026-09-27 03:59 UTC43
    pub cwd: PathBuf,
6f5b84fad3efatagen2026-09-27 03:59 UTC44
    pub session: Option<String>,
6f5b84fad3efatagen2026-09-27 03:59 UTC45
    pub need: Need,
6f5b84fad3efatagen2026-09-27 03:59 UTC46
    pub heavy: bool,
6f5b84fad3efatagen2026-09-27 03:59 UTC47
    pub running: bool,
6f5b84fad3efatagen2026-09-27 03:59 UTC48
    /// seconds since queued or started, whichever it's doing
6f5b84fad3efatagen2026-09-27 03:59 UTC49
    pub elapsed: u64,
6f5b84fad3efatagen2026-09-27 03:59 UTC50
    pub rss: Bytes,
6f5b84fad3efatagen2026-09-27 03:59 UTC51
    pub overdue: bool,
6f5b84fad3efatagen2026-09-27 03:59 UTC52
    pub waiting: Option<Reason>,
6f5b84fad3efatagen2026-09-27 03:59 UTC53
    pub position: usize,
6f5b84fad3efatagen2026-09-27 03:59 UTC54
}
6f5b84fad3efatagen2026-09-27 03:59 UTC55
6f5b84fad3efatagen2026-09-27 03:59 UTC56
#[derive(Debug, Serialize, Deserialize)]
6f5b84fad3efatagen2026-09-27 03:59 UTC57
pub struct Status {
6f5b84fad3efatagen2026-09-27 03:59 UTC58
    pub leases: Vec<LeaseInfo>,
6f5b84fad3efatagen2026-09-27 03:59 UTC59
    pub ram_free: Bytes,
6f5b84fad3efatagen2026-09-27 03:59 UTC60
    pub ram_budget: Bytes,
6f5b84fad3efatagen2026-09-27 03:59 UTC61
    pub cores_free: u32,
6f5b84fad3efatagen2026-09-27 03:59 UTC62
    pub cores: u32,
6f5b84fad3efatagen2026-09-27 03:59 UTC63
}
6f5b84fad3efatagen2026-09-27 03:59 UTC64
6f5b84fad3efatagen2026-09-27 03:59 UTC65
#[derive(Debug, Serialize, Deserialize)]
6f5b84fad3efatagen2026-09-27 03:59 UTC66
#[serde(tag = "ev", rename_all = "snake_case")]
6f5b84fad3efatagen2026-09-27 03:59 UTC67
pub enum Event {
6f5b84fad3efatagen2026-09-27 03:59 UTC68
    Queued {
6f5b84fad3efatagen2026-09-27 03:59 UTC69
        lease: LeaseId,
6f5b84fad3efatagen2026-09-27 03:59 UTC70
        position: usize,
6f5b84fad3efatagen2026-09-27 03:59 UTC71
        reason: Option<Reason>,
6f5b84fad3efatagen2026-09-27 03:59 UTC72
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC73
    Granted {
6f5b84fad3efatagen2026-09-27 03:59 UTC74
        lease: LeaseId,
6f5b84fad3efatagen2026-09-27 03:59 UTC75
        cores: u32,
6f5b84fad3efatagen2026-09-27 03:59 UTC76
        heavy: bool,
6f5b84fad3efatagen2026-09-27 03:59 UTC77
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC78
    Kill,
6f5b84fad3efatagen2026-09-27 03:59 UTC79
    Status(Status),
6f5b84fad3efatagen2026-09-27 03:59 UTC80
    Overdue {
6f5b84fad3efatagen2026-09-27 03:59 UTC81
        leases: Vec<LeaseInfo>,
6f5b84fad3efatagen2026-09-27 03:59 UTC82
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC83
    Fired {
6f5b84fad3efatagen2026-09-27 03:59 UTC84
        overdue: bool,
6f5b84fad3efatagen2026-09-27 03:59 UTC85
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC86
    Ok,
6f5b84fad3efatagen2026-09-27 03:59 UTC87
    Err {
6f5b84fad3efatagen2026-09-27 03:59 UTC88
        msg: String,
6f5b84fad3efatagen2026-09-27 03:59 UTC89
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC90
}
6f5b84fad3efatagen2026-09-27 03:59 UTC91
6f5b84fad3efatagen2026-09-27 03:59 UTC92
pub fn send<T: Serialize>(stream: &mut UnixStream, msg: &T) -> io::Result<()> {
6f5b84fad3efatagen2026-09-27 03:59 UTC93
    let mut line = serde_json::to_vec(msg)?;
6f5b84fad3efatagen2026-09-27 03:59 UTC94
    line.push(b'\n');
6f5b84fad3efatagen2026-09-27 03:59 UTC95
    stream.write_all(&line)
6f5b84fad3efatagen2026-09-27 03:59 UTC96
}
6f5b84fad3efatagen2026-09-27 03:59 UTC97
6f5b84fad3efatagen2026-09-27 03:59 UTC98
pub struct Reader(BufReader<UnixStream>);
6f5b84fad3efatagen2026-09-27 03:59 UTC99
6f5b84fad3efatagen2026-09-27 03:59 UTC100
impl Reader {
6f5b84fad3efatagen2026-09-27 03:59 UTC101
    pub fn new(stream: &UnixStream) -> io::Result<Self> {
6f5b84fad3efatagen2026-09-27 03:59 UTC102
        Ok(Self(BufReader::new(stream.try_clone()?)))
6f5b84fad3efatagen2026-09-27 03:59 UTC103
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC104
6f5b84fad3efatagen2026-09-27 03:59 UTC105
    /// `Ok(None)` on eof
6f5b84fad3efatagen2026-09-27 03:59 UTC106
    pub fn recv<T: DeserializeOwned>(&mut self) -> io::Result<Option<T>> {
6f5b84fad3efatagen2026-09-27 03:59 UTC107
        let mut line = String::new();
6f5b84fad3efatagen2026-09-27 03:59 UTC108
        if self.0.read_line(&mut line)? == 0 {
6f5b84fad3efatagen2026-09-27 03:59 UTC109
            return Ok(None);
6f5b84fad3efatagen2026-09-27 03:59 UTC110
        }
6f5b84fad3efatagen2026-09-27 03:59 UTC111
        serde_json::from_str(&line)
6f5b84fad3efatagen2026-09-27 03:59 UTC112
            .map(Some)
6f5b84fad3efatagen2026-09-27 03:59 UTC113
            .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
6f5b84fad3efatagen2026-09-27 03:59 UTC114
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC115
}