首页 > 解决方案 > golang spanner 测试库在一段时间后崩溃

问题描述

Spanner GO 库可能在此查询后几分钟后崩溃(尽管这在之前已经成功)版本 cloud.google.com/go/spanner v1.11.0

2021/02/01 00:45:32.564971 spannertest.inmem: Querying: SELECT * FROM tenant_config WHERE commit_time > "2021-02-01T00:44:32Z"

崩溃信息

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0xae3bcb]

goroutine 214 [running]:
cloud.google.com/go/spanner/spannertest.(*server).ExecuteSql(0xc00009b4a0, 0xf74c00, 0xc0001e8270, 0xc0003e8c60, 0xc00009b4a0, 0xc0001e8270, 0xc0008a4ba0)
        /Users/mpathak/Development/gopkgs/pkg/mod/cloud.google.com/go/spanner@v1.11.0/spannertest/inmem.go:491 +0x3b
google.golang.org/genproto/googleapis/spanner/v1._Spanner_ExecuteSql_Handler(0xd0f8a0, 0xc00009b4a0, 0xf74c00, 0xc0001e8270, 0xc00088b020, 0x0, 0xf74c00, 0xc0001e8270, 0xc0004f4060, 0x14)
        /Users/mpathak/Development/gopkgs/pkg/mod/google.golang.org/genproto@v0.0.0-20201019141844-1ed22bb0c154/googleapis/spanner/v1/spanner.pb.go:3581 +0x217
google.golang.org/grpc.(*Server).processUnaryRPC(0xc0003a1500, 0xf7e800, 0xc00018a900, 0xc00089a000, 0xc0001ac2a0, 0x152c7d8, 0x0, 0x0, 0x0)
        /Users/mpathak/Development/gopkgs/pkg/mod/google.golang.org/grpc@v1.32.0/server.go:1194 +0x50a
google.golang.org/grpc.(*Server).handleStream(0xc0003a1500, 0xf7e800, 0xc00018a900, 0xc00089a000, 0x0)
        /Users/mpathak/Development/gopkgs/pkg/mod/google.golang.org/grpc@v1.32.0/server.go:1517 +0xcfd
google.golang.org/grpc.(*Server).serveStreams.func1.2(0xc000606140, 0xc0003a1500, 0xf7e800, 0xc00018a900, 0xc00089a000)
        /Users/mpathak/Development/gopkgs/pkg/mod/google.golang.org/grpc@v1.32.0/server.go:859 +0xa1
created by google.golang.org/grpc.(*Server).serveStreams.func1
        /Users/mpathak/Development/gopkgs/pkg/mod/google.golang.org/grpc@v1.32.0/server.go:857 +0x204

标签: google-cloud-spannergoogle-api-go-client

解决方案


这似乎是由ExecuteSqlspannertest 的方法实现中的错误引起的。Spanner 客户端的会话池将ping每 50 分钟执行一次语句,以使后端的会话保持活动状态。这些SELECT 1语句在没有事务的情况下执行,这意味着后端应默认为一次性只读事务。spannertest 的 inmem 服务器假定客户端将始终指定一个TransactionSelectorhttps ://github.com/googleapis/google-cloud-go/blob/c7ecf0f3f454606b124e52d20af2545b2c68646f/spanner/spannertest/inmem.go#L491

我在这里打开了一个问题:https ://github.com/googleapis/google-cloud-go/issues/3639


推荐阅读