как передать переменную гипер 13 работнику службы? - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь создать сервер, который будет нуждаться в запросе к локальному индексу 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. Спасибо за чтение! очень ценю любую помощь! :)

...