Skip to content

Commit 056db8c

Browse files
committed
ref(service): Use JSON to encode metadata
1 parent 62b0332 commit 056db8c

File tree

5 files changed

+14
-79
lines changed

5 files changed

+14
-79
lines changed

Cargo.lock

Lines changed: 0 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

objectstore-service/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ publish = false
1313
anyhow = { workspace = true }
1414
async-trait = { workspace = true }
1515
bigtable_rs = "0.2.18"
16-
bincode = { version = "2.0.1", features = ["serde"] }
1716
bytes = { workspace = true }
1817
data-encoding = "2.9.0"
1918
futures-util = { workspace = true }

objectstore-service/src/backend/bigtable.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ use crate::backend::common::{Backend, BackendStream};
1313

1414
/// Connection timeout used for the initial connection to BigQuery.
1515
const CONNECT_TIMEOUT: Duration = Duration::from_secs(10);
16-
/// Config for bincode encoding and decoding.
17-
const BC_CONFIG: bincode::config::Configuration = bincode::config::standard();
1816
/// Time to debounce bumping an object with configured TTI.
1917
const TTI_DEBOUNCE: Duration = Duration::from_secs(24 * 3600); // 1 day
2018

@@ -23,7 +21,7 @@ const REQUEST_RETRY_COUNT: usize = 2;
2321

2422
/// Column that stores the raw payload (compressed).
2523
const COLUMN_PAYLOAD: &[u8] = b"p";
26-
/// Column that stores metadata in bincode.
24+
/// Column that stores metadata in JSON.
2725
const COLUMN_METADATA: &[u8] = b"m";
2826
/// Column family that uses timestamp-based garbage collection.
2927
///
@@ -170,8 +168,7 @@ impl BigTableBackend {
170168
family_name: family.to_owned(),
171169
column_qualifier: COLUMN_METADATA.to_owned(),
172170
timestamp_micros,
173-
// TODO: Do we really want bincode here?
174-
value: bincode::serde::encode_to_vec(metadata, BC_CONFIG)?,
171+
value: serde_json::to_vec(metadata).with_context(|| "failed to encode metadata")?,
175172
}),
176173
];
177174
self.mutate(path, mutations, action).await
@@ -254,7 +251,8 @@ impl Backend for BigTableBackend {
254251
// TODO: Log if the timestamp is invalid.
255252
}
256253
self::COLUMN_METADATA => {
257-
metadata = bincode::serde::decode_from_slice(&cell.value, BC_CONFIG)?.0;
254+
metadata = serde_json::from_slice(&cell.value)
255+
.with_context(|| "failed to decode metadata")?;
258256
}
259257
_ => {
260258
// TODO: Log unknown column

objectstore-service/src/backend/local_fs.rs

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use std::io::ErrorKind;
22
use std::path::{Path, PathBuf};
33
use std::pin::pin;
44

5-
use bincode::error::DecodeError;
65
use futures_util::StreamExt;
76
use objectstore_types::Metadata;
87
use tokio::fs::OpenOptions;
@@ -12,8 +11,6 @@ use tokio_util::io::{ReaderStream, StreamReader};
1211
use crate::ObjectPath;
1312
use crate::backend::common::{Backend, BackendStream};
1413

15-
const BC_CONFIG: bincode::config::Configuration = bincode::config::standard();
16-
1714
#[derive(Debug)]
1815
pub struct LocalFsBackend {
1916
path: PathBuf,
@@ -51,8 +48,9 @@ impl Backend for LocalFsBackend {
5148
let mut reader = pin!(StreamReader::new(stream));
5249
let mut writer = BufWriter::new(file);
5350

54-
let metadata = bincode::serde::encode_to_vec(metadata, BC_CONFIG)?;
55-
writer.write_all(&metadata).await?;
51+
let metadata_json = serde_json::to_string(metadata)?;
52+
writer.write_all(metadata_json.as_bytes()).await?;
53+
writer.write_all(b"\n").await?;
5654

5755
tokio::io::copy(&mut reader, &mut writer).await?;
5856
writer.flush().await?;
@@ -81,36 +79,9 @@ impl Backend for LocalFsBackend {
8179
};
8280

8381
let mut reader = BufReader::new(file);
84-
let mut metadata_buf = vec![];
85-
// TODO populate size in our metadata
86-
let metadata = loop {
87-
let reader_buf = reader.fill_buf().await?;
88-
let buf = if metadata_buf.is_empty() {
89-
reader_buf
90-
} else {
91-
metadata_buf.extend_from_slice(reader_buf);
92-
&metadata_buf
93-
};
94-
95-
match bincode::serde::decode_from_slice(buf, BC_CONFIG) {
96-
Ok((metadata, read)) => {
97-
let read = if metadata_buf.is_empty() {
98-
read
99-
} else {
100-
let prev_consumed = metadata_buf.len() - reader_buf.len();
101-
read - prev_consumed
102-
};
103-
reader.consume(read);
104-
break metadata;
105-
}
106-
Err(DecodeError::UnexpectedEnd { .. }) => {
107-
metadata_buf.extend_from_slice(reader_buf);
108-
let len = reader_buf.len();
109-
reader.consume(len);
110-
}
111-
Err(err) => Err(err)?,
112-
}
113-
};
82+
let mut metadata_line = String::new();
83+
reader.read_line(&mut metadata_line).await?;
84+
let metadata: Metadata = serde_json::from_str(metadata_line.trim_end())?;
11485

11586
let stream = ReaderStream::new(reader);
11687
Ok(Some((metadata, stream.boxed())))

objectstore-types/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,22 +148,22 @@ impl FromStr for Compression {
148148
#[serde(default)]
149149
pub struct Metadata {
150150
/// The expiration policy of the object.
151-
// #[serde(skip_serializing_if = "ExpirationPolicy::is_manual")]
151+
#[serde(skip_serializing_if = "ExpirationPolicy::is_manual")]
152152
pub expiration_policy: ExpirationPolicy,
153153

154154
/// The content type of the object, if known.
155155
pub content_type: Cow<'static, str>,
156156

157157
/// The compression algorithm used for this object, if any.
158-
// #[serde(skip_serializing_if = "Option::is_none")]
158+
#[serde(skip_serializing_if = "Option::is_none")]
159159
pub compression: Option<Compression>,
160160

161161
/// Size of the data in bytes, if known.
162-
// #[serde(skip_serializing_if = "Option::is_none")]
162+
#[serde(skip_serializing_if = "Option::is_none")]
163163
pub size: Option<usize>,
164164

165165
/// Some arbitrary user-provided metadata.
166-
// #[serde(skip_serializing_if = "BTreeMap::is_empty")]
166+
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
167167
pub custom: BTreeMap<String, String>,
168168
}
169169

0 commit comments

Comments
 (0)