Skip to content

Commit f6facea

Browse files
Liu Yangfacebook-github-bot
authored andcommitted
InferredCopyFrom: add InferredCopyFrom types
Summary: As title Reviewed By: markbt Differential Revision: D75144171 fbshipit-source-id: 66a66c00fb878415b3d8e8ea99f10356e82262c2
1 parent 5b4af61 commit f6facea

File tree

4 files changed

+184
-0
lines changed

4 files changed

+184
-0
lines changed

eden/mononoke/mononoke_types/src/blob.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use crate::typed_hash::DeletedManifestV2Id;
2727
use crate::typed_hash::FastlogBatchId;
2828
use crate::typed_hash::FileUnodeId;
2929
use crate::typed_hash::FsnodeId;
30+
use crate::typed_hash::InferredCopyFromId;
3031
use crate::typed_hash::ManifestUnodeId;
3132
use crate::typed_hash::RawBundle2Id;
3233
use crate::typed_hash::RedactionKeyListId;
@@ -100,6 +101,7 @@ pub type TestManifestBlob = Blob<TestManifestId>;
100101
pub type TestShardedManifestBlob = Blob<TestShardedManifestId>;
101102
pub type SkeletonManifestV2Blob = Blob<SkeletonManifestV2Id>;
102103
pub type CaseConflictSkeletonManifestBlob = Blob<CaseConflictSkeletonManifestId>;
104+
pub type InferredCopyFromBlob = Blob<InferredCopyFromId>;
103105

104106
impl<Id: BlobstoreKey> From<Blob<Id>> for BlobstoreBytes {
105107
#[inline]
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This software may be used and distributed according to the terms of the
5+
* GNU General Public License version 2.
6+
*/
7+
8+
use anyhow::Result;
9+
use blobstore::Blobstore;
10+
use context::CoreContext;
11+
use futures::stream::BoxStream;
12+
use futures::stream::StreamExt;
13+
use futures::stream::TryStreamExt;
14+
15+
use crate::Blob;
16+
use crate::BlobstoreValue;
17+
use crate::ThriftConvert;
18+
use crate::blob::InferredCopyFromBlob;
19+
use crate::path::MPath;
20+
use crate::sharded_map_v2::ShardedMapV2Node;
21+
use crate::sharded_map_v2::ShardedMapV2Value;
22+
use crate::thrift;
23+
use crate::typed_hash::ChangesetId;
24+
use crate::typed_hash::IdContext;
25+
use crate::typed_hash::InferredCopyFromContext;
26+
use crate::typed_hash::InferredCopyFromId;
27+
use crate::typed_hash::ShardedMapV2NodeInferredCopyFromContext;
28+
use crate::typed_hash::ShardedMapV2NodeInferredCopyFromId;
29+
30+
#[derive(ThriftConvert, Debug, Clone, PartialEq, Eq, Hash)]
31+
#[thrift(thrift::inferred_copy_from::InferredCopyFrom)]
32+
pub struct InferredCopyFrom {
33+
pub subentries: ShardedMapV2Node<InferredCopyFromEntry>,
34+
}
35+
36+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
37+
pub struct InferredCopyFromEntry {
38+
pub from_csid: ChangesetId,
39+
pub from_path: MPath,
40+
}
41+
42+
impl ThriftConvert for InferredCopyFromEntry {
43+
const NAME: &'static str = "InferredCopyFromEntry";
44+
type Thrift = thrift::inferred_copy_from::InferredCopyFromEntry;
45+
46+
fn from_thrift(t: Self::Thrift) -> Result<Self> {
47+
Ok(Self {
48+
from_csid: ChangesetId::from_thrift(t.from_csid)?,
49+
from_path: MPath::from_thrift(t.from_path)?,
50+
})
51+
}
52+
53+
fn into_thrift(self) -> Self::Thrift {
54+
Self::Thrift {
55+
from_csid: self.from_csid.into_thrift(),
56+
from_path: self.from_path.into_thrift(),
57+
}
58+
}
59+
}
60+
61+
impl ShardedMapV2Value for InferredCopyFromEntry {
62+
type NodeId = ShardedMapV2NodeInferredCopyFromId;
63+
type Context = ShardedMapV2NodeInferredCopyFromContext;
64+
type RollupData = ();
65+
66+
const WEIGHT_LIMIT: usize = 2000;
67+
}
68+
69+
impl InferredCopyFrom {
70+
pub fn empty() -> Self {
71+
Self {
72+
subentries: ShardedMapV2Node::default(),
73+
}
74+
}
75+
76+
pub async fn lookup(
77+
&self,
78+
ctx: &CoreContext,
79+
blobstore: &impl Blobstore,
80+
path: &MPath,
81+
) -> Result<Option<InferredCopyFromEntry>> {
82+
self.subentries
83+
.lookup(ctx, blobstore, &path.to_null_separated_bytes())
84+
.await
85+
}
86+
87+
pub async fn from_subentries(
88+
ctx: &CoreContext,
89+
blobstore: &impl Blobstore,
90+
subentries: impl IntoIterator<Item = (MPath, InferredCopyFromEntry)>,
91+
) -> Result<Self> {
92+
Ok(Self {
93+
subentries: ShardedMapV2Node::from_entries(
94+
ctx,
95+
blobstore,
96+
subentries
97+
.into_iter()
98+
.map(|(path, entry)| (path.to_null_separated_bytes(), entry)),
99+
)
100+
.await?,
101+
})
102+
}
103+
104+
pub fn into_subentries<'a>(
105+
self,
106+
ctx: &'a CoreContext,
107+
blobstore: &'a impl Blobstore,
108+
) -> BoxStream<'a, Result<(MPath, InferredCopyFromEntry)>> {
109+
self.subentries
110+
.into_entries(ctx, blobstore)
111+
.and_then(
112+
|(k, v)| async move { Ok((MPath::from_null_separated_bytes(k.to_vec())?, v)) },
113+
)
114+
.boxed()
115+
}
116+
117+
pub fn into_prefix_subentries<'a>(
118+
self,
119+
ctx: &'a CoreContext,
120+
blobstore: &'a impl Blobstore,
121+
prefix: &'a [u8],
122+
) -> BoxStream<'a, Result<(MPath, InferredCopyFromEntry)>> {
123+
self.subentries
124+
.into_prefix_entries(ctx, blobstore, prefix)
125+
.map(|res| {
126+
res.and_then(|(k, v)| Ok((MPath::from_null_separated_bytes(k.to_vec())?, v)))
127+
})
128+
.boxed()
129+
}
130+
}
131+
132+
impl BlobstoreValue for InferredCopyFrom {
133+
type Key = InferredCopyFromId;
134+
135+
fn into_blob(self) -> InferredCopyFromBlob {
136+
let data = self.into_bytes();
137+
let id = InferredCopyFromContext::id_from_data(&data);
138+
Blob::new(id, data)
139+
}
140+
141+
fn from_blob(blob: Blob<Self::Key>) -> Result<Self> {
142+
Self::from_bytes(blob.data())
143+
}
144+
}

