首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go gRPC status.Error()在运行并发请求时导致内存地址无效

Go gRPC status.Error()在运行并发请求时导致内存地址无效
EN

Stack Overflow用户
提问于 2017-08-12 01:43:09
回答 1查看 703关注 0票数 1

我有一个bcrypt.CompareHashAndPassword()函数,如果错误不是空的,就会向客户机返回一个status.Error()。

如果我不运行并发请求,它就会起作用。

如果我只是将err返回给客户端,而不是从bcrypt返回status.Error(),那么所有操作都可以处理并发请求。我运行它来测试竞速条件,但是什么也没有出现。

我不确定这个问题是与"google.golang.org/grpc/status"库有关还是与"golang.org/x/crypto/bcrypt"有关。我查看了状态库,在我的脑海中没有读/写地图或任何会导致这个问题的东西。感谢您的帮助。

我的代码:

代码语言:javascript
复制
  package main

import (
    pb "dms-cloud/authentication-microservice/pb"
    _ "github.com/go-sql-driver/mysql"
    "golang.org/x/net/context"
    "golang.org/x/crypto/bcrypt"
    "github.com/satori/go.uuid"
    "time"
    "encoding/json"
    "google.golang.org/grpc/status"
)

func (s *server) Authenticate(ctx context.Context, in *pb.AuthenticationRequest) (*pb.Ticket, error) {

    // Verify Password Correct
    err := bcrypt.CompareHashAndPassword([]byte(in.EncryptedPassword), []byte(in.Password))
    if err != nil {
        return nil, status.Error(105, "Authentication Failed")
    }

    // Generate Ticket
    tkt := uuid.NewV4()
    exp := time.Now().Unix() + 700

    // Response
    t := pb.Ticket{
        Uuid: tkt.String(),
        TimeExpire: exp,
        AccountId: in.AccountId,
    }

    rTkt, err := json.Marshal(t)

    err = cache.Set(tkt.String(), string(rTkt), time.Minute*60).Err()
    if err != nil {
        return nil, status.Error(500, "Internal Error")
    }

    return &t, nil
}

错误:

代码语言:javascript
复制
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x13d96c5]

goroutine 34 [running]:
main.(*server).Authenticate(0x176f580, 0x1b44000, 0xc420194210, 0xc420192e00, 0x176f580, 0x102906e, 0x0)
        /Users/kenfab/go/src/dms-cloud/authentication-microservice/Authenticate.go:19 +0x105
dms-cloud/authentication-microservice/pb._AuthenticationMicroservice_Authenticate_Handler(0x1453060, 0x176f580, 0x1b44000, 0xc420194210, 0xc420016cd0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /Users/kenfab/go/src/dms-cloud/authentication-microservice/pb/authenticate.pb.go:240 +0x28d
google.golang.org/grpc.(*Server).processUnaryRPC(0xc4200128c0, 0x1717ec0, 0xc42001b1e0, 0xc42019c000, 0xc420019e60, 0x17464c0, 0xc4201625a0, 0x0, 0x0)
        /Users/kenfab/go/src/google.golang.org/grpc/server.go:781 +0xc41
google.golang.org/grpc.(*Server).handleStream(0xc4200128c0, 0x1717ec0, 0xc42001b1e0, 0xc42019c000, 0xc4201625a0)
        /Users/kenfab/go/src/google.golang.org/grpc/server.go:981 +0x15a6
google.golang.org/grpc.(*Server).serveStreams.func1.1(0xc420011b50, 0xc4200128c0, 0x1717ec0, 0xc42001b1e0, 0xc42019c000)
        /Users/kenfab/go/src/google.golang.org/grpc/server.go:551 +0xa9
created by google.golang.org/grpc.(*Server).serveStreams.func1
        /Users/kenfab/go/src/google.golang.org/grpc/server.go:552 +0xa1
exit status 2
EN

回答 1

Stack Overflow用户

发布于 2017-08-12 01:57:00

添加了来自godocs的代码确实解决了这个问题。仅支持0- 15,谢谢@jeevatkm

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45640968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档