diff --git a/rust/gitxetcore/src/git_integration/git_xet_repo.rs b/rust/gitxetcore/src/git_integration/git_xet_repo.rs index 4a4f132e..453e308d 100644 --- a/rust/gitxetcore/src/git_integration/git_xet_repo.rs +++ b/rust/gitxetcore/src/git_integration/git_xet_repo.rs @@ -2031,6 +2031,30 @@ pub mod git_repo_test_tools { }) } + pub fn new_xet() -> Result { + let repo_path = TestRepoPath::new("repo")?; + + git_process_wrapping::run_git_captured(Some(&repo_path.path), "init", &[], true, None)?; + git_process_wrapping::run_git_captured( + Some(&repo_path.path), + "xet", + &["init", "--force"], + true, + None, + )?; + + let git_repo = GitXetRepo::open(XetConfig::new( + Some(Cfg::with_default_values()), + None, + ConfigGitPathOption::PathDiscover(repo_path.path.clone()), + )?)?; + + Ok(Self { + repo: git_repo, + _repo_path: repo_path, + }) + } + #[allow(clippy::should_implement_trait)] //TODO: choose a better name pub fn clone(origin: &TestRepo) -> Result { let tmp_repo = TempDir::new()?; @@ -2079,7 +2103,7 @@ pub mod git_repo_test_tools { Ok(()) } - pub fn write_file(&self, filename: &str, seed: u64, size: usize) -> Result<()> { + pub fn write_file(&self, filename: impl AsRef, seed: u64, size: usize) -> Result<()> { use rand::prelude::*; let mut rng = SmallRng::seed_from_u64(seed); let mut data = vec![0u8; size]; diff --git a/xetldfs/Cargo.lock b/xetldfs/Cargo.lock index 6263f6a0..0f9c7c49 100644 --- a/xetldfs/Cargo.lock +++ b/xetldfs/Cargo.lock @@ -71,6 +71,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "ansi_term" version = "0.12.1" @@ -80,6 +86,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstyle" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" + [[package]] name = "anyhow" version = "1.0.86" @@ -138,18 +150,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -163,9 +175,12 @@ dependencies = [ [[package]] name = "atomic" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" +checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" +dependencies = [ + "bytemuck", +] [[package]] name = "atomic-waker" @@ -203,7 +218,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.30", "itoa", "matchit", "memchr", @@ -294,15 +309,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "blake3" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +checksum = "e9ec96fe9a81b5e365f9db71fe00edc4fe4ca2cc7dcb7861f0603012a7caa210" dependencies = [ "arrayref", "arrayvec", @@ -362,9 +377,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" [[package]] name = "bytestream" @@ -415,7 +430,7 @@ dependencies = [ "futures", "http 0.2.12", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.1", "hyper-rustls", "hyper-util", "itertools 0.10.5", @@ -446,15 +461,20 @@ dependencies = [ "xet_error", ] +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cc" -version = "1.0.99" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" +checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" dependencies = [ "jobserver", "libc", - "once_cell", ] [[package]] @@ -487,13 +507,40 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] name = "chunkpipe" version = "0.14.5" +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + [[package]] name = "clap" version = "2.34.0" @@ -518,7 +565,7 @@ dependencies = [ "atty", "bitflags 1.3.2", "clap_derive", - "clap_lex", + "clap_lex 0.2.4", "indexmap 1.9.3", "once_cell", "strsim 0.10.0", @@ -526,6 +573,25 @@ dependencies = [ "textwrap 0.16.1", ] +[[package]] +name = "clap" +version = "4.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942" +dependencies = [ + "anstyle", + "clap_lex 0.7.1", +] + [[package]] name = "clap_derive" version = "3.2.25" @@ -548,6 +614,12 @@ dependencies = [ "os_str_bytes", ] +[[package]] +name = "clap_lex" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" + [[package]] name = "codespan-reporting" version = "0.11.1" @@ -678,6 +750,42 @@ dependencies = [ "libc", ] +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap 4.5.9", + "criterion-plot", + "is-terminal", + "itertools 0.10.5", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + [[package]] name = "crossbeam-channel" version = "0.5.13" @@ -746,6 +854,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -809,7 +923,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -826,7 +940,7 @@ checksum = "4b2c1c1776b986979be68bb2285da855f8d8a35851a769fca8740df7c3d07877" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -986,9 +1100,9 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "either" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encoding_rs" @@ -1008,7 +1122,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -1196,7 +1310,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -1305,7 +1419,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -1313,7 +1427,7 @@ name = "git2" version = "0.18.2" source = "git+https://github.com/xetdata/git2-rs#dfffd3d1eb9e87a9e7e98b24d0a0f54db664cbcc" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", "libgit2-sys", "log", @@ -1473,6 +1587,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if 1.0.0", + "crunchy", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1626,9 +1750,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http 1.1.0", @@ -1643,7 +1767,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -1667,9 +1791,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.29" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -1691,16 +1815,16 @@ dependencies = [ [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", "futures-util", "h2 0.4.5", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "httparse", "itoa", "pin-project-lite", @@ -1717,11 +1841,11 @@ checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.3.1", + "hyper 1.4.1", "hyper-util", "log", "rustls 0.22.4", - "rustls-native-certs 0.7.0", + "rustls-native-certs 0.7.1", "rustls-pki-types", "tokio", "tokio-rustls 0.25.0", @@ -1734,7 +1858,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.29", + "hyper 0.14.30", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -1747,7 +1871,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.29", + "hyper 0.14.30", "native-tls", "tokio", "tokio-native-tls", @@ -1755,16 +1879,16 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.0", - "hyper 1.3.1", + "http-body 1.0.1", + "hyper 1.4.1", "pin-project-lite", "socket2", "tokio", @@ -1814,12 +1938,12 @@ dependencies = [ [[package]] name = "imara-diff" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98c1d0ad70fc91b8b9654b1f33db55e59579d3b3de2bffdced0fdb810570cb8" +checksum = "af13c8ceb376860ff0c6a66d83a8cdd4ecd9e464da24621bbffcd02b49619434" dependencies = [ "ahash 0.8.11", - "hashbrown 0.12.3", + "hashbrown 0.14.5", ] [[package]] @@ -1875,6 +1999,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "is_executable" version = "1.0.1" @@ -1958,9 +2093,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "len-trait" @@ -2008,7 +2143,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", ] @@ -2078,9 +2213,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" @@ -2271,7 +2406,7 @@ dependencies = [ "cfg-if 1.0.0", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -2329,7 +2464,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if 1.0.0", "cfg_aliases", "libc", @@ -2427,6 +2562,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "oorandom" +version = "11.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" + [[package]] name = "opaque-debug" version = "0.3.1" @@ -2439,7 +2580,7 @@ version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if 1.0.0", "foreign-types", "libc", @@ -2456,7 +2597,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -2645,9 +2786,9 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.5.2", + "redox_syscall 0.5.3", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2708,9 +2849,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.10" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" dependencies = [ "memchr", "thiserror", @@ -2719,9 +2860,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.10" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459" +checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" dependencies = [ "pest", "pest_generator", @@ -2729,22 +2870,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.10" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687" +checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] name = "pest_meta" -version = "2.7.10" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a240022f37c361ec1878d646fc5b7d7c4d28d5946e1a80ad5a7a4f4ca0bdcd" +checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" dependencies = [ "once_cell", "pest", @@ -2791,7 +2932,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -2820,7 +2961,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -2841,6 +2982,34 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "plotters" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" + +[[package]] +name = "plotters-svg" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" +dependencies = [ + "plotters-backend", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2890,7 +3059,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -2989,7 +3158,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.67", + "syn 2.0.71", "tempfile", ] @@ -3003,7 +3172,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -3146,11 +3315,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", ] [[package]] @@ -3231,7 +3400,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.30", "hyper-tls", "ipnet", "js-sys", @@ -3357,7 +3526,7 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -3385,7 +3554,7 @@ dependencies = [ "log", "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.102.4", + "rustls-webpki 0.102.5", "subtle", "zeroize", ] @@ -3404,9 +3573,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "a88d6d420651b496bdd98684116959239430022a115c1240e6c3993be0b15fba" dependencies = [ "openssl-probe", "rustls-pemfile 2.1.2", @@ -3452,9 +3621,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.4" +version = "0.102.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" dependencies = [ "ring 0.17.8", "rustls-pki-types", @@ -3521,11 +3690,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3534,9 +3703,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -3544,29 +3713,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", @@ -3642,7 +3811,7 @@ dependencies = [ "clap 2.34.0", "heed", "http 0.2.12", - "hyper 0.14.29", + "hyper 0.14.30", "itertools 0.10.5", "lazy_static", "mdb_shard", @@ -3867,9 +4036,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0208408ba0c3df17ed26eb06992cb1a1268d41b2c0e12e65203fbe3972cee5" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3884,9 +4053,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.67" +version = "2.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff8655ed1d86f3af4ee3fd3263786bc14245ad17c4c7e85ba7187fb3ae028c90" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" dependencies = [ "proc-macro2", "quote", @@ -4045,22 +4214,22 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -4126,11 +4295,21 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -4143,9 +4322,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" dependencies = [ "backtrace", "bytes", @@ -4178,7 +4357,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -4270,7 +4449,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.29", + "hyper 0.14.30", "hyper-timeout", "percent-encoding", "pin-project", @@ -4297,7 +4476,7 @@ dependencies = [ "proc-macro2", "prost-build", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -4352,7 +4531,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -4470,7 +4649,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -4605,9 +4784,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ "atomic", "getrandom", @@ -4696,7 +4875,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", "wasm-bindgen-shared", ] @@ -4730,7 +4909,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4805,7 +4984,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -4823,7 +5002,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -4843,18 +5022,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -4865,9 +5044,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -4877,9 +5056,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -4889,15 +5068,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -4907,9 +5086,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -4919,9 +5098,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -4931,9 +5110,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -4943,9 +5122,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winreg" @@ -4963,7 +5142,7 @@ version = "1.0.50" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] @@ -4992,6 +5171,7 @@ version = "0.14.2" dependencies = [ "anyhow", "clap 3.2.25", + "criterion", "ctor", "errno", "file_utils", @@ -5000,6 +5180,7 @@ dependencies = [ "libxet", "openssl-probe", "path-absolutize", + "rand 0.8.5", "redhook", "regex", "tempdir", @@ -5019,22 +5200,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.67", + "syn 2.0.71", ] [[package]] diff --git a/xetldfs/Cargo.toml b/xetldfs/Cargo.toml index bcb78024..9558d7e2 100644 --- a/xetldfs/Cargo.toml +++ b/xetldfs/Cargo.toml @@ -15,6 +15,10 @@ path = "../gitxet/src/bin/gitxet.rs" name = "xetldfs" crate-type = ["dylib"] +[[bench]] +name = "bench_fs" +harness = false + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] lazy_static = "*" @@ -37,6 +41,8 @@ anyhow = "1" tempdir = "0.3" tempfile = "3" regex = "1.5.6" +criterion = "0.5.1" +rand = "0.8.5" [profile.release] opt-level = 3 diff --git a/xetldfs/benches/bench_fs.rs b/xetldfs/benches/bench_fs.rs new file mode 100644 index 00000000..074e86aa --- /dev/null +++ b/xetldfs/benches/bench_fs.rs @@ -0,0 +1,291 @@ +use criterion::{criterion_group, criterion_main, BatchSize, BenchmarkId, Criterion, Throughput}; +use lazy_static::lazy_static; +use std::fs::OpenOptions; +use std::io::{BufReader, Read}; +use std::path::{Path, PathBuf}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; +use std::time::Duration; + +mod setup; + +use setup::{setup_some_pointer_files, setup_some_regular_files, BenchRepo}; + +fn is_interposed(envname: &str) -> bool { + !std::env::var_os(envname) + .and_then(|osstr| osstr.into_string().ok()) + .unwrap_or_default() + .is_empty() +} + +lazy_static! { + static ref IS_INTERPOSED: AtomicBool = { + #[cfg(target_os = "linux")] + let interposed = is_interposed("LD_PRELOAD"); + #[cfg(target_os = "macos")] + let interposed = is_interposed("DYLD_INSERT_LIBRARIES"); + + AtomicBool::new(interposed) + }; + static ref PREVENT_COMPILER_OPT: AtomicUsize = AtomicUsize::new(0); +} + +const DEFAULT_NUM_FILES: usize = 5; +const DEFAULT_SMALL_FILE_SIZE: usize = 100; +const DEFAULT_LARGE_FILE_SIZE: usize = 300_000; +const VARYING_FILE_SIZE: &[usize] = &[100, 10_000, 100_000, 1_000_000]; +const VARYING_NUM_FILES: &[usize] = &[1, 2, 5]; +const READ_BLOCK_SIZE: usize = 1_024; + +fn benchmark_file_ops_varying_file_size( + c: &mut Criterion, + name: &str, + setup_fn: F, + file_fn: G, +) where + M: Fn() -> (BenchRepo, Vec), + F: Fn(usize, usize) -> M, + G: Fn((BenchRepo, Vec)) + Copy, +{ + let mut group = c.benchmark_group(format!("{name}_{DEFAULT_NUM_FILES}_x_varying_file_size")); + for &content_size in VARYING_FILE_SIZE { + group.throughput(Throughput::Bytes(content_size as u64)); + group.bench_with_input( + BenchmarkId::from_parameter(content_size), + &content_size, + |b, &size| { + b.iter_batched( + setup_fn(DEFAULT_NUM_FILES, size), + file_fn, + BatchSize::SmallInput, + ) + }, + ); + } + group.finish(); +} + +fn benchmark_file_ops_varying_num_files( + c: &mut Criterion, + name: &str, + setup_fn: F, + file_fn: G, +) where + M: Fn() -> (BenchRepo, Vec), + F: Fn(usize, usize) -> M, + G: Fn((BenchRepo, Vec)) + Copy, +{ + let mut group = c.benchmark_group(format!( + "{name}_varying_num_files_x_{DEFAULT_SMALL_FILE_SIZE}" + )); + for &num_files in VARYING_NUM_FILES { + group.throughput(Throughput::Elements(num_files as u64)); + group.bench_with_input( + BenchmarkId::from_parameter(num_files), + &num_files, + |b, &n| { + b.iter_batched( + setup_fn(n, DEFAULT_SMALL_FILE_SIZE), + file_fn, + BatchSize::SmallInput, + ) + }, + ); + } + group.finish(); + + let mut group = c.benchmark_group(format!( + "{name}_varying_num_files_x_{DEFAULT_LARGE_FILE_SIZE}" + )); + for &num_files in VARYING_NUM_FILES { + group.throughput(Throughput::Elements(num_files as u64)); + group.bench_with_input( + BenchmarkId::from_parameter(num_files), + &num_files, + |b, &n| { + b.iter_batched( + setup_fn(n, DEFAULT_LARGE_FILE_SIZE), + file_fn, + BatchSize::SmallInput, + ) + }, + ); + } + group.finish(); +} + +fn benchmark_file_ops(c: &mut Criterion, name: &str, setup_fn: F, file_fn: G) +where + M: Fn() -> (BenchRepo, Vec), + F: Fn(usize, usize) -> M + Copy, + G: Fn((BenchRepo, Vec)) + Copy, +{ + benchmark_file_ops_varying_file_size(c, name, setup_fn, file_fn); + benchmark_file_ops_varying_num_files(c, name, setup_fn, file_fn); +} + +fn open_files_for_truncate_write((_bench_repo, files): (BenchRepo, Vec>)) { + let mut prevent_compiler_opt = 0; + for f in files { + let f = f.as_ref(); + let f = OpenOptions::new() + .write(true) + .truncate(true) + .open(f) + .unwrap(); + prevent_compiler_opt += (&f) as *const _ as usize; + } + PREVENT_COMPILER_OPT.fetch_add(prevent_compiler_opt, Ordering::Relaxed); +} + +fn open_files_for_nontruncate_write((bench_repo, files): (BenchRepo, Vec>)) { + let mut prevent_compiler_opt = 0; + for f in files { + let f = f.as_ref(); + + // Not xetldfs interposed -> need to `git xet materialize` manually + if !IS_INTERPOSED.load(Ordering::Relaxed) { + bench_repo.git_xet_materialize(f); + } + + let f = OpenOptions::new() + .write(true) + .truncate(false) + .open(f) + .unwrap(); + + prevent_compiler_opt += (&f) as *const _ as usize; + } + PREVENT_COMPILER_OPT.fetch_add(prevent_compiler_opt, Ordering::Relaxed); +} + +fn open_files_for_read((bench_repo, files): (BenchRepo, Vec>)) { + let mut prevent_compiler_opt = 0; + for f in files { + let f = f.as_ref(); + + // Not xetldfs interposed -> need to `git xet materialize` manually + if !IS_INTERPOSED.load(Ordering::Relaxed) { + bench_repo.git_xet_materialize(f); + } + + let f = OpenOptions::new().read(true).write(false).open(f).unwrap(); + + prevent_compiler_opt += (&f) as *const _ as usize; + } + PREVENT_COMPILER_OPT.fetch_add(prevent_compiler_opt, Ordering::Relaxed); +} + +fn read_file((bench_repo, files): (BenchRepo, Vec>)) { + let mut prevent_compiler_opt = 0; + for f in files { + let f = f.as_ref(); + + // Not xetldfs interposed -> need to `git xet materialize` manually + if !IS_INTERPOSED.load(Ordering::Relaxed) { + bench_repo.git_xet_materialize(f); + } + + let f = OpenOptions::new().read(true).open(f).unwrap(); + + let mut reader = BufReader::new(f); + let mut buf = [0u8; READ_BLOCK_SIZE]; + while reader.read(&mut buf).unwrap() != 0 { + prevent_compiler_opt += buf[0] as usize; + } + } + PREVENT_COMPILER_OPT.fetch_add(prevent_compiler_opt, Ordering::Relaxed); +} + +fn benchmark_regular_file(c: &mut Criterion) { + let interposed = IS_INTERPOSED.load(Ordering::Relaxed); + + benchmark_file_ops_varying_num_files( + c, + &format!( + "{}_interposed_open_regular_file_for_write_truncate", + interposed + ), + setup_some_regular_files, + open_files_for_truncate_write, + ); + + benchmark_file_ops( + c, + &format!( + "{}_interposed_open_regular_file_for_write_nontruncate", + interposed + ), + setup_some_regular_files, + open_files_for_nontruncate_write, + ); + + benchmark_file_ops( + c, + &format!("{}_interposed_open_regular_file_for_read", interposed), + setup_some_regular_files, + open_files_for_read, + ); + + benchmark_file_ops( + c, + &format!("{}_interposed_read_regular_file", interposed), + setup_some_regular_files, + read_file, + ); + + let val = PREVENT_COMPILER_OPT.load(Ordering::Relaxed); + if val == 0x816981cd85 { + eprintln!("{val}"); + } +} + +fn benchmark_pointer_file(c: &mut Criterion) { + let interposed = IS_INTERPOSED.load(Ordering::Relaxed); + + benchmark_file_ops_varying_num_files( + c, + &format!( + "{}_interposed_open_pointer_file_for_write_truncate", + interposed + ), + setup_some_pointer_files, + open_files_for_truncate_write, + ); + + benchmark_file_ops( + c, + &format!( + "{}_interposed_open_pointer_file_for_write_nontruncate", + interposed + ), + setup_some_pointer_files, + open_files_for_nontruncate_write, + ); + + benchmark_file_ops( + c, + &format!("{}_interposed_open_pointer_file_for_read", interposed), + setup_some_pointer_files, + open_files_for_read, + ); + + benchmark_file_ops( + c, + &format!("{}_interposed_read_pointer_file", interposed), + setup_some_pointer_files, + read_file, + ); + + let val = PREVENT_COMPILER_OPT.load(Ordering::Relaxed); + if val == 0x816981cd85 { + eprintln!("{val}"); + } +} + +criterion_group!(name = bench_regular_file; + config = Criterion::default().sample_size(10).measurement_time(Duration::from_secs(60)); + targets = benchmark_regular_file); +criterion_group!(name = bench_pointer_file; + config = Criterion::default().sample_size(10).measurement_time(Duration::from_secs(60)); + targets = benchmark_pointer_file); +criterion_main!(bench_regular_file, bench_pointer_file); diff --git a/xetldfs/benches/setup.rs b/xetldfs/benches/setup.rs new file mode 100644 index 00000000..401a43b1 --- /dev/null +++ b/xetldfs/benches/setup.rs @@ -0,0 +1,107 @@ +use lazy_static::lazy_static; +use libxet::git_integration::git_repo_test_tools::TestRepo; +use rand::Rng; +use std::path::{Path, PathBuf}; +use tempfile::TempDir; + +lazy_static! { + pub static ref CAS_DIR: TempDir = TempDir::new().unwrap(); + pub static ref CAS_URL: String = format!( + "local://{}", + CAS_DIR.path().as_os_str().to_str().unwrap_or_default() + ); +} + +pub struct BenchRepo { + pub inner: TestRepo, +} + +impl BenchRepo { + pub fn new() -> Self { + std::env::set_var("XET_CAS_SERVER", CAS_URL.as_str()); + let test_repo = TestRepo::new_xet().unwrap(); + + Self { inner: test_repo } + } + + pub fn working_dir(&self) -> PathBuf { + self.inner.repo.repo_dir.clone() + } + + // Create files under the repo. + pub fn prepare_files(&self, files: &[(impl AsRef, usize)]) { + for (fname, size) in files { + self.inner.write_file(fname, 0, *size).unwrap(); + } + self.inner + .repo + .run_git_checked_in_repo("add", &["."]) + .unwrap(); + } + + // Create files under the repo and turn them into pointer files. + pub fn prepare_pointer_files(&self, files: &[(impl AsRef, usize)]) { + self.prepare_files(files); + + self.inner + .repo + .run_git_checked_in_repo("xet", &["dematerialize", "."]) + .unwrap(); + } + + pub fn git_xet_materialize(&self, file: impl AsRef) { + let file = file.as_ref().to_str().unwrap(); + self.inner + .repo + .run_git_checked_in_repo("xet", &["materialize", file]) + .unwrap(); + } +} + +pub fn setup_some_regular_files( + num_files: usize, + size: usize, +) -> impl Fn() -> (BenchRepo, Vec) { + move || { + let bench_repo = BenchRepo::new(); + + let seed: i32 = rand::thread_rng().gen(); + + let files = (0..num_files) + .map(|i| (format!("f{i}_{seed}.rf"), size)) + .collect::>(); + + bench_repo.prepare_files(files.as_slice()); + + let files = files + .into_iter() + .map(|(f, _)| bench_repo.working_dir().join(f)) + .collect(); + + (bench_repo, files) + } +} + +pub fn setup_some_pointer_files( + num_files: usize, + size: usize, +) -> impl Fn() -> (BenchRepo, Vec) { + move || { + let bench_repo = BenchRepo::new(); + + let seed: i32 = rand::thread_rng().gen(); + + let files = (0..num_files) + .map(|i| (format!("f{i}_{seed}.pf"), size)) + .collect::>(); + + bench_repo.prepare_pointer_files(files.as_slice()); + + let files = files + .into_iter() + .map(|(f, _)| bench_repo.working_dir().join(f)) + .collect(); + + (bench_repo, files) + } +}