-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmsgbuf.go
More file actions
56 lines (50 loc) · 1.84 KB
/
msgbuf.go
File metadata and controls
56 lines (50 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package rpcz
const (
KeepFirstNStreamingMessages = 5
KeepLastNStreamingMessages = 5
)
type messageBuffer struct {
messages [KeepFirstNStreamingMessages + KeepLastNStreamingMessages]capturedMessage
messageCount uint64
huge bool
}
func (mb *messageBuffer) addMessage(m capturedMessage) {
if mb.messageCount < KeepFirstNStreamingMessages+KeepLastNStreamingMessages {
mb.messages[mb.messageCount] = m
} else {
mb.messages[KeepFirstNStreamingMessages+((mb.messageCount-KeepFirstNStreamingMessages)%KeepLastNStreamingMessages)] = m
}
mb.messageCount++
}
func (mb *messageBuffer) firstMessages() []capturedMessage {
if mb.messageCount < KeepFirstNStreamingMessages {
return mb.messages[:mb.messageCount]
}
return mb.messages[:KeepFirstNStreamingMessages]
}
func (mb *messageBuffer) lastMessages() []capturedMessage {
if mb.huge || mb.messageCount <= KeepFirstNStreamingMessages {
return nil
}
if mb.messageCount-KeepFirstNStreamingMessages < KeepLastNStreamingMessages {
// Between 5-10 messages, no wraparounds happened yet. Simply slice it.
return mb.messages[KeepFirstNStreamingMessages:mb.messageCount]
}
if (mb.messageCount-KeepFirstNStreamingMessages)%KeepLastNStreamingMessages == 0 {
// We can avoid copying.
return mb.messages[KeepFirstNStreamingMessages:]
}
ret := make([]capturedMessage, KeepLastNStreamingMessages)
p := copy(ret, mb.messages[KeepFirstNStreamingMessages+((mb.messageCount-KeepFirstNStreamingMessages)%KeepLastNStreamingMessages):])
copy(ret[p:], mb.messages[KeepLastNStreamingMessages:])
return ret
}
func (mb *messageBuffer) droppedMessages() uint64 {
if mb.messageCount <= KeepFirstNStreamingMessages+KeepLastNStreamingMessages {
return 0
}
if mb.huge {
return mb.messageCount - KeepFirstNStreamingMessages
}
return mb.messageCount - KeepFirstNStreamingMessages - KeepLastNStreamingMessages
}