eden/mononoke/mononoke_types/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ pub mod fsnode;
2929
pub mod generation;
3030
pub mod globalrev;
3131
pub mod hash;
32+
pub mod inferred_copy_from;
3233
pub mod path;
3334
pub mod prefix_tree;
3435
pub mod rawbundle2;
@@ -119,6 +120,7 @@ pub use typed_hash::DeletedManifestV2Id;
119120
pub use typed_hash::FastlogBatchId;
120121
pub use typed_hash::FileUnodeId;
121122
pub use typed_hash::FsnodeId;
123+
pub use typed_hash::InferredCopyFromId;
122124
pub use typed_hash::ManifestUnodeId;
123125
pub use typed_hash::MononokeId;
124126
pub use typed_hash::RawBundle2Id;
@@ -143,6 +145,7 @@ pub mod thrift {
143145
pub use mononoke_types_serialization::fastlog;
144146
pub use mononoke_types_serialization::fsnodes;
145147
pub use mononoke_types_serialization::id;
148+
pub use mononoke_types_serialization::inferred_copy_from;
146149
pub use mononoke_types_serialization::path;
147150
pub use mononoke_types_serialization::raw_bundle2;
148151
pub use mononoke_types_serialization::redaction;

eden/mononoke/mononoke_types/src/typed_hash.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ use crate::file_contents::FileContents;
4444
use crate::fsnode::Fsnode;
4545
use crate::hash::Blake2;
4646
use crate::hash::Blake2Prefix;
47+
use crate::inferred_copy_from::InferredCopyFrom;
48+
use crate::inferred_copy_from::InferredCopyFromEntry;
4749
use crate::rawbundle2::RawBundle2;
4850
use crate::redaction_key_list::RedactionKeyList;
4951
use crate::sharded_map::ShardedMapNode;
@@ -214,6 +216,12 @@ pub struct FastlogBatchId(Blake2);
214216
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash)]
215217
pub struct RedactionKeyListId(Blake2);
216218

219+
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash)]
220+
pub struct InferredCopyFromId(Blake2);
221+
222+
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash)]
223+
pub struct ShardedMapV2NodeInferredCopyFromId(Blake2);
224+
217225
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash)]
218226
pub struct TestManifestId(Blake2);
219227

@@ -734,6 +742,22 @@ impl_typed_hash! {
734742
context_key => "fastlogbatch",
735743
}
736744

745+
impl_typed_hash! {
746+
hash_type => InferredCopyFromId,
747+
thrift_hash_type => thrift::id::InferredCopyFromId,
748+
value_type => InferredCopyFrom,
749+
context_type => InferredCopyFromContext,
750+
context_key => "icf",
751+
}
752+
753+
impl_typed_hash! {
754+
hash_type => ShardedMapV2NodeInferredCopyFromId,
755+
thrift_hash_type => thrift::id::ShardedMapV2NodeId,
756+
value_type => ShardedMapV2Node<InferredCopyFromEntry>,
757+
context_type => ShardedMapV2NodeInferredCopyFromContext,
758+
context_key => "icf.map2node",
759+
}
760+
737761
impl_typed_hash! {
738762
hash_type => TestManifestId,
739763
thrift_hash_type => thrift::id::TestManifestId,
@@ -963,6 +987,12 @@ mod test {
963987
id.blobstore_key(),
964988
format!("redactionkeylist.blake2.{}", id)
965989
);
990+
991+
let id = ShardedMapV2NodeInferredCopyFromId::from_byte_array([1; 32]);
992+
assert_eq!(id.blobstore_key(), format!("icf.map2node.blake2.{}", id));
993+
994+
let id = InferredCopyFromId::from_byte_array([1; 32]);
995+
assert_eq!(id.blobstore_key(), format!("icf.blake2.{}", id));
966996
}
967997

968998
#[mononoke::test]
@@ -1061,5 +1091,10 @@ mod test {
10611091
let serialized = serde_json::to_string(&id).unwrap();
10621092
let deserialized = serde_json::from_str(&serialized).unwrap();
10631093
assert_eq!(id, deserialized);
1094+
1095+
let id = InferredCopyFromId::from_byte_array([1; 32]);
1096+
let serialized = serde_json::to_string(&id).unwrap();
1097+
let deserialized = serde_json::from_str(&serialized).unwrap();
1098+
assert_eq!(id, deserialized);
10641099
}
10651100
}

0 commit comments

Comments
 (0)