diff --git a/blobrepo/src/state.rs b/blobrepo/src/state.rs index 539046b0b9..bca1ce81dd 100644 --- a/blobrepo/src/state.rs +++ b/blobrepo/src/state.rs @@ -106,13 +106,13 @@ impl_blob_state! { impl RocksBlobState { pub fn new(path: &Path) -> Result { - let heads = FileHeads::open(path.with_extension("heads")) + let heads = FileHeads::open(path.join("heads")) .chain_err(|| ErrorKind::StateOpen(StateOpenError::Heads))?; let bookmarks = Arc::new( - FileBookmarks::open(path.with_extension("books")) + FileBookmarks::open(path.join("books")) .chain_err(|| ErrorKind::StateOpen(StateOpenError::Bookmarks))?, ); - let blobstore = Rocksblob::open(path.with_extension("rocks")) + let blobstore = Rocksblob::open(path.join("blobs")) .chain_err(|| ErrorKind::StateOpen(StateOpenError::Blobstore))?; Ok(RocksBlobState { diff --git a/eden-server/src/main.rs b/eden-server/src/main.rs index 09773f75f3..41b7f9140f 100644 --- a/eden-server/src/main.rs +++ b/eden-server/src/main.rs @@ -40,7 +40,7 @@ use std::str::FromStr; use std::string::ToString; use std::sync::Arc; -use blobrepo::{BlobRepo, BlobState, FilesBlobState}; +use blobrepo::{BlobRepo, BlobState, FilesBlobState, RocksBlobState}; use clap::App; use futures::{Future, Stream}; use futures_ext::{FutureExt, StreamExt}; @@ -53,8 +53,6 @@ mod errors; use errors::*; -const EXIT_CODE: i32 = 1; - type NameToRepo = HashMap>>; type UrlParseFunc = fn(Captures) -> Result; @@ -272,6 +270,20 @@ where } } +fn start_server(addr: &str, reponame: String, state: State) +where + State: BlobState, +{ + let addr = addr.parse().expect("Failed to parse address"); + let mut map = HashMap::new(); + let repo = BlobRepo::new(state); + map.insert(reponame, Arc::new(repo)); + + let func = move || Ok(EdenServer::new(map.clone())); + let server = Http::new().bind(&addr, func).expect("Failed to run server"); + server.run().expect("Error while running service"); +} + fn main() { let matches = App::new("Mononoke server for Eden") .version("0.1") @@ -281,8 +293,17 @@ fn main() { --blobrepo-folder=[FOLDER] 'folder with blobrepo data' --reponame=[REPONAME] 'Name of the repository'", ) + .arg( + clap::Arg::with_name("repotype") + .long("repotype") + .short("T") + .takes_value(true) + .possible_values(&["files", "rocksdb"]) + .required(true) + .help("repo type"), + ) .get_matches(); - let addr = matches.value_of("addr").unwrap_or("127.0.0.1:3000").parse(); + let addr = matches.value_of("addr").unwrap_or("127.0.0.1:3000"); let blobrepo_folder = matches .value_of("blobrepo-folder") .expect("Please specify a path to the blobrepo"); @@ -292,28 +313,18 @@ fn main() { .to_string(); let blobrepo_folder = Path::new(blobrepo_folder); - let repo = blobrepo::BlobRepo::new( - FilesBlobState::new(&blobrepo_folder).expect("couldn't open blob state"), - ); - - let mut map = HashMap::new(); - map.insert(reponame, Arc::new(repo)); - - let func = move || Ok(EdenServer::new(map.clone())); - if let Ok(parsed_addr) = addr { - match Http::new().bind(&parsed_addr, func) { - Ok(server) => if let Err(error) = server.run() { - println!("Error while running service: {}", error); - std::process::exit(EXIT_CODE); - }, - Err(error) => { - println!("Failed to run server: {}", error); - std::process::exit(EXIT_CODE); - } - } - } else { - println!("Failed to parse address"); - std::process::exit(EXIT_CODE); + match matches.value_of("repotype").expect("required argument 'repotype' is not provided") { + "files" => start_server( + addr, + reponame, + FilesBlobState::new(&blobrepo_folder).expect("couldn't open blob state"), + ), + "rocksdb" => start_server( + addr, + reponame, + RocksBlobState::new(&blobrepo_folder).expect("couldn't open blob state"), + ), + bad => panic!("unknown blobrepo type {:?}", bad), }; } diff --git a/tests/integration/test-eden-server.t b/tests/integration/test-eden-server.t index dabb7559b2..fa1bb987d3 100644 --- a/tests/integration/test-eden-server.t +++ b/tests/integration/test-eden-server.t @@ -1,3 +1,5 @@ +#testcases files rocksdb + $ . $TESTDIR/library.sh $ hg init repo $ cd repo @@ -22,14 +24,25 @@ $ cd .. $ mkdir $TESTTMP/blobrepo +#if files $ blobimport --blobstore files repo $TESTTMP/blobrepo * INFO 0: changeset 3903775176ed42b1458a6281db4a0ccf4d9f287a (glob) * INFO 1: changeset 4dabaf45f54add88ca2797dfdeb00a7d55144243 (glob) * INFO head 4dabaf45f54add88ca2797dfdeb00a7d55144243 (glob) +#else + $ blobimport --blobstore rocksdb repo $TESTTMP/blobrepo + * INFO 0: changeset 3903775176ed42b1458a6281db4a0ccf4d9f287a (glob) + * INFO 1: changeset 4dabaf45f54add88ca2797dfdeb00a7d55144243 (glob) + * INFO head 4dabaf45f54add88ca2797dfdeb00a7d55144243 (glob) +#endif Temporary hack because blobimport doesn't import bookmarks yet $ mkdir $TESTTMP/blobrepo/books - $ edenserver --addr 127.0.0.1:3000 --blobrepo-folder $TESTTMP/blobrepo --reponame repo +#if files + $ edenserver --addr 127.0.0.1:3000 --blobrepo-folder $TESTTMP/blobrepo --reponame repo --repotype files +#else + $ edenserver --addr 127.0.0.1:3000 --blobrepo-folder $TESTTMP/blobrepo --reponame repo --repotype rocksdb +#endif Temporary hack to make sure server is ready $ sleep 1