2017-08-11 6 views
1

bcrypt.CompareHashAndPassword()私は、エラーがnilでない場合、status.Error()をクライアントに返します。gRPC status.Error()は、同時リクエストの実行時に無効なメモリアドレスを引き起こします。

私は同時リクエストを実行しないとうまくいきます。

私はちょうどbcryptからstatus.Error()の代わりにクライアントにエラーを返す場合、すべての同時要求で動作します。私は競争条件をテストして走ったが、何も出てこなかった。

問題が"google.golang.org/grpc/status"ライブラリまたは"golang.org/x/crypto/bcrypt"の場合はわかりません。私はステータスライブラリを調べました。この問題の原因となるマップや何かの読み書きはありません。どんな助けもありがたい。

マイコード:

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 
} 

エラー:

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 
+0

マークされた行が本当にエラーが発生している行であれば、そこにポインタが逆参照されていないので、私は困惑しています。 – Adrian

+0

あなたのコードにもっと多くの文脈を表示してください。あなたは 'status'パッケージを' status'変数でシャドーイングしていますか? – JimB

+0

@JimB関数全体を追加しました –

答えて

1

追加godocsからのコードは、この問題を解決しません。ありがとうございます@jeevatkm

関連する問題