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:
Alex Hornby 2020-10-12 07:09:37 -07:00 committed by Facebook GitHub Bot
parent 6e2dfa2dd8
commit a80176f699

View File

@ -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);
}
}