rename taskstorage to storage

This commit is contained in:
Dustin J. Mitchell 2021-01-10 21:11:55 -05:00
parent a318ceebe2
commit 15ffc62279
10 changed files with 32 additions and 36 deletions

View file

@ -1,9 +1,9 @@
use std::io; use std::io;
use taskchampion::{server, taskstorage, Replica, ServerConfig}; use taskchampion::{server, storage, Replica, ServerConfig};
use tempdir::TempDir; use tempdir::TempDir;
pub(super) fn test_replica() -> Replica { pub(super) fn test_replica() -> Replica {
let storage = taskstorage::InMemoryStorage::new(); let storage = storage::InMemoryStorage::new();
Replica::new(Box::new(storage)) Replica::new(Box::new(storage))
} }

View file

@ -1,7 +1,7 @@
# Replica Storage # Replica Storage
Each replica has a storage backend. Each replica has a storage backend.
The interface for this backend is given in `crate::taskstorage::TaskStorage` and `TaskStorageTxn`. The interface for this backend is given in `crate::taskstorage::Storage` and `StorageTxn`.
The storage is transaction-protected, with the expectation of a serializable isolation level. The storage is transaction-protected, with the expectation of a serializable isolation level.
The storage contains the following information: The storage contains the following information:

View file

@ -9,7 +9,7 @@ synchronize with one another.
# Task Storage # Task Storage
The [`taskstorage`](crate::taskstorage) module supports pluggable storage for a replica's data. The [`storage`](crate::storage) module supports pluggable storage for a replica's data.
An implementation is provided, but users of this crate can provide their own implementation as well. An implementation is provided, but users of this crate can provide their own implementation as well.
# Server # Server
@ -30,7 +30,7 @@ mod replica;
pub mod server; pub mod server;
mod task; mod task;
mod taskdb; mod taskdb;
pub mod taskstorage; pub mod storage;
mod utils; mod utils;
mod workingset; mod workingset;

View file

