Files
dht/src/search/src/cluster/protocol.rs
T

182 lines
5.7 KiB
Rust

// 负责定义采集器与协调器之间稳定且有版本检查的传输数据
use serde::{Deserialize, Serialize};
use crate::{config::DhtConfig, domain::VerificationResult};
pub(crate) const PROTOCOL_VERSION: u16 = 2;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct CollectorDesiredConfig {
pub(crate) dht: DhtConfig,
pub(crate) verification_enabled: bool,
pub(crate) verification_max_active: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct RegisterRequest {
pub(crate) protocol_version: u16,
pub(crate) node_id: String,
pub(crate) name: String,
pub(crate) initial_config: CollectorDesiredConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct ControlResponse {
pub(crate) protocol_version: u16,
pub(crate) revision: u64,
pub(crate) desired: CollectorDesiredConfig,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct CollectorMetrics {
pub(crate) state: String,
pub(crate) nodes: u64,
pub(crate) metadata_in_flight: u64,
pub(crate) metadata_succeeded: u64,
pub(crate) metadata_failed: u64,
pub(crate) udp_tx_packets: u64,
pub(crate) metadata_peer_attempts: u64,
pub(crate) metadata_peer_canceled: u64,
pub(crate) metadata_peer_failure_cache_hits: u64,
pub(crate) metadata_peer_failure_cache_entries: u64,
pub(crate) metadata_failure_timeout: u64,
pub(crate) metadata_failure_connect: u64,
pub(crate) metadata_failure_no_extension: u64,
pub(crate) metadata_failure_send: u64,
pub(crate) metadata_failure_size_limit: u64,
pub(crate) metadata_failure_sha1: u64,
pub(crate) metadata_failure_parse: u64,
pub(crate) metadata_failure_other: u64,
pub(crate) sample_queue_depth: u64,
pub(crate) sample_queue_capacity: u64,
pub(crate) resident_memory_bytes: Option<u64>,
pub(crate) private_memory_bytes: Option<u64>,
pub(crate) cpu_time_millis: Option<u64>,
pub(crate) thread_count: Option<u64>,
pub(crate) handle_count: Option<u64>,
pub(crate) network_received_bytes: Option<u64>,
pub(crate) network_transmitted_bytes: Option<u64>,
pub(crate) outbox_items: u64,
pub(crate) outbox_bytes: u64,
pub(crate) last_error: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct HeartbeatRequest {
pub(crate) protocol_version: u16,
pub(crate) node_id: String,
pub(crate) applied_revision: u64,
pub(crate) metrics: CollectorMetrics,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct AdmissionRequest {
pub(crate) protocol_version: u16,
pub(crate) node_id: String,
pub(crate) info_hashes: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub(crate) enum AdmissionStatus {
Known,
Granted,
Leased,
Busy,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct AdmissionDecision {
pub(crate) info_hash: String,
pub(crate) status: AdmissionStatus,
pub(crate) lease_token: Option<String>,
pub(crate) expires_at: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct AdmissionResponse {
pub(crate) decisions: Vec<AdmissionDecision>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct MetadataEnvelope {
pub(crate) protocol_version: u16,
pub(crate) node_id: String,
pub(crate) lease_token: Option<String>,
pub(crate) torrent: dht_crawler::TorrentInfo,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub(crate) enum MetadataSubmitStatus {
Inserted,
AlreadyKnown,
Rejected,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct MetadataSubmitResponse {
pub(crate) status: MetadataSubmitStatus,
pub(crate) reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct MetadataBatchRequest {
pub(crate) protocol_version: u16,
pub(crate) node_id: String,
pub(crate) envelopes: Vec<MetadataEnvelope>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct MetadataBatchResponse {
pub(crate) results: Vec<MetadataSubmitResponse>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct VerificationClaimRequest {
pub(crate) protocol_version: u16,
pub(crate) node_id: String,
pub(crate) limit: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct VerificationJob {
pub(crate) info_hash: String,
pub(crate) lease_token: String,
pub(crate) source_peers: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct VerificationClaimResponse {
pub(crate) jobs: Vec<VerificationJob>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub(crate) struct VerificationResultRequest {
pub(crate) protocol_version: u16,
pub(crate) node_id: String,
pub(crate) lease_token: String,
pub(crate) info_hash: String,
pub(crate) result: VerificationResult,
}
#[derive(Debug, Clone, Serialize)]
pub(crate) struct CollectorView {
pub(crate) node_id: String,
pub(crate) name: String,
pub(crate) revision: u64,
pub(crate) applied_revision: u64,
pub(crate) desired: CollectorDesiredConfig,
pub(crate) online: bool,
pub(crate) last_seen: Option<u64>,
pub(crate) metrics: CollectorMetrics,
}
#[derive(Debug, Clone, Deserialize)]
pub(crate) struct CollectorConfigUpdate {
pub(crate) revision: u64,
pub(crate) name: String,
pub(crate) desired: CollectorDesiredConfig,
}