Show stack trace info when rpc fail (#12290)

Signed-off-by: dragondriver <jiquan.long@zilliz.com>
This commit is contained in:
dragondriver 2021-11-29 14:29:24 +08:00 committed by GitHub
parent 243af903c4
commit 3850979308
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 117 additions and 22 deletions

View File

@ -202,7 +202,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
return ret, nil
}
if err == context.Canceled || err == context.DeadlineExceeded {
return nil, err
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
log.Debug("DataCoord Client grpc error", zap.Error(err))
@ -210,6 +210,10 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
c.resetConnection()
ret, err = caller()
if err != nil {
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
return ret, err
}

View File

@ -183,7 +183,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
return ret, nil
}
if err == context.Canceled || err == context.DeadlineExceeded {
return nil, err
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
log.Debug("DataNode Client grpc error", zap.Error(err))
@ -191,8 +191,8 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
c.resetConnection()
ret, err = caller()
if err == nil {
return ret, nil
if err != nil {
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
return ret, err
}

View File

@ -189,7 +189,7 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
return ret, nil
}
if err == context.Canceled || err == context.DeadlineExceeded {
return nil, err
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
log.Debug("IndexCoord Client grpc error", zap.Error(err))
@ -197,8 +197,8 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
c.resetConnection()
ret, err = caller()
if err == nil {
return ret, nil
if err != nil {
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
return ret, err
}

View File

@ -179,15 +179,15 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
return ret, nil
}
if err == context.Canceled || err == context.DeadlineExceeded {
return nil, err
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
log.Debug("IndexNode Client grpc error", zap.Error(err))
c.resetConnection()
ret, err = caller()
if err == nil {
return ret, nil
if err != nil {
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
return ret, err
}

View File

@ -180,15 +180,15 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
return ret, nil
}
if err == context.Canceled || err == context.DeadlineExceeded {
return nil, err
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
log.Debug("Proxy Client grpc error", zap.Error(err))
c.resetConnection()
ret, err = caller()
if err == nil {
return ret, nil
if err != nil {
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
return ret, err
}

View File

@ -204,15 +204,15 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
return ret, nil
}
if err == context.Canceled || err == context.DeadlineExceeded {
return nil, err
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
log.Debug("QueryCoord Client grpc error", zap.Error(err))
c.resetConnection()
ret, err = caller()
if err == nil {
return ret, nil
if err != nil {
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
return ret, err
}

View File

@ -171,15 +171,15 @@ func (c *Client) recall(caller func() (interface{}, error)) (interface{}, error)
return ret, nil
}
if err == context.Canceled || err == context.DeadlineExceeded {
return nil, err
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
log.Debug("QueryNode Client grpc error", zap.Error(err))
c.resetConnection()
ret, err = caller()
if err == nil {
return ret, nil
if err != nil {
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
return ret, err
}

View File

@ -232,15 +232,15 @@ func (c *GrpcClient) recall(caller func() (interface{}, error)) (interface{}, er
return ret, nil
}
if err == context.Canceled || err == context.DeadlineExceeded {
return nil, err
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
log.Debug("RootCoord Client grpc error", zap.Error(err))
c.resetConnection()
ret, err = caller()
if err == nil {
return ret, nil
if err != nil {
return nil, fmt.Errorf("err: %s\n, %s", err.Error(), trace.StackTrace())
}
return ret, err
}

View File

@ -0,0 +1,44 @@
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License.
package trace
import (
"fmt"
"runtime"
)
const numFuncsInStack = 10
// StackTraceMsg returns the stack information, which numFuncs means how many functions do you want to show in the stack
// information.
func StackTraceMsg(numFuncs uint) string {
pc := make([]uintptr, numFuncs)
n := runtime.Callers(0, pc)
frames := runtime.CallersFrames(pc[:n])
ret := ""
for {
frame, more := frames.Next()
ret += fmt.Sprintf("%s:%d %s\n", frame.File, frame.Line, frame.Function)
if !more {
break
}
}
return ret
}
// StackTrace returns the stack trace information.
func StackTrace() string {
return StackTraceMsg(numFuncsInStack)
}

View File

@ -0,0 +1,47 @@
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License.
package trace
import (
"fmt"
"testing"
)
func TestStackTraceMsg(t *testing.T) {
fmt.Println(StackTraceMsg(1))
fmt.Println(StackTraceMsg(5))
fmt.Println(StackTraceMsg(10))
func() {
fmt.Println(StackTraceMsg(10))
}()
func() {
func() {
fmt.Println(StackTraceMsg(10))
}()
}()
}
func TestStackTrace(t *testing.T) {
fmt.Println(StackTrace())
func() {
fmt.Println(StackTrace())
}()
func() {
func() {
fmt.Println(StackTrace())
}()
}()
}