atagen

roundabout

public
Star0
Watch0
ecc1cf8df0f5b88c6bf2cd07254c98d13827cd26
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>,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC23
    #[serde(default)]
ecc1cf8df0f5atagen2026-09-27 13:36 UTC24
    pub exact: bool,
6f5b84fad3efatagen2026-09-27 03:59 UTC25
}
6f5b84fad3efatagen2026-09-27 03:59 UTC26
6f5b84fad3efatagen2026-09-27 03:59 UTC27
#[derive(Debug, Serialize, Deserialize)]
6f5b84fad3efatagen2026-09-27 03:59 UTC28
#[serde(tag = "op", rename_all = "snake_case")]
6f5b84fad3efatagen2026-09-27 03:59 UTC29
pub enum Request {
ecc1cf8df0f5atagen2026-09-27 13:36 UTC30
    /// `None` withdraws it
ecc1cf8df0f5atagen2026-09-27 13:36 UTC31
    Expect {
ecc1cf8df0f5atagen2026-09-27 13:36 UTC32
        session: String,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC33
        need: Option<Need>,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC34
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC35
    Acquire(Acquire),
ecc1cf8df0f5atagen2026-09-27 13:36 UTC36
    Started {
ecc1cf8df0f5atagen2026-09-27 13:36 UTC37
        pid: i32,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC38
    },
ecc1cf8df0f5atagen2026-09-27 13:36 UTC39
    Usage {
ecc1cf8df0f5atagen2026-09-27 13:36 UTC40
        rss: Bytes,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC41
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC42
    Done,
6f5b84fad3efatagen2026-09-27 03:59 UTC43
    Status,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC44
    Kill {
ecc1cf8df0f5atagen2026-09-27 13:36 UTC45
        lease: LeaseId,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC46
    },
ecc1cf8df0f5atagen2026-09-27 13:36 UTC47
    Extend {
ecc1cf8df0f5atagen2026-09-27 13:36 UTC48
        lease: LeaseId,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC49
        by: Dur,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC50
    },
ecc1cf8df0f5atagen2026-09-27 13:36 UTC51
    Watch {
ecc1cf8df0f5atagen2026-09-27 13:36 UTC52
        lease: LeaseId,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC53
    },
ecc1cf8df0f5atagen2026-09-27 13:36 UTC54
    Overdue {
ecc1cf8df0f5atagen2026-09-27 13:36 UTC55
        session: String,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC56
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC57
}
6f5b84fad3efatagen2026-09-27 03:59 UTC58
6f5b84fad3efatagen2026-09-27 03:59 UTC59
#[derive(Clone, Debug, Serialize, Deserialize)]
6f5b84fad3efatagen2026-09-27 03:59 UTC60
pub struct LeaseInfo {
6f5b84fad3efatagen2026-09-27 03:59 UTC61
    pub id: LeaseId,
6f5b84fad3efatagen2026-09-27 03:59 UTC62
    pub cmd: Vec<String>,
6f5b84fad3efatagen2026-09-27 03:59 UTC63
    pub cwd: PathBuf,
6f5b84fad3efatagen2026-09-27 03:59 UTC64
    pub session: Option<String>,
6f5b84fad3efatagen2026-09-27 03:59 UTC65
    pub need: Need,
6f5b84fad3efatagen2026-09-27 03:59 UTC66
    pub heavy: bool,
6f5b84fad3efatagen2026-09-27 03:59 UTC67
    pub running: bool,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC68
    #[serde(default)]
ecc1cf8df0f5atagen2026-09-27 13:36 UTC69
    pub granted: u32,
6f5b84fad3efatagen2026-09-27 03:59 UTC70
    /// seconds since queued or started, whichever it's doing
6f5b84fad3efatagen2026-09-27 03:59 UTC71
    pub elapsed: u64,
6f5b84fad3efatagen2026-09-27 03:59 UTC72
    pub rss: Bytes,
6f5b84fad3efatagen2026-09-27 03:59 UTC73
    pub overdue: bool,
6f5b84fad3efatagen2026-09-27 03:59 UTC74
    pub waiting: Option<Reason>,
6f5b84fad3efatagen2026-09-27 03:59 UTC75
    pub position: usize,
6f5b84fad3efatagen2026-09-27 03:59 UTC76
}
6f5b84fad3efatagen2026-09-27 03:59 UTC77
ecc1cf8df0f5atagen2026-09-27 13:36 UTC78
#[derive(Clone, Debug, Serialize, Deserialize)]
ecc1cf8df0f5atagen2026-09-27 13:36 UTC79
pub struct IntentInfo {
ecc1cf8df0f5atagen2026-09-27 13:36 UTC80
    pub session: String,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC81
    pub need: Need,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC82
    pub expires_in: u64,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC83
}
ecc1cf8df0f5atagen2026-09-27 13:36 UTC84
6f5b84fad3efatagen2026-09-27 03:59 UTC85
#[derive(Debug, Serialize, Deserialize)]
6f5b84fad3efatagen2026-09-27 03:59 UTC86
pub struct Status {
6f5b84fad3efatagen2026-09-27 03:59 UTC87
    pub leases: Vec<LeaseInfo>,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC88
    pub intents: Vec<IntentInfo>,
6f5b84fad3efatagen2026-09-27 03:59 UTC89
    pub ram_free: Bytes,
6f5b84fad3efatagen2026-09-27 03:59 UTC90
    pub ram_budget: Bytes,
6f5b84fad3efatagen2026-09-27 03:59 UTC91
    pub cores_free: u32,
6f5b84fad3efatagen2026-09-27 03:59 UTC92
    pub cores: u32,
6f5b84fad3efatagen2026-09-27 03:59 UTC93
}
6f5b84fad3efatagen2026-09-27 03:59 UTC94
6f5b84fad3efatagen2026-09-27 03:59 UTC95
#[derive(Debug, Serialize, Deserialize)]
6f5b84fad3efatagen2026-09-27 03:59 UTC96
#[serde(tag = "ev", rename_all = "snake_case")]
6f5b84fad3efatagen2026-09-27 03:59 UTC97
pub enum Event {
6f5b84fad3efatagen2026-09-27 03:59 UTC98
    Queued {
6f5b84fad3efatagen2026-09-27 03:59 UTC99
        lease: LeaseId,
6f5b84fad3efatagen2026-09-27 03:59 UTC100
        position: usize,
6f5b84fad3efatagen2026-09-27 03:59 UTC101
        reason: Option<Reason>,
6f5b84fad3efatagen2026-09-27 03:59 UTC102
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC103
    Granted {
6f5b84fad3efatagen2026-09-27 03:59 UTC104
        lease: LeaseId,
6f5b84fad3efatagen2026-09-27 03:59 UTC105
        cores: u32,
ecc1cf8df0f5atagen2026-09-27 13:36 UTC106
        /// grows with any bonus cores, since more jobs means more ram
ecc1cf8df0f5atagen2026-09-27 13:36 UTC107
        ram: Bytes,
6f5b84fad3efatagen2026-09-27 03:59 UTC108
        heavy: bool,
6f5b84fad3efatagen2026-09-27 03:59 UTC109
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC110
    Kill,
6f5b84fad3efatagen2026-09-27 03:59 UTC111
    Status(Status),
6f5b84fad3efatagen2026-09-27 03:59 UTC112
    Overdue {
6f5b84fad3efatagen2026-09-27 03:59 UTC113
        leases: Vec<LeaseInfo>,
6f5b84fad3efatagen2026-09-27 03:59 UTC114
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC115
    Fired {
6f5b84fad3efatagen2026-09-27 03:59 UTC116
        overdue: bool,
6f5b84fad3efatagen2026-09-27 03:59 UTC117
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC118
    Ok,
6f5b84fad3efatagen2026-09-27 03:59 UTC119
    Err {
6f5b84fad3efatagen2026-09-27 03:59 UTC120
        msg: String,
6f5b84fad3efatagen2026-09-27 03:59 UTC121
    },
6f5b84fad3efatagen2026-09-27 03:59 UTC122
}
6f5b84fad3efatagen2026-09-27 03:59 UTC123
6f5b84fad3efatagen2026-09-27 03:59 UTC124
pub fn send<T: Serialize>(stream: &mut UnixStream, msg: &T) -> io::Result<()> {
6f5b84fad3efatagen2026-09-27 03:59 UTC125
    let mut line = serde_json::to_vec(msg)?;
6f5b84fad3efatagen2026-09-27 03:59 UTC126
    line.push(b'\n');
6f5b84fad3efatagen2026-09-27 03:59 UTC127
    stream.write_all(&line)
6f5b84fad3efatagen2026-09-27 03:59 UTC128
}
6f5b84fad3efatagen2026-09-27 03:59 UTC129
6f5b84fad3efatagen2026-09-27 03:59 UTC130
pub struct Reader(BufReader<UnixStream>);
6f5b84fad3efatagen2026-09-27 03:59 UTC131
6f5b84fad3efatagen2026-09-27 03:59 UTC132
impl Reader {
6f5b84fad3efatagen2026-09-27 03:59 UTC133
    pub fn new(stream: &UnixStream) -> io::Result<Self> {
6f5b84fad3efatagen2026-09-27 03:59 UTC134
        Ok(Self(BufReader::new(stream.try_clone()?)))
6f5b84fad3efatagen2026-09-27 03:59 UTC135
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC136
6f5b84fad3efatagen2026-09-27 03:59 UTC137
    /// `Ok(None)` on eof
6f5b84fad3efatagen2026-09-27 03:59 UTC138
    pub fn recv<T: DeserializeOwned>(&mut self) -> io::Result<Option<T>> {
6f5b84fad3efatagen2026-09-27 03:59 UTC139
        let mut line = String::new();
6f5b84fad3efatagen2026-09-27 03:59 UTC140
        if self.0.read_line(&mut line)? == 0 {
6f5b84fad3efatagen2026-09-27 03:59 UTC141
            return Ok(None);
6f5b84fad3efatagen2026-09-27 03:59 UTC142
        }
6f5b84fad3efatagen2026-09-27 03:59 UTC143
        serde_json::from_str(&line)
6f5b84fad3efatagen2026-09-27 03:59 UTC144
            .map(Some)
6f5b84fad3efatagen2026-09-27 03:59 UTC145
            .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
6f5b84fad3efatagen2026-09-27 03:59 UTC146
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC147
}