use crate::BlockKind;
use kevy_resp::{Argv, RespVersion};
use std::collections::HashMap;
use std::sync::{Arc, RwLock};
pub(crate) type KvPairs = Vec<(Vec<u8>, Vec<u8>)>;
pub(crate) type PubSubReg = Arc<RwLock<HashMap<Vec<u8>, (u32, u64)>>>;
pub(crate) type PubSubPatternReg = Arc<RwLock<Vec<(Vec<u8>, u32, u64)>>>;
pub(crate) type PubMsg = Arc<(Vec<u8>, Vec<u8>)>;
#[derive(Clone, Copy)]
pub(crate) enum GatherKind {
Str,
Set,
}
pub(crate) enum Gathered {
Str(Option<Vec<u8>>),
Members(Vec<Vec<u8>>),
WrongType,
}
#[derive(Clone, Copy)]
pub(crate) enum MultiOp {
Mget,
SInter,
SUnion,
SDiff,
}
pub(crate) enum Op {
Dispatch(Argv, RespVersion),
Del(Vec<Vec<u8>>),
Exists(Vec<Vec<u8>>),
Dbsize,
Flush,
Save,
RewriteAof,
MSet(KvPairs),
Gather(GatherKind, Vec<Vec<u8>>),
CollectKeys(Option<Vec<u8>>, Option<usize>),
CollectWatchVersions(Vec<Vec<u8>>),
CheckWatch(Vec<(Vec<u8>, u64)>),
Rename {
src: Vec<u8>,
dst: Vec<u8>,
nx: bool,
},
RenameTake(Vec<u8>),
RenamePut {
dst: Vec<u8>,
value: kevy_store::Value,
ttl_ms: Option<u64>,
nx: bool,
},
SlowlogGet,
SlowlogLen,
SlowlogReset,
}
#[derive(Clone, Copy)]
pub(crate) enum KeyShape {
Keys,
Scan,
Random,
}
pub(crate) enum Part {
Reply(Vec<u8>),
Int(i64),
Ok,
Gathered(Vec<(Vec<u8>, Gathered)>),
Keys(Vec<Vec<u8>>),
WatchVersions(Vec<(Vec<u8>, u64)>),
RenameTaken {
value: kevy_store::Value,
ttl_ms: Option<u64>,
},
RenameNoSuchSrc,
RenamePutDone {
stored: bool,
},
SlowlogEntries(Vec<crate::exec_slowlog::SlowlogEntry>),
}
pub(crate) type ReqBatch = Vec<(u64, u64, Argv, RespVersion)>;
pub(crate) type RespBatch = Vec<(u64, u64, Part)>;
pub(crate) enum Inbound {
Request {
origin: usize,
conn: u64,
seq: u64,
op: Op,
},
Response {
conn: u64,
seq: u64,
part: Part,
},
RequestBatch {
origin: usize,
reqs: ReqBatch,
},
ResponseBatch(RespBatch),
DeliverPublish(Vec<PubMsg>),
BlockArm {
origin: usize,
conn: u64,
key: Vec<u8>,
kind: BlockKind,
serve_argv: Argv,
proto: RespVersion,
},
BlockReady { conn: u64, key: Vec<u8> },
BlockServeReq {
origin: usize,
conn: u64,
key: Vec<u8>,
},
BlockServeResp {
conn: u64,
key: Vec<u8>,
reply: Vec<u8>,
},
BlockCancel { origin: usize, conn: u64 },
}
pub(crate) enum Agg {
First(Option<Vec<u8>>),
SumInt(i64),
AllOk,
Gather {
op: MultiOp,
keys: Vec<Vec<u8>>,
got: HashMap<Vec<u8>, Gathered>,
},
Keys {
shape: KeyShape,
acc: Vec<Vec<u8>>,
},
WatchCollect {
pairs: Vec<(Vec<u8>, u64)>,
},
ExecPrep {
dirty: bool,
queued: Vec<Argv>,
header_seq: u64,
},
SlowlogGet {
count: Option<i64>,
entries: Vec<crate::exec_slowlog::SlowlogEntry>,
},
RenameOrchestrator {
step: RenameStep,
nx: bool,
src: Vec<u8>,
dst: Vec<u8>,
dst_shard: usize,
taken: Option<(kevy_store::Value, Option<u64>)>,
put_stored: Option<bool>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum RenameStep {
Take,
Put,
}
pub(crate) struct PendingSlot {
pub(crate) remaining: u32,
pub(crate) agg: Agg,
pub(crate) done: Option<Vec<u8>>,
pub(crate) proto: RespVersion,
}