@ -3,7 +3,7 @@ use crate::errors::Error;
use crate::server::Server; use crate::server::Server;
use crate::task::{Status, Task}; use crate::task::{Status, Task};
use crate::taskdb::TaskDB; use crate::taskdb::TaskDB;
use crate::taskstorage::{KVStorage, Operation, TaskMap, TaskStorage}; use crate::storage::{KVStorage, Operation, TaskMap, Storage};
use crate::workingset::WorkingSet; use crate::workingset::WorkingSet;
use chrono::Utc; use chrono::Utc;
use failure::Fallible; use failure::Fallible;
@ -30,7 +30,7 @@ pub struct Replica {
} }
impl Replica { impl Replica {
pub fn new(storage: Box<dyn TaskStorage>) -> Replica { pub fn new(storage: Box<dyn Storage>) -> Replica {
Replica { Replica {
taskdb: TaskDB::new(storage), taskdb: TaskDB::new(storage),
} }
@ -45,7 +45,7 @@ impl Replica {
#[cfg(test)] #[cfg(test)]
pub fn new_inmemory() -> Replica { pub fn new_inmemory() -> Replica {
Replica::new(Box::new(crate::taskstorage::InMemoryStorage::new())) Replica::new(Box::new(crate::storage::InMemoryStorage::new()))
} }
/// Update an existing task. If the value is Some, the property is added or updated. If the /// Update an existing task. If the value is Some, the property is added or updated. If the

View file

@ -1,8 +1,6 @@
#![allow(clippy::new_without_default)] #![allow(clippy::new_without_default)]
use crate::taskstorage::{ use crate::storage::{Operation, Storage, StorageTxn, TaskMap, VersionId, DEFAULT_BASE_VERSION};
Operation, TaskMap, TaskStorage, TaskStorageTxn, VersionId, DEFAULT_BASE_VERSION,
};
use failure::{bail, Fallible}; use failure::{bail, Fallible};
use std::collections::hash_map::Entry; use std::collections::hash_map::Entry;
use std::collections::HashMap; use std::collections::HashMap;
@ -42,7 +40,7 @@ impl<'t> Txn<'t> {
} }
} }
impl<'t> TaskStorageTxn for Txn<'t> { impl<'t> StorageTxn for Txn<'t> {
fn get_task(&mut self, uuid: Uuid) -> Fallible<Option<TaskMap>> { fn get_task(&mut self, uuid: Uuid) -> Fallible<Option<TaskMap>> {
match self.data_ref().tasks.get(&uuid) { match self.data_ref().tasks.get(&uuid) {
None => Ok(None), None => Ok(None),
@ -157,8 +155,8 @@ impl InMemoryStorage {
} }
} }
impl TaskStorage for InMemoryStorage { impl Storage for InMemoryStorage {
fn txn<'a>(&'a mut self) -> Fallible<Box<dyn TaskStorageTxn + 'a>> { fn txn<'a>(&'a mut self) -> Fallible<Box<dyn StorageTxn + 'a>> {
Ok(Box::new(Txn { Ok(Box::new(Txn {
storage: self, storage: self,
new_data: None, new_data: None,

View file

@ -1,6 +1,4 @@
use crate::taskstorage::{ use crate::storage::{Operation, Storage, StorageTxn, TaskMap, VersionId, DEFAULT_BASE_VERSION};
Operation, TaskMap, TaskStorage, TaskStorageTxn, VersionId, DEFAULT_BASE_VERSION,
};
use crate::utils::Key; use crate::utils::Key;
use failure::{bail, Fallible}; use failure::{bail, Fallible};
use kv::msgpack::Msgpack; use kv::msgpack::Msgpack;
@ -62,8 +60,8 @@ impl<'t> KVStorage<'t> {
} }
} }
impl<'t> TaskStorage for KVStorage<'t> { impl<'t> Storage for KVStorage<'t> {
fn txn<'a>(&'a mut self) -> Fallible<Box<dyn TaskStorageTxn + 'a>> { fn txn<'a>(&'a mut self) -> Fallible<Box<dyn StorageTxn + 'a>> {
Ok(Box::new(Txn { Ok(Box::new(Txn {
storage: self, storage: self,
txn: Some(self.store.write_txn()?), txn: Some(self.store.write_txn()?),
@ -104,7 +102,7 @@ impl<'t> Txn<'t> {
} }
} }
impl<'t> TaskStorageTxn for Txn<'t> { impl<'t> StorageTxn for Txn<'t> {
fn get_task(&mut self, uuid: Uuid) -> Fallible<Option<TaskMap>> { fn get_task(&mut self, uuid: Uuid) -> Fallible<Option<TaskMap>> {
let bucket = self.tasks_bucket(); let bucket = self.tasks_bucket();
let buf = match self.kvtxn().get(bucket, uuid.into()) { let buf = match self.kvtxn().get(bucket, uuid.into()) {
@ -356,7 +354,7 @@ impl<'t> TaskStorageTxn for Txn<'t> {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;
use crate::taskstorage::taskmap_with; use crate::storage::taskmap_with;
use failure::Fallible; use failure::Fallible;
use tempdir::TempDir; use tempdir::TempDir;

View file

@ -29,7 +29,7 @@ pub use crate::server::VersionId;
/// The default for base_version. /// The default for base_version.
pub(crate) const DEFAULT_BASE_VERSION: Uuid = crate::server::NO_VERSION_ID; pub(crate) const DEFAULT_BASE_VERSION: Uuid = crate::server::NO_VERSION_ID;
/// A TaskStorage transaction, in which storage operations are performed. /// A Storage transaction, in which storage operations are performed.
/// ///
/// # Concurrency /// # Concurrency
/// ///
@ -40,9 +40,9 @@ pub(crate) const DEFAULT_BASE_VERSION: Uuid = crate::server::NO_VERSION_ID;
/// # Commiting and Aborting /// # Commiting and Aborting
/// ///
/// A transaction is not visible to other readers until it is committed with /// A transaction is not visible to other readers until it is committed with
/// [`crate::taskstorage::TaskStorageTxn::commit`]. Transactions are aborted if they are dropped. /// [`crate::storage::StorageTxn::commit`]. Transactions are aborted if they are dropped.
/// It is safe and performant to drop transactions that did not modify any data without committing. /// It is safe and performant to drop transactions that did not modify any data without committing.
pub trait TaskStorageTxn { pub trait StorageTxn {
/// Get an (immutable) task, if it is in the storage /// Get an (immutable) task, if it is in the storage
fn get_task(&mut self, uuid: Uuid) -> Fallible<Option<TaskMap>>; fn get_task(&mut self, uuid: Uuid) -> Fallible<Option<TaskMap>>;
@ -102,8 +102,8 @@ pub trait TaskStorageTxn {
} }
/// A trait for objects able to act as task storage. Most of the interesting behavior is in the /// A trait for objects able to act as task storage. Most of the interesting behavior is in the
/// [`crate::taskstorage::TaskStorageTxn`] trait. /// [`crate::storage::StorageTxn`] trait.
pub trait TaskStorage { pub trait Storage {
/// Begin a transaction /// Begin a transaction
fn txn<'a>(&'a mut self) -> Fallible<Box<dyn TaskStorageTxn + 'a>>; fn txn<'a>(&'a mut self) -> Fallible<Box<dyn StorageTxn + 'a>>;
} }

View file

@ -125,8 +125,8 @@ impl Operation {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;
use crate::storage::InMemoryStorage;
use crate::taskdb::TaskDB; use crate::taskdb::TaskDB;
use crate::taskstorage::InMemoryStorage;
use chrono::{Duration, Utc}; use chrono::{Duration, Utc};
use proptest::prelude::*; use proptest::prelude::*;

View file

@ -1,5 +1,5 @@
use crate::replica::Replica; use crate::replica::Replica;
use crate::taskstorage::TaskMap; use crate::storage::TaskMap;
use chrono::prelude::*; use chrono::prelude::*;
use failure::{format_err, Fallible}; use failure::{format_err, Fallible};
use log::trace; use log::trace;

View file

@ -1,6 +1,6 @@
use crate::errors::Error; use crate::errors::Error;
use crate::server::{AddVersionResult, GetVersionResult, Server}; use crate::server::{AddVersionResult, GetVersionResult, Server};
use crate::taskstorage::{Operation, TaskMap, TaskStorage, TaskStorageTxn}; use crate::storage::{Operation, Storage, StorageTxn, TaskMap};
use failure::{format_err, Fallible}; use failure::{format_err, Fallible};
use log::{info, trace, warn}; use log::{info, trace, warn};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -12,7 +12,7 @@ use uuid::Uuid;
/// and so on, and all the invariants that come with it. It leaves the meaning of particular task /// and so on, and all the invariants that come with it. It leaves the meaning of particular task
/// properties to the replica and task implementations. /// properties to the replica and task implementations.
pub struct TaskDB { pub struct TaskDB {
storage: Box<dyn TaskStorage>, storage: Box<dyn Storage>,
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
@ -22,13 +22,13 @@ struct Version {
impl TaskDB { impl TaskDB {
/// Create a new TaskDB with the given backend storage /// Create a new TaskDB with the given backend storage
pub fn new(storage: Box<dyn TaskStorage>) -> TaskDB { pub fn new(storage: Box<dyn Storage>) -> TaskDB {
TaskDB { storage } TaskDB { storage }
} }
#[cfg(test)] #[cfg(test)]
pub fn new_inmemory() -> TaskDB { pub fn new_inmemory() -> TaskDB {
TaskDB::new(Box::new(crate::taskstorage::InMemoryStorage::new())) TaskDB::new(Box::new(crate::storage::InMemoryStorage::new()))
} }
/// Apply an operation to the TaskDB. Aside from synchronization operations, this is the only way /// Apply an operation to the TaskDB. Aside from synchronization operations, this is the only way
@ -45,7 +45,7 @@ impl TaskDB {
Ok(()) Ok(())
} }
fn apply_op(txn: &mut dyn TaskStorageTxn, op: &Operation) -> Fallible<()> { fn apply_op(txn: &mut dyn StorageTxn, op: &Operation) -> Fallible<()> {
match op { match op {
Operation::Create { uuid } => { Operation::Create { uuid } => {
// insert if the task does not already exist // insert if the task does not already exist
@ -261,7 +261,7 @@ impl TaskDB {
Ok(()) Ok(())
} }
fn apply_version(txn: &mut dyn TaskStorageTxn, mut version: Version) -> Fallible<()> { fn apply_version(txn: &mut dyn StorageTxn, mut version: Version) -> Fallible<()> {
// The situation here is that the server has already applied all server operations, and we // The situation here is that the server has already applied all server operations, and we
// have already applied all local operations, so states have diverged by several // have already applied all local operations, so states have diverged by several
// operations. We need to figure out what operations to apply locally and on the server in // operations. We need to figure out what operations to apply locally and on the server in
@ -358,7 +358,7 @@ impl TaskDB {
mod tests { mod tests {
use super::*; use super::*;
use crate::server::test::TestServer; use crate::server::test::TestServer;
use crate::taskstorage::InMemoryStorage; use crate::storage::InMemoryStorage;
use chrono::Utc; use chrono::Utc;
use proptest::prelude::*; use proptest::prelude::*;
use std::collections::HashMap; use std::collections::HashMap;