Skip to content

Commit

Permalink
GOCBC-245: Added last activity time to diagnostics report.
Browse files Browse the repository at this point in the history
Change-Id: I1c7ba55bf5cf12f6951421a62cda216fe0d7d3cd
Reviewed-on: http://review.couchbase.org/87863
Reviewed-by: Sergey Avseyev <sergey.avseyev@gmail.com>
Tested-by: Brett Lawson <brett19@gmail.com>
  • Loading branch information
brett19 committed Jan 16, 2018
1 parent e83679d commit 17856da
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 11 deletions.
15 changes: 11 additions & 4 deletions agent_diag.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,9 @@ func (agent *Agent) Ping(callback PingCallback) (PendingOp, error) {
// MemdConnInfo represents information we know about a particular
// memcached connection reported in a diagnostics report.
type MemdConnInfo struct {
LocalAddr string
RemoteAddr string
LocalAddr string
RemoteAddr string
LastActivity time.Time
}

// DiagnosticInfo is returned by the Diagnostics method and includes
Expand Down Expand Up @@ -151,16 +152,22 @@ func (agent *Agent) Diagnostics() (*DiagnosticInfo, error) {
pipeline.clientsLock.Lock()
for _, pipecli := range pipeline.clients {
localAddr := ""
var lastActivity time.Time

pipecli.lock.Lock()
if pipecli.client != nil {
localAddr = pipecli.client.Address()
lastActivityUs := atomic.LoadInt64(&pipecli.client.lastActivity)
if lastActivityUs != 0 {
lastActivity = time.Unix(0, lastActivityUs)
}
}
pipecli.lock.Unlock()

conns = append(conns, MemdConnInfo{
LocalAddr: localAddr,
RemoteAddr: remoteAddr,
LocalAddr: localAddr,
RemoteAddr: remoteAddr,
LastActivity: lastActivity,
})
}
pipeline.clientsLock.Unlock()
Expand Down
32 changes: 32 additions & 0 deletions agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -828,6 +828,38 @@ func TestMetaOps(t *testing.T) {
*/
}

func TestPing(t *testing.T) {
agent, s := getAgentnSignaler(t)

agent.Ping(func(services []PingResult) {
s.Wrap(func() {
if len(services) == 0 {
s.Fatalf("Ping report contained no results")
}
})
})
s.Wait(5)
}

func TestDiagnostics(t *testing.T) {
agent, _ := getAgentnSignaler(t)

report, err := agent.Diagnostics()
if err != nil {
t.Fatalf("Failed to fetch diagnostics: %s", err)
}

if len(report.MemdConns) == 0 {
t.Fatalf("Diagnostics report contained no results")
}

for _, conn := range report.MemdConns {
if conn.RemoteAddr == "" {
t.Fatalf("Diagnostic report contained invalid entry")
}
}
}

func TestMain(m *testing.M) {
SetLogger(DefaultStdioLogger())
flag.Parse()
Expand Down
19 changes: 12 additions & 7 deletions memdclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@ package gocbcore

import (
"encoding/binary"
"sync/atomic"
"time"
)

type memdClient struct {
conn memdConn
opList memdOpMap
errorMap *kvErrorMap
features []HelloFeature
closeNotify chan bool
dcpAckSize int
dcpFlowRecv int
conn memdConn
opList memdOpMap
errorMap *kvErrorMap
features []HelloFeature
closeNotify chan bool
dcpAckSize int
dcpFlowRecv int
lastActivity int64
}

func newMemdClient(conn memdConn) *memdClient {
Expand Down Expand Up @@ -159,6 +162,8 @@ func (client *memdClient) run() {
break
}

atomic.StoreInt64(&client.lastActivity, time.Now().UnixNano())

// We handle DCP no-op's directly here so we can reply immediately.
if resp.memdPacket.Opcode == cmdDcpNoop {
err := client.conn.WritePacket(&memdPacket{
Expand Down

0 comments on commit 17856da

Please sign in to comment.