diff --git a/src/service.rs b/src/service.rs index c514449..75808f8 100644 --- a/src/service.rs +++ b/src/service.rs @@ -8,10 +8,10 @@ mod objectstore; mod oc; mod office; mod onlyoffice; +mod partitioning; mod push; -mod sftp; -// mod sharding; mod redis; +mod sftp; mod sharded; mod smb; mod webhook; @@ -28,6 +28,7 @@ pub use crate::service::objectstore::ObjectStore; use crate::service::oc::Oc; pub use crate::service::office::Office; pub use crate::service::onlyoffice::OnlyOffice; +use crate::service::partitioning::Partitioning; pub use crate::service::push::NotifyPush; use crate::service::redis::Redis; use crate::service::sftp::{Sftp, SftpKey}; @@ -311,6 +312,8 @@ pub enum ServiceType { FrankenPhp, /// Webhook test listener Webhook, + /// Enable DB partitioning for mariadb + Partitioning, } #[enum_dispatch] @@ -328,6 +331,7 @@ pub enum Service { SingleShard(SingleShard), ShardingMigrate(ShardingMigrate), ShardingMigrateUnset(ShardingMigrateUnset), + Partitioning(Partitioning), Sftp(Sftp), SftpKey(SftpKey), Kaspersky(Kaspersky), @@ -371,6 +375,7 @@ impl Service { ServiceType::ShardingMigrateUnset => { Some(vec![Service::ShardingMigrateUnset(ShardingMigrateUnset)]) } + ServiceType::Partitioning => Some(vec![Service::Partitioning(Partitioning)]), ServiceType::Dav => Some(vec![Service::Dav(Dav)]), ServiceType::Sftp => Some(vec![Service::Sftp(Sftp)]), ServiceType::SftpKey => Some(vec![Service::SftpKey(SftpKey)]), diff --git a/src/service/partitioning.rs b/src/service/partitioning.rs new file mode 100644 index 0000000..f8f20b5 --- /dev/null +++ b/src/service/partitioning.rs @@ -0,0 +1,60 @@ +use std::io::stdout; + +use crate::cloud::CloudOptions; +use crate::config::HazeConfig; +use crate::database::DatabaseFamily; +use crate::exec::exec; +use crate::service::ServiceTrait; +use crate::Result; +use bollard::Docker; +use miette::Report; + +#[derive(Debug, Clone, Eq, PartialEq)] +pub struct Partitioning; + +#[async_trait::async_trait] +impl ServiceTrait for Partitioning { + fn name(&self) -> &str { + "partitioning" + } + + async fn spawn( + &self, + _docker: &Docker, + _cloud_id: &str, + _network: &str, + _config: &HazeConfig, + options: &CloudOptions, + ) -> Result> { + if options.db.family() != DatabaseFamily::MariaDB { + return Err(Report::msg("Partitioning is only supported with mariadb")); + } + + Ok(Vec::new()) + } + + async fn post_setup( + &self, + docker: &Docker, + cloud_id: &str, + _config: &HazeConfig, + ) -> Result>> { + let db = format!("{cloud_id}-db"); + let queries = &[ + "alter table oc_filecache drop primary key, add primary key (fileid, storage)", + "alter table oc_filecache partition by hash(storage) partitions 5", + ]; + for query in queries { + exec( + docker, + &db, + "root", + vec!["mariadb", "-u", "haze", "-phaze", "haze", "-e", query], + Vec::::new(), + Some(stdout()), + ) + .await?; + } + Ok(Vec::new()) + } +}