diff options
author | Alex Auvolat <alex@adnab.me> | 2021-05-28 12:36:22 +0200 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2021-05-28 14:07:36 +0200 |
commit | b490ebc7f6058719bd22c86fd0db95b09dc027d6 (patch) | |
tree | e1c59ce1c348c2c63e1b2604369997216ef554d1 /src/model | |
parent | c8aa1eb481c18b1a35ef45d37071ab1af804a382 (diff) | |
download | garage-b490ebc7f6058719bd22c86fd0db95b09dc027d6.tar.gz garage-b490ebc7f6058719bd22c86fd0db95b09dc027d6.zip |
Many improvements on ring/replication and its configuration:
- Explicit "replication_mode" configuration parameters that takes
either "none", "2" or "3" as values, instead of letting user configure
replication factor themselves. These are presets whose corresponding
replication/quorum values can be found in replication/mode.rs
- Explicit support for single-node and two-node deployments
(number of nodes must be at least "replication_mode", with "none"
we can have only one node)
- Ring is now stored much more compactly with 256*8 + n*32 bytes,
instead of 256*32 bytes
- Support for gateway-only nodes that do not store data
(these nodes still need a metadata_directory to store the list
of bucket and keys since those are stored on all nodes; it also
technically needs a data_directory to start but it will stay
empty unless we have bugs)
Diffstat (limited to 'src/model')
-rw-r--r-- | src/model/garage.rs | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/model/garage.rs b/src/model/garage.rs index 5c6c21f2..c3594934 100644 --- a/src/model/garage.rs +++ b/src/model/garage.rs @@ -7,6 +7,7 @@ use garage_rpc::membership::System; use garage_rpc::rpc_client::RpcHttpClient; use garage_rpc::rpc_server::RpcServer; +use garage_table::replication::ReplicationMode; use garage_table::replication::TableFullReplication; use garage_table::replication::TableShardedReplication; use garage_table::*; @@ -50,6 +51,9 @@ impl Garage { background: Arc<BackgroundRunner>, rpc_server: &mut RpcServer, ) -> Arc<Self> { + let replication_mode = ReplicationMode::parse(&config.replication_mode) + .expect("Invalid replication_mode in config file."); + info!("Initialize membership management system..."); let rpc_http_client = Arc::new( RpcHttpClient::new(config.max_concurrent_rpc_requests, &config.rpc_tls) @@ -60,32 +64,33 @@ impl Garage { rpc_http_client, background.clone(), rpc_server, + replication_mode.replication_factor(), ); let data_rep_param = TableShardedReplication { system: system.clone(), - replication_factor: config.data_replication_factor, - write_quorum: (config.data_replication_factor + 1) / 2, + replication_factor: replication_mode.replication_factor(), + write_quorum: replication_mode.write_quorum(), read_quorum: 1, }; let meta_rep_param = TableShardedReplication { system: system.clone(), - replication_factor: config.meta_replication_factor, - write_quorum: (config.meta_replication_factor + 1) / 2, - read_quorum: (config.meta_replication_factor + 1) / 2, + replication_factor: replication_mode.replication_factor(), + write_quorum: replication_mode.write_quorum(), + read_quorum: replication_mode.read_quorum(), }; let control_rep_param = TableFullReplication { system: system.clone(), - max_faults: config.control_write_max_faults, + max_faults: replication_mode.control_write_max_faults(), }; info!("Initialize block manager..."); let block_manager = BlockManager::new( &db, config.data_dir.clone(), - data_rep_param.clone(), + data_rep_param, system.clone(), rpc_server, ); @@ -95,7 +100,7 @@ impl Garage { BlockRefTable { block_manager: block_manager.clone(), }, - data_rep_param, + meta_rep_param.clone(), system.clone(), &db, "block_ref".to_string(), |