blob: 586b20fa87450172f44ad670b567806946ceb24d [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
use compio::fs::create_dir;
use iggy::prelude::{Aes256GcmEncryptor, EncryptorKind};
use iggy_common::SemanticVersion;
use server::state::file::FileState;
use server::streaming::persistence::persister::{FileWithSyncPersister, PersisterKind};
use server::streaming::utils::file::overwrite;
use std::str::FromStr;
use std::sync::Arc;
use std::sync::atomic::{AtomicU32, AtomicU64};
use uuid::Uuid;
mod file;
mod system;
pub struct StateSetup {
directory_path: String,
state: FileState,
version: u32,
}
impl StateSetup {
pub async fn init() -> StateSetup {
StateSetup::create(None).await
}
pub async fn init_with_encryptor() -> StateSetup {
StateSetup::create(Some(&[1; 32])).await
}
pub async fn create(encryption_key: Option<&[u8]>) -> StateSetup {
let directory_path = format!("state_{}", Uuid::now_v7().to_u128_le());
let messages_file_path = format!("{directory_path}/log");
create_dir(&directory_path).await.unwrap();
overwrite(&messages_file_path).await.unwrap();
let version = SemanticVersion::from_str("1.2.3").unwrap();
let persister = PersisterKind::FileWithSync(FileWithSyncPersister {});
let encryptor = encryption_key
.map(|key| EncryptorKind::Aes256Gcm(Aes256GcmEncryptor::new(key).unwrap()));
let state_current_index = Arc::new(AtomicU64::new(0));
let state_entries_count = Arc::new(AtomicU64::new(0));
let state_current_leader = Arc::new(AtomicU32::new(0));
let state_term = Arc::new(AtomicU64::new(0));
let state = FileState::new(
&messages_file_path,
&version,
Arc::new(persister),
encryptor,
state_current_index,
state_entries_count,
state_current_leader,
state_term,
);
Self {
directory_path,
state,
version: version.get_numeric_version().unwrap(),
}
}
pub fn state(&self) -> &FileState {
&self.state
}
pub fn version(&self) -> u32 {
self.version
}
}
impl Drop for StateSetup {
fn drop(&mut self) {
std::fs::remove_dir_all(&self.directory_path).unwrap();
}
}