使用go客户端获取space信息报错

  • nebula 版本:nebula 2.0
  • 部署方式(分布式 / 单机 / Docker / DBaaS):docker
  • 硬件信息
    • 磁盘( 推荐使用 SSD)SSD
    • CPU、内存信息 40C 126G
  • 问题的具体描述
    你好,我用go客户端的meta thrift接口去获取nebula某个space的信息,调用过程中报错,报错信息为“err in read *meta.GetSpaceReq read error: Expected ‘{’ or null, but found ‘d’”,看错误信息应该是接口传参的格式不对,请问正确的调用姿势是怎样的呢?
    我的demo代码如下:
 package main

    import (
	"fmt"
	"time"

	"github.com/facebook/fbthrift/thrift/lib/go/thrift"
	meta "github.com/vesoft-inc/nebula-go/v2/nebula/meta"
    )

    func main() {
	timeout := 10000 * time.Second
	ip := "localhost"
	port := 36539

	newAdd := fmt.Sprintf("%s:%d", ip, port)
	timeoutOption := thrift.SocketTimeout(timeout)
	bufferSize := 128 << 10
	addressOption := thrift.SocketAddr(newAdd)
	sock, err := thrift.NewSocket(timeoutOption, addressOption)
	if err != nil {
		fmt.Println(fmt.Errorf("Failed to create a net.Conn-backed Transport,: %s", err.Error()))
	}

	transport := thrift.NewBufferedTransport(sock, bufferSize)
	pf := thrift.NewBinaryProtocolFactoryDefault()

	conn := meta.NewMetaServiceClientFactory(transport, pf)
	if err = conn.Transport.Open(); err != nil {
		fmt.Println(fmt.Errorf("Failed to open transport, error: %s", err.Error()))
	}
	if conn.Transport.IsOpen() == false {
		fmt.Println(fmt.Errorf("Transport is off"))
	}

	mbTrans := thrift.NewMemoryBufferLen(100)
	defer mbTrans.Close()

	// data_graph 为待查询的space name
	_, err = mbTrans.WriteString("data_graph")
	if err != nil {
		fmt.Println("err in mbTrans")
	}

	factory := thrift.NewSimpleJSONProtocolFactory()
	jsProt := factory.GetProtocol(mbTrans)
	argvalue := meta.NewGetSpaceReq()
	err = argvalue.Read(jsProt)
	if err != nil {
		fmt.Println("err in read", err)
		return
	}

	test, err := conn.GetSpace(argvalue)
	fmt.Println(test, err)

	test1, err := conn.ListSpaces(&meta.ListSpacesReq{})
	fmt.Println(test1, err)
    }

@Aiee 快来,这里有个 Go Client 的问题

你好,看你的描述你应该是想把space name作为参数调用GetSpace()接口,那么步骤如下:
链接创建成功后

    // construct parameter
	getSpaceReq := &meta.GetSpaceReq {
		SpaceName: []byte(spaceName),
	}

	resp, err := conn.GetSpace(getSpaceReq)
    // error handling
	if err != nil { 
        return err
    }

你好,我用上面这种方式运行,报如下错误:

*meta.GetSpaceResp error reading struct: *meta.SpaceItem error reading struct: *meta.SpaceDesc error reading struct: unable to skip over unknown type id 1

请问你的Nebula服务是什么版本的?同样,thrift接口是什么时候的,看着像版本不匹配导致的decode错误

nebula版本是2.0,thrift接口是用的"github.com/vesoft-inc/nebula-go/v2/nebula/meta",我用"github.com/vesoft-inc/nebula-go/v2/nebula/graph"中的接口导入ngql语句是没问题的。

2.0是rc1的release还是最新的master分支的呢,go client也有对应的rc1 release和master分支的

这两个的版本号可以怎么查一下么,我记得我们这的nebula是2.0 beta,但是不太确定。

Nebula版本:用console连上服务后 show hosts graph 根据 Git Info Sha确认版本
如果Nebula不是rc1的话建议更新Nebula和go client到master分支

nebula版本如下:
image

go client版本如下:

github.com/vesoft-inc/nebula-go/v2 v2.0.0-20200921074558-805846e2abd7

问题应该是go client太旧了,在go.mod中删除 github.com/vesoft-inc/nebula-go/v2 的相关依赖,然后执行 go get -u -v github.com/vesoft-inc/nebula-go@master

注意现在客户端根目录下没有v2目录了,代码中导入依赖时也要修改对应部分

你好,换成最新的go client版本nebula-go@v1.1.1-0.20210225023903-c2ed782a5d6c后可以获取space信息成功了,问下这里go client的版本1.1.1和nebula版本不是一致的吗,即1.1.1也是支持的nebula版本,我们现在使用的 github.com/vesoft-inc/nebula-go/v 2针对ngql的graphd接口是不是也可以使用最新的go-client来替代?

go.mod中的1.1.1只是github自动给的一个版本号。
golang对依赖的版本有一些规定,例如2.0及以上的版本无法作为根目录,必须将1.x版本作为根目录,但我们不想让用户混淆Nebula对应的1.0和2.0客户端,于是将两个版本分别放在两个分支。

也就是说,go client的版本只与其所在分支有关,而不是go.mod中的版本号。在 GitHub - vesoft-inc/nebula-go: Nebula client in Golang 的readme里也有说明

2 个赞

好的,了解了,非常感谢帮忙定位 :+1:

不客气,有问题欢迎再提问

1 个赞