155 lines
3.9 KiB
Rust
155 lines
3.9 KiB
Rust
|
// src/common/protocol.rs
|
|||
|
//! Протокол обмена данными для Falcot
|
|||
|
//!
|
|||
|
//! Определяет структуры команд и ответов для взаимодействия между
|
|||
|
//! компонентами системы с использованием wait-free сериализации.
|
|||
|
|
|||
|
#![allow(dead_code)]
|
|||
|
|
|||
|
use serde::{Deserialize, Serialize};
|
|||
|
use crate::server::database::Index;
|
|||
|
|
|||
|
/// Команды для выполнения в базе данных
|
|||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|||
|
pub enum Command {
|
|||
|
Create {
|
|||
|
collection: String,
|
|||
|
document: Vec<u8>,
|
|||
|
},
|
|||
|
Read {
|
|||
|
collection: String,
|
|||
|
id: String,
|
|||
|
},
|
|||
|
Update {
|
|||
|
collection: String,
|
|||
|
id: String,
|
|||
|
document: Vec<u8>,
|
|||
|
},
|
|||
|
Delete {
|
|||
|
collection: String,
|
|||
|
id: String,
|
|||
|
},
|
|||
|
Query {
|
|||
|
collection: String,
|
|||
|
filter: Vec<u8>,
|
|||
|
},
|
|||
|
CreateProcedure {
|
|||
|
name: String,
|
|||
|
code: Vec<u8>,
|
|||
|
},
|
|||
|
CallProcedure {
|
|||
|
name: String,
|
|||
|
},
|
|||
|
BeginTransaction {
|
|||
|
transaction_id: String,
|
|||
|
},
|
|||
|
CommitTransaction {
|
|||
|
transaction_id: String,
|
|||
|
},
|
|||
|
RollbackTransaction {
|
|||
|
transaction_id: String,
|
|||
|
},
|
|||
|
CreateIndex {
|
|||
|
collection: String,
|
|||
|
index: Index,
|
|||
|
},
|
|||
|
QueryByIndex {
|
|||
|
collection: String,
|
|||
|
index_name: String,
|
|||
|
value: Vec<u8>,
|
|||
|
},
|
|||
|
// Новые команды для шардинга
|
|||
|
AddShardNode {
|
|||
|
node_id: String,
|
|||
|
address: String,
|
|||
|
capacity: u64,
|
|||
|
},
|
|||
|
RemoveShardNode {
|
|||
|
node_id: String,
|
|||
|
},
|
|||
|
MigrateShard {
|
|||
|
collection: String,
|
|||
|
from_node: String,
|
|||
|
to_node: String,
|
|||
|
shard_key: String,
|
|||
|
},
|
|||
|
RebalanceCluster,
|
|||
|
GetClusterStatus,
|
|||
|
// Команды для constraints
|
|||
|
AddConstraint {
|
|||
|
collection: String,
|
|||
|
constraint_name: String,
|
|||
|
constraint_type: String,
|
|||
|
field: String,
|
|||
|
value: Vec<u8>,
|
|||
|
},
|
|||
|
RemoveConstraint {
|
|||
|
collection: String,
|
|||
|
constraint_name: String,
|
|||
|
},
|
|||
|
// Команды для компрессии
|
|||
|
EnableCompression {
|
|||
|
collection: String,
|
|||
|
algorithm: String,
|
|||
|
},
|
|||
|
DisableCompression {
|
|||
|
collection: String,
|
|||
|
},
|
|||
|
// Команды для глобальных индексов
|
|||
|
CreateGlobalIndex {
|
|||
|
name: String,
|
|||
|
field: String,
|
|||
|
unique: bool,
|
|||
|
},
|
|||
|
QueryGlobalIndex {
|
|||
|
index_name: String,
|
|||
|
value: Vec<u8>,
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
/// Ответы от базы данных
|
|||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|||
|
pub enum Response {
|
|||
|
Success(Vec<u8>),
|
|||
|
Error(String),
|
|||
|
}
|
|||
|
|
|||
|
/// Сообщение для репликации
|
|||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|||
|
pub struct ReplicationMessage {
|
|||
|
pub sequence: u64,
|
|||
|
pub command: Command,
|
|||
|
pub timestamp: i64,
|
|||
|
}
|
|||
|
|
|||
|
/// Структура для информации о шарде
|
|||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|||
|
pub struct ShardInfo {
|
|||
|
pub node_id: String,
|
|||
|
pub address: String,
|
|||
|
pub capacity: u64,
|
|||
|
pub used: u64,
|
|||
|
pub collections: Vec<String>,
|
|||
|
}
|
|||
|
|
|||
|
/// Структура для статуса кластера
|
|||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|||
|
pub struct ClusterStatus {
|
|||
|
pub nodes: Vec<ShardInfo>,
|
|||
|
pub total_capacity: u64,
|
|||
|
pub total_used: u64,
|
|||
|
pub rebalance_needed: bool,
|
|||
|
}
|
|||
|
|
|||
|
/// Wait-Free сериализация сообщений
|
|||
|
pub fn serialize<T: serde::Serialize>(value: &T) -> crate::common::error::Result<Vec<u8>> {
|
|||
|
rmp_serde::to_vec(value)
|
|||
|
.map_err(|e| crate::common::error::FalcotError::SerializationError(e.to_string()))
|
|||
|
}
|
|||
|
|
|||
|
/// Wait-Free десериализация сообщений
|
|||
|
pub fn deserialize<'a, T: serde::Deserialize<'a>>(bytes: &'a [u8]) -> crate::common::error::Result<T> {
|
|||
|
rmp_serde::from_slice(bytes)
|
|||
|
.map_err(|e| crate::common::error::FalcotError::SerializationError(e.to_string()))
|
|||
|
}
|