-
Notifications
You must be signed in to change notification settings - Fork 472
Client stats #63
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Client stats #63
Changes from 2 commits
b18b8d0
44ed1a7
e206b6e
7886924
f867c99
bc664df
551aad2
a41fca8
4fd84d0
2f97c78
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -25,10 +25,10 @@ import ( | |
| "io" | ||
| "io/ioutil" | ||
| "net" | ||
|
|
||
| "strconv" | ||
| "strings" | ||
| "sync" | ||
| "sync/atomic" | ||
| "time" | ||
| ) | ||
|
|
||
|
|
@@ -129,6 +129,12 @@ func NewFromSelector(ss ServerSelector) *Client { | |
| return &Client{selector: ss} | ||
| } | ||
|
|
||
| // Stats contains statistic about connections being used by client. | ||
| type Stats struct { | ||
| ActiveConns int | ||
| IdleConns int | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. document these two also. |
||
| } | ||
|
|
||
| // Client is a memcache client. | ||
| // It is safe for unlocked use by multiple concurrent goroutines. | ||
| type Client struct { | ||
|
|
@@ -144,9 +150,12 @@ type Client struct { | |
| // be set to a number higher than your peak parallel requests. | ||
| MaxIdleConns int | ||
|
|
||
| // number of currently used connections | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. add docs that this must be accessed atomically |
||
| activeConns int32 | ||
|
|
||
| selector ServerSelector | ||
|
|
||
| lk sync.Mutex | ||
| lk sync.RWMutex | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. doesn't seem worth it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe more straightforward to just make idleConns an atomic int as well and inc/dec when |
||
| freeconn map[string][]*conn | ||
| } | ||
|
|
||
|
|
@@ -193,6 +202,7 @@ func (cn *conn) extendDeadline() { | |
| // cache miss). The purpose is to not recycle TCP connections that | ||
| // are bad. | ||
| func (cn *conn) condRelease(err *error) { | ||
| atomic.AddInt32(&cn.c.activeConns, -1) | ||
| if *err == nil || resumableError(*err) { | ||
| cn.release() | ||
| } else { | ||
|
|
@@ -276,6 +286,7 @@ func (c *Client) getConn(addr net.Addr) (*conn, error) { | |
| cn, ok := c.getFreeConn(addr) | ||
| if ok { | ||
| cn.extendDeadline() | ||
| atomic.AddInt32(&c.activeConns, 1) | ||
| return cn, nil | ||
| } | ||
| nc, err := c.dial(addr) | ||
|
|
@@ -289,6 +300,7 @@ func (c *Client) getConn(addr net.Addr) (*conn, error) { | |
| c: c, | ||
| } | ||
| cn.extendDeadline() | ||
| atomic.AddInt32(&c.activeConns, 1) | ||
| return cn, nil | ||
| } | ||
|
|
||
|
|
@@ -465,6 +477,21 @@ func (c *Client) GetMulti(keys []string) (map[string]*Item, error) { | |
| return m, err | ||
| } | ||
|
|
||
| // Stats returns current statistic | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the current statistics. (with trailing period) |
||
| func (c *Client) Stats() Stats { | ||
| c.lk.RLock() | ||
| idleConns := 0 | ||
| for _, conns := range c.freeconn { | ||
| idleConns += len(conns) | ||
| } | ||
| c.lk.RUnlock() | ||
|
|
||
| return Stats{ | ||
| ActiveConns: int(atomic.LoadInt32(&c.activeConns)), | ||
| IdleConns: idleConns, | ||
| } | ||
| } | ||
|
|
||
| // parseGetResponse reads a GET response from r and calls cb for each | ||
| // read and allocated Item | ||
| func parseGetResponse(r *bufio.Reader, cb func(*Item)) error { | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
statistics (plural)