nacos-group / r-nacos

Nacos server re-implemented in Rust.
https://r-nacos.github.io/docs/
Apache License 2.0
967 stars 104 forks source link

r-nacos发生了panic #151

Closed reigadegr closed 3 weeks ago

reigadegr commented 1 month ago

这个是错误信息。运行环境: WSL2 开始运行没问题,运行十几分钟之后r-nacos出现panic

[2024-10-17 10:16:06.859828 +08:00 INFO  rnacos::grpc::server] |grpc|client_request|127.0.0.1:41186|HealthCheckRequest|ok|0.000040618
[2024-10-17 10:16:11.869815 +08:00 INFO  rnacos::grpc::server] |grpc|client_request|127.0.0.1:41186|HealthCheckRequest|ok|0.000026881
[2024-10-17 10:16:16.879216 +08:00 INFO  rnacos::grpc::server] |grpc|client_request|127.0.0.1:41186|HealthCheckRequest|ok|0.000042682
thread 'actix-rt|system:0|arbiter:10' panicked at src/openapi/naming/model.rs:46:34:
called `Option::unwrap()` on a `None` value
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Aborted (core dumped)
Press any key to continue...run_rnacos.sh: 6: read: arg count

以下是我的代码:

use nacos_sdk::api::constants;
use nacos_sdk::api::naming::{
    NamingChangeEvent, NamingEventListener, NamingService, NamingServiceBuilder, ServiceInstance,
};
use nacos_sdk::api::props::ClientProps;
use std::sync::{Arc, LazyLock};

const SERVER_NAME: &str = "users-service";
const USERNAME: &str = "admin";
const PASSWORD: &str = "admin";

const SERVER_ADDR: &str = "127.0.0.1";
const IP_ADDR: &str = "127.0.0.1";
const PORT: i32 = 5800;

pub struct MyNamingEventListener;

impl NamingEventListener for MyNamingEventListener {
    fn event(&self, event: Arc<NamingChangeEvent>) {
        tracing::info!("subscriber notify: {:?}", event);
    }
}

static CLIENT_PROPS: LazyLock<ClientProps> = LazyLock::new(|| {
    ClientProps::new()
        .server_addr(SERVER_ADDR)
        .namespace("")
        .app_name(SERVER_NAME)
        .auth_username(USERNAME)
        .auth_password(PASSWORD)
});

static NAMING_SERVICE: LazyLock<Box<dyn NamingService>> = LazyLock::new(|| {
    let naming_service = NamingServiceBuilder::new(CLIENT_PROPS.clone())
        .enable_auth_plugin_http()
        .build()
        .unwrap();
    Box::new(naming_service)
});

pub async fn init_nacos_service() {
    let listener = Arc::new(MyNamingEventListener);
    let _subscribe_ret = NAMING_SERVICE
        .subscribe(
            SERVER_NAME.to_string(),
            Some(constants::DEFAULT_GROUP.to_string()),
            Vec::default(),
            listener,
        )
        .await;

    let service_instance1 = ServiceInstance {
        ip: IP_ADDR.to_string(),
        port: PORT,
        ..Default::default()
    };

    let _register_instance_ret = NAMING_SERVICE
        .batch_register_instance(
            SERVER_NAME.to_string(),
            Some(constants::DEFAULT_GROUP.to_string()),
            vec![service_instance1],
        )
        .await;
}

调用方法是直接在主函数直接init_nacos_service().await; 目的只是想把当前的服务注册到r-nacos,同时实现心跳机制保活。代码是从nacos-rust-sdk抄的。辛苦作者大大看一下,3Q

heqingpan commented 1 month ago

服务端客户端版本号分别提供一下,我晚上回去看看。

确认有问题后,本周末应该可以解决并发布新版本。

reigadegr commented 1 month ago

服务端客户端版本号分别提供一下,我晚上回去看看。

确认有问题后,本周末应该可以解决并发布新版本。

客户端:nacos-sdk = "0.4.2" 服务端:基于当前仓库最新版本编译。 https://github.com/nacos-group/r-nacos/tree/d6d7be3671c6b829e3b4b2e9b3e54c33bc02725a

我这里简单处理了一下: https://github.com/reigadegr/r-nacos/commit/9912e079504fbd9c9830318b3c8075e76320af71

后续好像没再出现bug,应该是没有复现,晚会儿加个log再看看

heqingpan commented 1 month ago

用你上面的代码,没有复现报错。

从上面的报错日志,可以初步确认是调用http open api操作服务实例时,参考没有传ip然后r-nacos服务端发生panic。 这里应该只报错,不要panic会更合理。这点下个版本调整。

通过http open api调用发生panic后,actix-web应该会在线程池自动恢复线程,不影响功能上的使用;这点和你上面发生panic时的情况是否相符?

reigadegr commented 1 month ago

不相符,r-nacos发生panic后它的进程就结束了,后来其他服务无法注册到r-nacos才发现是挂了。

复现确实比较困难,就昨天早上出现了两次panic,下午一直使用也没出现panic或者自己添加的log

heqingpan commented 3 weeks ago

r-nacos v0.6.2 版本已修复