mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 16:57:49 +03:00
mononoke: make readonlyblob PutBehaviour aware
Summary: Update readonlyblob to be PutBehaviour aware Reviewed By: StanislavGlebik Differential Revision: D24109290 fbshipit-source-id: 2108c6969a4c15243efbca10daf64771e72a969b
This commit is contained in:
parent
6e2dfa2dd8
commit
a80176f699
@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
use anyhow::Error;
|
||||
use blobstore::{Blobstore, BlobstoreGetData};
|
||||
use blobstore::{Blobstore, BlobstoreGetData, BlobstorePutOps, OverwriteStatus, PutBehaviour};
|
||||
use context::CoreContext;
|
||||
use futures::future::{self, BoxFuture, FutureExt};
|
||||
use mononoke_types::BlobstoreBytes;
|
||||
@ -15,11 +15,11 @@ pub use crate::errors::ErrorKind;
|
||||
|
||||
/// A layer over an existing blobstore that prevents writes.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ReadOnlyBlobstore<T: Blobstore + Clone> {
|
||||
pub struct ReadOnlyBlobstore<T: Clone> {
|
||||
blobstore: T,
|
||||
}
|
||||
|
||||
impl<T: Blobstore + Clone> ReadOnlyBlobstore<T> {
|
||||
impl<T: Clone> ReadOnlyBlobstore<T> {
|
||||
pub fn new(blobstore: T) -> Self {
|
||||
Self { blobstore }
|
||||
}
|
||||
@ -51,6 +51,22 @@ impl<T: Blobstore + Clone> Blobstore for ReadOnlyBlobstore<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: BlobstorePutOps + Clone> BlobstorePutOps for ReadOnlyBlobstore<T> {
|
||||
fn put_explicit(
|
||||
&self,
|
||||
_ctx: CoreContext,
|
||||
key: String,
|
||||
_value: BlobstoreBytes,
|
||||
_put_behaviour: PutBehaviour,
|
||||
) -> BoxFuture<'static, Result<OverwriteStatus, Error>> {
|
||||
future::err(ErrorKind::ReadOnlyPut(key).into()).boxed()
|
||||
}
|
||||
|
||||
fn put_behaviour(&self) -> PutBehaviour {
|
||||
self.blobstore.put_behaviour()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
@ -77,4 +93,24 @@ mod test {
|
||||
let base_present = base.is_present(ctx, key.clone()).await.unwrap();
|
||||
assert!(!base_present);
|
||||
}
|
||||
|
||||
#[fbinit::compat_test]
|
||||
async fn test_error_on_put_with_status(fb: FacebookInit) {
|
||||
let ctx = CoreContext::test_mock(fb);
|
||||
let base = EagerMemblob::default();
|
||||
let wrapper = ReadOnlyBlobstore::new(base.clone());
|
||||
let key = "foobar".to_string();
|
||||
|
||||
// We're using EagerMemblob (immediate future completion) so calling wait() is fine.
|
||||
let r = wrapper
|
||||
.put_with_status(
|
||||
ctx.clone(),
|
||||
key.clone(),
|
||||
BlobstoreBytes::from_bytes("test foobar"),
|
||||
)
|
||||
.await;
|
||||
assert!(!r.is_ok());
|
||||
let base_present = base.is_present(ctx, key.clone()).await.unwrap();
|
||||
assert!(!base_present);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user