Я пытаюсь создать сервер, который будет нуждаться в запросе к локальному индексу RockSDB в режиме только для чтения (разрешает параллельное чтение).
это прекрасно работает в гипер 12:
extern crate hyper;
use hyper::{Body, Response, Server};
use hyper::service::service_fn_ok;
use crate::hyper::rt::Future;
use rocksdb::{prelude::*, ReadOnlyDB};
use std::sync::{Arc, Mutex, Once, ONCE_INIT};
// https://docs.rs/hyper/0.12.35/hyper/server/index.html
pub fn httpServeWithOption() {
let addr = ([0, 0, 0, 0], 4000).into();
let rocksRoot = ".tmp/rocksdb/httpServeWithOption";
std::fs::create_dir_all(&rocksRoot);
println!("{:?}", addr);
{
let db = rocksdb::DB::open_default(rocksRoot).unwrap();
db.put(b"k1", b"v1");
let value = db.get(b"k1").unwrap().unwrap().to_vec();
println!("initialized db ky1: {}", String::from_utf8(value.to_vec()).unwrap())
}
let x = Some(rocksdb::ReadOnlyDB::open_default(rocksRoot).unwrap());
let xArc = Arc::new(x);
let make_service = move || {
let inner = Arc::clone(&xArc);
service_fn_ok(move |_req| {
let temp = Arc::clone(&inner);
let db: &rocksdb::ReadOnlyDB = temp.as_ref().as_ref().unwrap();
let msg = format!("hi db: {:?}", db);
let value = db.get(b"k1").unwrap().unwrap().to_vec();
let msg = format!("read from db k1: {}", String::from_utf8(value.to_vec()).unwrap());
println!("req: {:?}", _req);
Response::new(Body::from(msg))
})
};
let server = Server::bind(&addr).serve(make_service);
hyper::rt::run(server.map_err(|e| {
eprintln!("server error: {}", e);
}));
}
Car go .toml
[dependencies]
hyper = "0.12"
pretty_env_logger = "0.3"
rocksdb = { git = "https://github.com/iSynaptic/rust-rocksdb.git", branch = "ops-and-structure" }
Однако, я изо всех сил пытаюсь получить эту работу в гипер 13. Из многих неудачных попыток, я думаю, что это лучшее направление, но оно терпит неудачу также с:
xArc
не живет достаточно долго
заимствованное значение не живет достаточно долго, ржавчина c (E0597)
как комментарии в коде ниже. я просто пытаюсь найти способ передать ссылку на rocksdb на hello_world
use std::convert::Infallible;
use std::net::SocketAddr;
use hyper::{Body, Request, Response, Server};
use hyper::service::{make_service_fn, service_fn};
use std::sync::{Arc};
use rocksdb::{prelude::*, ReadOnlyDB};
async fn hello_world(_req: Request<Body>, db: &rocksdb::ReadOnlyDB) -> Result<Response<Body>, Infallible> {
Ok(Response::new(format!("rocksdb object: {:?}", db).into()))
}
#[tokio::main]
pub async fn main() {
let port = 2134;
let rocksRoot = ".tmp/rocksdb/httpServeWithOption";
let db = rocksdb::ReadOnlyDB::open_default(rocksRoot).unwrap();
let xArc = Arc::new(db);
let make_svc = make_service_fn(|_conn| async {
/*
`xArc` does not live long enough
borrowed value does not live long enoughrustc(E0597)
*/
let inner = Arc::clone(&xArc);
// let dbRef = ???
Ok::<_, Infallible>(service_fn(move |req| hello_world(req, dbRef)))
});
let addr = SocketAddr::from(([127, 0, 0, 1], port));
let server = Server::bind(&addr).serve(make_svc);
if let Err(e) = server.await {
eprintln!("server error: {}", e);
}
}
Car go .toml
[dependencies]
hyper = "0.13"
tokio = { version = "0.2", features = ["full"] }
url = "2.1.1"
futures = "0.1"
rocksdb = { git = "https://github.com/iSynaptic/rust-rocksdb.git", branch = "ops-and-structure" }
как я могу отправить ссылку на db
до hello_world
? так что hello_world
может запросить rocksdb.
извините за любые проблемы с engli sh. Спасибо за чтение! очень ценю любую помощь! :)