mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 16:57:49 +03:00
mononoke: support rocksdb blobstore in eden server
Reviewed By: lukaspiatkowski Differential Revision: D5861654 fbshipit-source-id: 036249899910c7aa1acda0632e6a3dcd15bf8f72
This commit is contained in:
parent
62bf1ee5b5
commit
ab14a6f6c9
@ -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 {
|
||||
|
@ -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),
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user