Skip to content

Commit e0c4a00

Browse files
committed
impl: remove KvsPathResolver from GenericKvs
- `Backend` now has built-in `InstanceId`. - Paths can still be accessed by `use ...::KvsPathResolver`.
1 parent 9f37e90 commit e0c4a00

File tree

7 files changed

+236
-336
lines changed

7 files changed

+236
-336
lines changed

src/rust/rust_kvs/src/json_backend.rs

Lines changed: 48 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ impl From<JsonGenerateError> for ErrorCode {
153153

154154
/// KVS backend implementation based on TinyJSON.
155155
pub struct JsonBackend {
156+
instance_id: InstanceId,
156157
working_dir: PathBuf,
157158
}
158159

@@ -173,17 +174,17 @@ impl JsonBackend {
173174
/// # Return Values
174175
/// * Ok: Rotation successful, also if no rotation was needed
175176
/// * `ErrorCode::UnmappedError`: Unmapped error
176-
fn snapshot_rotate(&self, instance_id: &InstanceId) -> Result<(), ErrorCode> {
177+
fn snapshot_rotate(&self) -> Result<(), ErrorCode> {
177178
for idx in (1..=Self::snapshot_max_count()).rev() {
178179
let old_snapshot_id = SnapshotId(idx - 1);
179180
let new_snapshot_id = SnapshotId(idx);
180181

181-
let hash_path_old = self.hash_file_path(instance_id, &old_snapshot_id);
182-
let hash_path_new = self.hash_file_path(instance_id, &new_snapshot_id);
183-
let snap_name_old = self.kvs_file_name(instance_id, &old_snapshot_id);
184-
let snap_path_old = self.kvs_file_path(instance_id, &old_snapshot_id);
185-
let snap_name_new = self.kvs_file_name(instance_id, &new_snapshot_id);
186-
let snap_path_new = self.kvs_file_path(instance_id, &new_snapshot_id);
182+
let hash_path_old = self.hash_file_path(&old_snapshot_id);
183+
let hash_path_new = self.hash_file_path(&new_snapshot_id);
184+
let snap_name_old = self.kvs_file_name(&old_snapshot_id);
185+
let snap_path_old = self.kvs_file_path(&old_snapshot_id);
186+
let snap_name_new = self.kvs_file_name(&new_snapshot_id);
187+
let snap_path_new = self.kvs_file_path(&new_snapshot_id);
187188

188189
println!("rotating: {snap_name_old} -> {snap_name_new}");
189190

@@ -285,40 +286,36 @@ impl JsonBackend {
285286
}
286287

287288
impl KvsBackend for JsonBackend {
288-
fn load_kvs(
289-
&self,
290-
instance_id: &InstanceId,
291-
snapshot_id: &SnapshotId,
292-
) -> Result<KvsMap, ErrorCode> {
293-
let kvs_path = self.kvs_file_path(instance_id, snapshot_id);
294-
let hash_path = self.hash_file_path(instance_id, snapshot_id);
289+
fn load_kvs(&self, snapshot_id: &SnapshotId) -> Result<KvsMap, ErrorCode> {
290+
let kvs_path = self.kvs_file_path(snapshot_id);
291+
let hash_path = self.hash_file_path(snapshot_id);
295292
Self::load(&kvs_path, Some(&hash_path))
296293
}
297294

298-
fn load_defaults(&self, instance_id: &InstanceId) -> Result<KvsMap, ErrorCode> {
299-
let defaults_path = self.defaults_file_path(instance_id);
295+
fn load_defaults(&self) -> Result<KvsMap, ErrorCode> {
296+
let defaults_path = self.defaults_file_path();
300297
Self::load(&defaults_path, None)
301298
}
302299

303-
fn flush(&self, kvs_map: &KvsMap, instance_id: &InstanceId) -> Result<(), ErrorCode> {
300+
fn flush(&self, kvs_map: &KvsMap) -> Result<(), ErrorCode> {
304301
// Rotate previous snapshots.
305-
self.snapshot_rotate(instance_id)?;
302+
self.snapshot_rotate()?;
306303

307304
// Save new snapshot with snapshot ID = 0.
308305
let snapshot_id = SnapshotId(0);
309-
let kvs_path = self.kvs_file_path(instance_id, &snapshot_id);
310-
let hash_path = self.hash_file_path(instance_id, &snapshot_id);
306+
let kvs_path = self.kvs_file_path(&snapshot_id);
307+
let hash_path = self.hash_file_path(&snapshot_id);
311308
Self::save(kvs_map, &kvs_path, Some(&hash_path))?;
312309

313310
Ok(())
314311
}
315312

316-
fn snapshot_count(&self, instance_id: &InstanceId) -> usize {
313+
fn snapshot_count(&self) -> usize {
317314
let mut count = 0;
318315

319316
for idx in 0..Self::snapshot_max_count() {
320317
let snapshot_id = SnapshotId(idx);
321-
let snapshot_path = self.kvs_file_path(instance_id, &snapshot_id);
318+
let snapshot_path = self.kvs_file_path(&snapshot_id);
322319
if !snapshot_path.exists() {
323320
break;
324321
}
@@ -333,59 +330,54 @@ impl KvsBackend for JsonBackend {
333330
KVS_MAX_SNAPSHOTS
334331
}
335332

336-
fn snapshot_restore(
337-
&self,
338-
instance_id: &InstanceId,
339-
snapshot_id: &SnapshotId,
340-
) -> Result<KvsMap, ErrorCode> {
333+
fn snapshot_restore(&self, snapshot_id: &SnapshotId) -> Result<KvsMap, ErrorCode> {
341334
// Fail if given snapshot ID is for current KVS.
342335
if *snapshot_id == SnapshotId(0) {
343336
eprintln!("error: tried to restore current KVS as snapshot");
344337
return Err(ErrorCode::InvalidSnapshotId);
345338
}
346339

347340
// Fail if snapshot doesn't exist.
348-
if self.snapshot_count(instance_id) < snapshot_id.0 {
341+
if self.snapshot_count() < snapshot_id.0 {
349342
eprintln!("error: tried to restore a non-existing snapshot");
350343
return Err(ErrorCode::InvalidSnapshotId);
351344
}
352345

353-
self.load_kvs(instance_id, snapshot_id)
346+
self.load_kvs(snapshot_id)
354347
}
355348
}
356349

357350
/// KVS backend path resolver for `JsonBackend`.
358351
impl KvsPathResolver for JsonBackend {
359-
fn new(working_dir: &Path) -> Self {
352+
fn new(instance_id: InstanceId, working_dir: &Path) -> Self {
360353
Self {
354+
instance_id,
361355
working_dir: working_dir.to_path_buf(),
362356
}
363357
}
364358

365-
fn kvs_file_name(&self, instance_id: &InstanceId, snapshot_id: &SnapshotId) -> String {
366-
format!("kvs_{instance_id}_{snapshot_id}.json")
359+
fn kvs_file_name(&self, snapshot_id: &SnapshotId) -> String {
360+
format!("kvs_{}_{snapshot_id}.json", self.instance_id)
367361
}
368362

369-
fn kvs_file_path(&self, instance_id: &InstanceId, snapshot_id: &SnapshotId) -> PathBuf {
370-
self.working_dir
371-
.join(self.kvs_file_name(instance_id, snapshot_id))
363+
fn kvs_file_path(&self, snapshot_id: &SnapshotId) -> PathBuf {
364+
self.working_dir.join(self.kvs_file_name(snapshot_id))
372365
}
373366

374-
fn hash_file_name(&self, instance_id: &InstanceId, snapshot_id: &SnapshotId) -> String {
375-
format!("kvs_{instance_id}_{snapshot_id}.hash")
367+
fn hash_file_name(&self, snapshot_id: &SnapshotId) -> String {
368+
format!("kvs_{}_{snapshot_id}.hash", self.instance_id)
376369
}
377370

378-
fn hash_file_path(&self, instance_id: &InstanceId, snapshot_id: &SnapshotId) -> PathBuf {
379-
self.working_dir
380-
.join(self.hash_file_name(instance_id, snapshot_id))
371+
fn hash_file_path(&self, snapshot_id: &SnapshotId) -> PathBuf {
372+
self.working_dir.join(self.hash_file_name(snapshot_id))
381373
}
382374

383-
fn defaults_file_name(&self, instance_id: &InstanceId) -> String {
384-
format!("kvs_{instance_id}_default.json")
375+
fn defaults_file_name(&self) -> String {
376+
format!("kvs_{}_default.json", self.instance_id)
385377
}
386378

387-
fn defaults_file_path(&self, instance_id: &InstanceId) -> PathBuf {
388-
self.working_dir.join(self.defaults_file_name(instance_id))
379+
fn defaults_file_path(&self) -> PathBuf {
380+
self.working_dir.join(self.defaults_file_name())
389381
}
390382
}
391383

@@ -1032,9 +1024,9 @@ mod path_resolver_tests {
10321024
fn test_kvs_file_name() {
10331025
let instance_id = InstanceId(123);
10341026
let snapshot_id = SnapshotId(2);
1035-
let backend = JsonBackend::new(&PathBuf::new());
1027+
let backend = JsonBackend::new(instance_id.clone(), &PathBuf::new());
10361028
let exp_name = format!("kvs_{instance_id}_{snapshot_id}.json");
1037-
let act_name = backend.kvs_file_name(&instance_id, &snapshot_id);
1029+
let act_name = backend.kvs_file_name(&snapshot_id);
10381030
assert_eq!(exp_name, act_name);
10391031
}
10401032

@@ -1045,18 +1037,18 @@ mod path_resolver_tests {
10451037

10461038
let instance_id = InstanceId(123);
10471039
let snapshot_id = SnapshotId(2);
1048-
let backend = JsonBackend::new(dir_path);
1040+
let backend = JsonBackend::new(instance_id.clone(), dir_path);
10491041
let exp_name = dir_path.join(format!("kvs_{instance_id}_{snapshot_id}.json"));
1050-
let act_name = backend.kvs_file_path(&instance_id, &snapshot_id);
1042+
let act_name = backend.kvs_file_path(&snapshot_id);
10511043
assert_eq!(exp_name, act_name);
10521044
}
10531045
#[test]
10541046
fn test_hash_file_name() {
10551047
let instance_id = InstanceId(123);
10561048
let snapshot_id = SnapshotId(2);
1057-
let backend = JsonBackend::new(&PathBuf::new());
1049+
let backend = JsonBackend::new(instance_id.clone(), &PathBuf::new());
10581050
let exp_name = format!("kvs_{instance_id}_{snapshot_id}.hash");
1059-
let act_name = backend.hash_file_name(&instance_id, &snapshot_id);
1051+
let act_name = backend.hash_file_name(&snapshot_id);
10601052
assert_eq!(exp_name, act_name);
10611053
}
10621054

@@ -1067,18 +1059,18 @@ mod path_resolver_tests {
10671059

10681060
let instance_id = InstanceId(123);
10691061
let snapshot_id = SnapshotId(2);
1070-
let backend = JsonBackend::new(dir_path);
1062+
let backend = JsonBackend::new(instance_id.clone(), dir_path);
10711063
let exp_name = dir_path.join(format!("kvs_{instance_id}_{snapshot_id}.hash"));
1072-
let act_name = backend.hash_file_path(&instance_id, &snapshot_id);
1064+
let act_name = backend.hash_file_path(&snapshot_id);
10731065
assert_eq!(exp_name, act_name);
10741066
}
10751067

10761068
#[test]
10771069
fn test_defaults_file_name() {
10781070
let instance_id = InstanceId(123);
1079-
let backend = JsonBackend::new(&PathBuf::new());
1071+
let backend = JsonBackend::new(instance_id.clone(), &PathBuf::new());
10801072
let exp_name = format!("kvs_{instance_id}_default.json");
1081-
let act_name = backend.defaults_file_name(&instance_id);
1073+
let act_name = backend.defaults_file_name();
10821074
assert_eq!(exp_name, act_name);
10831075
}
10841076

@@ -1088,9 +1080,9 @@ mod path_resolver_tests {
10881080
let dir_path = dir.path();
10891081

10901082
let instance_id = InstanceId(123);
1091-
let backend = JsonBackend::new(dir_path);
1083+
let backend = JsonBackend::new(instance_id.clone(), dir_path);
10921084
let exp_name = dir_path.join(format!("kvs_{instance_id}_default.json"));
1093-
let act_name = backend.defaults_file_path(&instance_id);
1085+
let act_name = backend.defaults_file_path();
10941086
assert_eq!(exp_name, act_name);
10951087
}
10961088
}

0 commit comments

Comments
 (0)