summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/obnam-server.rs4
-rw-r--r--src/chunk.rs4
-rw-r--r--src/chunkmeta.rs37
-rw-r--r--src/client.rs2
-rw-r--r--src/index.rs14
-rw-r--r--src/indexedstore.rs6
6 files changed, 36 insertions, 31 deletions
diff --git a/src/bin/obnam-server.rs b/src/bin/obnam-server.rs
index f06b7b5..0b80854 100644
--- a/src/bin/obnam-server.rs
+++ b/src/bin/obnam-server.rs
@@ -155,8 +155,8 @@ pub async fn search_chunks(
}
if key == "generation" && value == "true" {
store.find_generations().expect("SQL lookup failed")
- } else if key == "sha256" {
- store.find_by_sha256(value).expect("SQL lookup failed")
+ } else if key == "label" {
+ store.find_by_label(value).expect("SQL lookup failed")
} else {
error!("unknown search key {:?}", key);
return Ok(ChunkResult::BadRequest);
diff --git a/src/chunk.rs b/src/chunk.rs
index 15e3288..a37aa57 100644
--- a/src/chunk.rs
+++ b/src/chunk.rs
@@ -97,8 +97,8 @@ impl GenerationChunk {
let json: String =
serde_json::to_string(self).map_err(GenerationChunkError::JsonGenerate)?;
let bytes = json.as_bytes().to_vec();
- let sha = Checksum::sha256(&bytes);
- let meta = ChunkMeta::new_generation(&sha, ended);
+ let checksum = Checksum::sha256(&bytes);
+ let meta = ChunkMeta::new_generation(&checksum, ended);
Ok(DataChunk::new(bytes, meta))
}
}
diff --git a/src/chunkmeta.rs b/src/chunkmeta.rs
index 06a187b..9a435fe 100644
--- a/src/chunkmeta.rs
+++ b/src/chunkmeta.rs
@@ -10,7 +10,8 @@ use std::str::FromStr;
/// We manage three bits of metadata about chunks, in addition to its
/// identifier:
///
-/// * for all chunks, a [SHA256][] checksum of the chunk content
+/// * for all chunks, a [SHA256][] checksum of the chunk content; we
+/// expose this to the server as the chunk "label"
///
/// * for generation chunks, an indication that it is a generation
/// chunk, and a timestamp for when making the generation snapshot
@@ -23,7 +24,7 @@ use std::str::FromStr;
///
/// ~~~json
/// {
-/// "sha256": "09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b",
+/// "label": "09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b",
/// "generation": true,
/// "ended": "2020-09-17T08:17:13+03:00"
/// }
@@ -40,7 +41,7 @@ use std::str::FromStr;
/// [SHA256]: https://en.wikipedia.org/wiki/SHA-2
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct ChunkMeta {
- sha256: String,
+ label: String,
// The remaining fields are Options so that JSON parsing doesn't
// insist on them being there in the textual representation.
generation: Option<bool>,
@@ -51,18 +52,18 @@ impl ChunkMeta {
/// Create a new data chunk.
///
/// Data chunks are not for generations.
- pub fn new(sha256: &Checksum) -> Self {
+ pub fn new(checksum: &Checksum) -> Self {
ChunkMeta {
- sha256: sha256.to_string(),
+ label: checksum.to_string(),
generation: None,
ended: None,
}
}
/// Create a new generation chunk.
- pub fn new_generation(sha256: &Checksum, ended: &str) -> Self {
+ pub fn new_generation(checksum: &Checksum, ended: &str) -> Self {
ChunkMeta {
- sha256: sha256.to_string(),
+ label: checksum.to_string(),
generation: Some(true),
ended: Some(ended.to_string()),
}
@@ -78,9 +79,13 @@ impl ChunkMeta {
self.ended.as_deref()
}
- /// SHA256 checksum of the content of the chunk.
- pub fn sha256(&self) -> &str {
- &self.sha256
+ /// The label of the content of the chunk.
+ ///
+ /// The caller should not interpret the label in any way. It
+ /// happens to be a SHA256 of the cleartext contents of the
+ /// checksum for now, but that _will_ change in the future.
+ pub fn label(&self) -> &str {
+ &self.label
}
/// Serialize from a textual JSON representation.
@@ -118,7 +123,7 @@ mod test {
let meta = ChunkMeta::new(&sum);
assert!(!meta.is_generation());
assert_eq!(meta.ended(), None);
- assert_eq!(meta.sha256(), "abcdef");
+ assert_eq!(meta.label(), "abcdef");
}
#[test]
@@ -127,26 +132,26 @@ mod test {
let meta = ChunkMeta::new_generation(&sum, "2020-09-17T08:17:13+03:00");
assert!(meta.is_generation());
assert_eq!(meta.ended(), Some("2020-09-17T08:17:13+03:00"));
- assert_eq!(meta.sha256(), "abcdef");
+ assert_eq!(meta.label(), "abcdef");
}
#[test]
fn data_chunk_from_json() {
- let meta: ChunkMeta = r#"{"sha256": "abcdef"}"#.parse().unwrap();
+ let meta: ChunkMeta = r#"{"label": "abcdef"}"#.parse().unwrap();
assert!(!meta.is_generation());
assert_eq!(meta.ended(), None);
- assert_eq!(meta.sha256(), "abcdef");
+ assert_eq!(meta.label(), "abcdef");
}
#[test]
fn generation_chunk_from_json() {
let meta: ChunkMeta =
- r#"{"sha256": "abcdef", "generation": true, "ended": "2020-09-17T08:17:13+03:00"}"#
+ r#"{"label": "abcdef", "generation": true, "ended": "2020-09-17T08:17:13+03:00"}"#
.parse()
.unwrap();
assert!(meta.is_generation());
assert_eq!(meta.ended(), Some("2020-09-17T08:17:13+03:00"));
- assert_eq!(meta.sha256(), "abcdef");
+ assert_eq!(meta.label(), "abcdef");
}
#[test]
diff --git a/src/client.rs b/src/client.rs
index bcc31b4..b58f89c 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -130,7 +130,7 @@ impl BackupClient {
/// Does the server have a chunk?
pub async fn has_chunk(&self, meta: &ChunkMeta) -> Result<Option<ChunkId>, ClientError> {
- let body = match self.get("", &[("sha256", meta.sha256())]).await {
+ let body = match self.get("", &[("label", meta.label())]).await {
Ok((_, body)) => body,
Err(err) => return Err(err),
};
diff --git a/src/index.rs b/src/index.rs
index b9d29a2..4a1b9c9 100644
--- a/src/index.rs
+++ b/src/index.rs
@@ -61,8 +61,8 @@ impl Index {
sql::remove(&self.conn, id)
}
- /// Find chunks with a given checksum.
- pub fn find_by_sha256(&self, sha256: &str) -> Result<Vec<ChunkId>, IndexError> {
+ /// Find chunks with a client-assigned label.
+ pub fn find_by_label(&self, sha256: &str) -> Result<Vec<ChunkId>, IndexError> {
sql::find_by_256(&self.conn, sha256)
}
@@ -98,7 +98,7 @@ mod test {
let mut idx = new_index(dir.path());
idx.insert_meta(id.clone(), meta.clone()).unwrap();
assert_eq!(idx.get_meta(&id).unwrap(), meta);
- let ids = idx.find_by_sha256("abc").unwrap();
+ let ids = idx.find_by_label("abc").unwrap();
assert_eq!(ids, vec![id]);
}
@@ -110,7 +110,7 @@ mod test {
let dir = tempdir().unwrap();
let mut idx = new_index(dir.path());
idx.insert_meta(id, meta).unwrap();
- assert_eq!(idx.find_by_sha256("def").unwrap().len(), 0)
+ assert_eq!(idx.find_by_label("def").unwrap().len(), 0)
}
#[test]
@@ -122,7 +122,7 @@ mod test {
let mut idx = new_index(dir.path());
idx.insert_meta(id.clone(), meta).unwrap();
idx.remove_meta(&id).unwrap();
- let ids: Vec<ChunkId> = idx.find_by_sha256("abc").unwrap();
+ let ids: Vec<ChunkId> = idx.find_by_label("abc").unwrap();
assert_eq!(ids, vec![]);
}
@@ -193,12 +193,12 @@ mod sql {
/// Insert a new chunk's metadata into database.
pub fn insert(t: &Transaction, chunkid: &ChunkId, meta: &ChunkMeta) -> Result<(), IndexError> {
let chunkid = format!("{}", chunkid);
- let sha256 = meta.sha256();
+ let label = meta.label();
let generation = if meta.is_generation() { 1 } else { 0 };
let ended = meta.ended();
t.execute(
"INSERT INTO chunks (id, sha256, generation, ended) VALUES (?1, ?2, ?3, ?4)",
- params![chunkid, sha256, generation, ended],
+ params![chunkid, label, generation, ended],
)?;
Ok(())
}
diff --git a/src/indexedstore.rs b/src/indexedstore.rs
index 49953ee..46f9e72 100644
--- a/src/indexedstore.rs
+++ b/src/indexedstore.rs
@@ -63,9 +63,9 @@ impl IndexedStore {
Ok(self.index.get_meta(id)?)
}
- /// Find chunks with a given checksum.
- pub fn find_by_sha256(&self, sha256: &str) -> Result<Vec<ChunkId>, IndexedError> {
- Ok(self.index.find_by_sha256(sha256)?)
+ /// Find chunks with a client-assigned label.
+ pub fn find_by_label(&self, label: &str) -> Result<Vec<ChunkId>, IndexedError> {
+ Ok(self.index.find_by_label(label)?)
}
/// Find all generations.