Skip to content

Commit ebea4b4

Browse files
authored
Fix storage metadata (#230)
* Fix deployment ids being different on creation * Allow new staging directory by copying metadata from storage to staging
1 parent 4088961 commit ebea4b4

File tree

2 files changed

+26
-23
lines changed

2 files changed

+26
-23
lines changed

server/src/storage.rs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ pub use object_storage::{ObjectStorage, ObjectStorageProvider};
4444
pub use s3::{S3Config, S3};
4545
pub use store_metadata::StorageMetadata;
4646

47-
use self::store_metadata::{put_staging_metadata, startup_check, EnvChange};
47+
use self::store_metadata::{put_staging_metadata, EnvChange};
4848

4949
/// local sync interval to move data.records to /tmp dir of that stream.
5050
/// 60 sec is a reasonable value.
@@ -124,7 +124,15 @@ impl ObjectStoreFormat {
124124
}
125125

126126
pub async fn resolve_parseable_metadata() -> Result<(), ObjectStorageError> {
127-
let check = startup_check().await?;
127+
let staging_metadata = store_metadata::get_staging_metadata()?;
128+
let storage = CONFIG.storage().get_object_store();
129+
let remote_metadata = storage.get_metadata().await?;
130+
131+
let check = store_metadata::check_metadata_conflict(
132+
staging_metadata.as_ref(),
133+
remote_metadata.as_ref(),
134+
);
135+
128136
const MISMATCH: &str = "Could not start the server because metadata file found in staging directory does not match one in the storage";
129137
let err: Option<&str> = match check {
130138
EnvChange::None => None,
@@ -134,11 +142,15 @@ pub async fn resolve_parseable_metadata() -> Result<(), ObjectStorageError> {
134142
Some("Could not start the server because metadata not found in storage")
135143
}
136144
EnvChange::NewStaging => {
137-
Some("Could not start the server becuase metadata not found in staging")
145+
put_staging_metadata(remote_metadata.as_ref().expect("remote metadata exists"))?;
146+
147+
// allow new staging directories
148+
return Ok(());
138149
}
139150
EnvChange::CreateBoth => {
140-
create_staging_metadata()?;
141-
create_remote_metadata().await?;
151+
let metadata = StorageMetadata::new();
152+
create_remote_metadata(&metadata).await?;
153+
create_staging_metadata(&metadata)?;
142154
None
143155
}
144156
};
@@ -156,15 +168,14 @@ pub async fn resolve_parseable_metadata() -> Result<(), ObjectStorageError> {
156168
}
157169
}
158170

159-
async fn create_remote_metadata() -> Result<(), ObjectStorageError> {
171+
async fn create_remote_metadata(metadata: &StorageMetadata) -> Result<(), ObjectStorageError> {
160172
let client = CONFIG.storage().get_object_store();
161-
client.put_metadata(&StorageMetadata::new()).await
173+
client.put_metadata(metadata).await
162174
}
163175

164-
fn create_staging_metadata() -> std::io::Result<()> {
176+
fn create_staging_metadata(metadata: &StorageMetadata) -> std::io::Result<()> {
165177
create_dir_all(CONFIG.staging_dir())?;
166-
let metadata = StorageMetadata::new();
167-
put_staging_metadata(&metadata)
178+
put_staging_metadata(metadata)
168179
}
169180

170181
lazy_static! {

server/src/storage/store_metadata.rs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use std::io;
2626

2727
use crate::{option::CONFIG, utils::uid};
2828

29-
use super::{object_storage::PARSEABLE_METADATA_FILE_NAME, ObjectStorageError};
29+
use super::object_storage::PARSEABLE_METADATA_FILE_NAME;
3030

3131
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
3232
pub struct StorageMetadata {
@@ -61,17 +61,9 @@ impl StorageMetadata {
6161
}
6262
}
6363

64-
pub async fn startup_check() -> Result<EnvChange, ObjectStorageError> {
65-
let staging_metadata = get_staging_metadata()?;
66-
let storage = CONFIG.storage().get_object_store();
67-
let remote_metadata = storage.get_metadata().await?;
68-
69-
Ok(check_metadata_conflict(staging_metadata, remote_metadata))
70-
}
71-
72-
fn check_metadata_conflict(
73-
staging_metadata: Option<StorageMetadata>,
74-
remote_metadata: Option<StorageMetadata>,
64+
pub fn check_metadata_conflict(
65+
staging_metadata: Option<&StorageMetadata>,
66+
remote_metadata: Option<&StorageMetadata>,
7567
) -> EnvChange {
7668
match (staging_metadata, remote_metadata) {
7769
(Some(staging), Some(remote)) if staging.mode == remote.mode => {
@@ -100,7 +92,7 @@ pub enum EnvChange {
10092
CreateBoth,
10193
}
10294

103-
fn get_staging_metadata() -> io::Result<Option<StorageMetadata>> {
95+
pub fn get_staging_metadata() -> io::Result<Option<StorageMetadata>> {
10496
let path = CONFIG.staging_dir().join(PARSEABLE_METADATA_FILE_NAME);
10597
let bytes = match fs::read(path) {
10698
Ok(bytes) => bytes,

0 commit comments

Comments
 (0)