ping函数相关问题

这个函数我有三个问题:

1.我用2.0的客户端获取session并且调用了ping函数:

session = pool.getSession("root", "nebula", false);
session.ping();

ping函数原来是:

@Override
public boolean ping() {
    try {
        client.execute(0, "YIELD 1;".getBytes());
        return true;
    } catch (TException e) {
        if (e instanceof TTransportException) {
            TTransportException te = (TTransportException) e;
            return te.getType() != TTransportException.END_OF_FILE
                    && te.getType() != TTransportException.NOT_OPEN;
        }
        return true;
    }
}

为了看到response我改了一行:

@Override
public boolean ping() {
    try {
        ExecutionResponse response = client.execute(0, "YIELD 1;".getBytes());
        return true;
    } catch (TException e) {
        if (e instanceof TTransportException) {
            TTransportException te = (TTransportException) e;
            return te.getType() != TTransportException.END_OF_FILE
                    && te.getType() != TTransportException.NOT_OPEN;
        }
        return true;
    }
}

没有异常,但是response是:
ExecutionResponse (
error_code : E_SESSION_INVALID (E_SESSION_INVALID),
latency_in_us : 0,
error_msg : 49 6E 76 61 6C 69 64 20 73 65 73 73 69 6F 6E 20 69 64
)
这个response正常么?

2.如果这个response正常,我正在移植一些功能到v1.1.0分支, 并且使用相同的方法,执行了:

@Override
public boolean ping() {
    try {
        ExecutionResponse response = client.execute(0, "YIELD 1;".getBytes());
        return true;
    } catch (TException e) {
        if (e instanceof TTransportException) {
            TTransportException te = (TTransportException) e;
            return te.getType() != TTransportException.END_OF_FILE
                    && te.getType() != TTransportException.NOT_OPEN;
        }
        return true;
    }
}

response是相同的, 都是不合法的sessionId,为什么master分支说:
// Need server supported, v1.0 nebula-graph doesn’t supported

3.C++这个客户端的函数是:

bool Connection::ping() {
    auto resp = execute(-1 /*Only check connection*/, "YIELD 1");
    if (resp.errorCode == ErrorCode::E_RPC_FAILURE || resp.errorCode == ErrorCode::E_DISCONNECTED) {
        return false;
    }
    return true;
}

是不是代码里写任何sessionId <= 0的不合法的sessionId都可以?

Nebula 的版本号是多少,Nebula v1.x 对应的是 Java Client 1.x,Nebula 2.x 对应的是 Java Client 2.x,版本需要对齐

Nebula 2.x,我拿最新的nebula-graphd的master分支测试的

那你使用 Java client master 分支试试,应该是版本不对齐的原因

Java client 我也用的 master 分支,感觉不像是版本不对齐的原因

上面都是现象,你的需求或者问题是什么?

我 1 2 3 结尾都抛出了一个问题呀

  1. 客户端代码的 ping,是用 session id 为 0 去执行,所以返回 session_invalid。
    代码上是正常的,业务上正不正常取决于你要用 ping 来做什么。

  2. 用了 1.x 的客户端请求了 2.x 的服务端。

  3. 可以做什么?还是一样的问题,你要用ping 函数来做什么事情。

  1. 和目前master分支代码一样,我的目的也是测试连接是否可用。

  2. 我的疑问是
    既然客户端的master分支的ping函数有这条注释:
    // Need server supported, v1.0 nebula-graph doesn’t supported
    那就意味着客户端的master分支配合2.0的server,客户端的1.0分支配合1.0的server,这两种情况下那个函数的结果是不一样的。
    如果目的和结果是一样的话,那1.0分支也可以用那个函数吧?

  3. 我的目的就是测试连接是否可用,目前Java客户端和C++客户端的目的也是测试连接是否可用吧?但是他们写的sessionId不一样。
    所以如果正常现象就是不合法的sessionId,我理解任何sessionId <= 0的不合法的sessionId都可以。
    但是如果正常现象不是不合法的sessionId,比如2.0的server可以支持不授权情况下,用sessionId 0 去执行一些语句,那么就不一样了。

所以你的需求是,使用 1.x 的客户端,想要测试 session 是否可用?

1.0 没有 ping,你可以类似的,执行一个 yield 1 的 query,来测试。

@9606 服务端没有提供连通性检测的接口,所以客户端通过发送一条最简单的query去检测连通性,之所以用sessionId 为0,这是客户端和服务端约定好了,这个是个非法的session id,服务端拿到之后直接返回错误,纯粹用于连通性检测。

3.C++这个客户端的函数是:

bool Connection::ping() {
auto resp = execute(-1 /Only check connection/, “YIELD 1”);
if (resp.errorCode == ErrorCode::E_RPC_FAILURE || resp.errorCode == ErrorCode::E_DISCONNECTED) {
return false;
}
return true;
}
是不是代码里写任何sessionId <= 0的不合法的sessionId都可以? 用于连通性检测的话,session 用 0 比较好,这是和服务端约定好的,-1会增加服务端错误打印。cpp client 我们会进行修改。

1 个赞

大概懂了,我再看看代码