mononoke: support rocksdb blobstore in eden server

Reviewed By: lukaspiatkowski

Differential Revision: D5861654

fbshipit-source-id: 036249899910c7aa1acda0632e6a3dcd15bf8f72
This commit is contained in:
Stanislau Hlebik 2017-09-21 08:08:10 -07:00 committed by Facebook Github Bot
parent 62bf1ee5b5
commit ab14a6f6c9
3 changed files with 54 additions and 30 deletions

View File

@ -106,13 +106,13 @@ impl_blob_state! {
impl RocksBlobState {
pub fn new(path: &Path) -> Result<Self> {
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 {

View File

@ -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<State> = HashMap<String, Arc<BlobRepo<State>>>;
type UrlParseFunc = fn(Captures) -> Result<ParsedUrl>;
@ -272,6 +270,20 @@ where
}
}
fn start_server<State>(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),
};
}

View File

@ -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