1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-08-12 09:00:54 +00:00

Remove response cache for bunched commands, simplify locks

This commit is contained in:
Kane York 2015-11-04 12:09:24 -08:00
parent 64cc80c79a
commit d09e4e592c

View file

@ -357,77 +357,41 @@ type BunchSubscriberList struct {
var PendingBunchedRequests map[BunchedRequest]*BunchSubscriberList = make(map[BunchedRequest]*BunchSubscriberList) var PendingBunchedRequests map[BunchedRequest]*BunchSubscriberList = make(map[BunchedRequest]*BunchSubscriberList)
var PendingBunchLock sync.Mutex var PendingBunchLock sync.Mutex
var CompletedBunchedRequests map[BunchedRequest]BunchedResponse = make(map[BunchedRequest]BunchedResponse)
var CompletedBunchLock sync.RWMutex
func bunchingJanitor() {
for {
time.Sleep(5 * time.Minute)
keepIfAfter := time.Now().Add(-5 * time.Minute)
CompletedBunchLock.Lock()
for req, resp := range CompletedBunchedRequests {
if !resp.Timestamp.After(keepIfAfter) {
delete(CompletedBunchedRequests, req)
}
}
CompletedBunchLock.Unlock()
}
}
func HandleBunchedRemoteCommand(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) { func HandleBunchedRemoteCommand(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
br := BunchedRequestFromCM(&msg) br := BunchedRequestFromCM(&msg)
CompletedBunchLock.RLock()
resp, ok := CompletedBunchedRequests[br]
CompletedBunchLock.RUnlock()
if ok && resp.Timestamp.After(time.Now().Add(-5*time.Minute)) {
return SuccessMessageFromString(resp.Response), nil
} else if ok {
// Entry expired, let's remove it...
CompletedBunchLock.Lock()
// recheck condition
resp, ok = CompletedBunchedRequests[br]
if ok && !resp.Timestamp.After(time.Now().Add(-5*time.Minute)) {
delete(CompletedBunchedRequests, br)
}
CompletedBunchLock.Unlock()
}
PendingBunchLock.Lock() PendingBunchLock.Lock()
defer PendingBunchLock.Unlock()
list, ok := PendingBunchedRequests[br] list, ok := PendingBunchedRequests[br]
if ok { if ok {
list.Lock() list.Lock()
AddToSliceB(&list.Members, client, msg.MessageID) AddToSliceB(&list.Members, client, msg.MessageID)
list.Unlock() list.Unlock()
PendingBunchLock.Unlock()
client.MsgChannelKeepalive.Add(1)
return ClientMessage{Command: AsyncResponseCommand}, nil return ClientMessage{Command: AsyncResponseCommand}, nil
} }
PendingBunchedRequests[br] = &BunchSubscriberList{Members: []BunchSubscriber{{Client: client, MessageID: msg.MessageID}}} PendingBunchedRequests[br] = &BunchSubscriberList{Members: []BunchSubscriber{{Client: client, MessageID: msg.MessageID}}}
PendingBunchLock.Unlock()
client.MsgChannelKeepalive.Add(1)
go func(request BunchedRequest) { go func(request BunchedRequest) {
resp, err := RequestRemoteDataCached(string(request.Command), request.Param, AuthInfo{}) resp, err := RequestRemoteDataCached(string(request.Command), request.Param, AuthInfo{})
PendingBunchLock.Lock() // Prevent new signups
var msg ClientMessage var msg ClientMessage
if err == nil { if err == nil {
CompletedBunchLock.Lock() // mutex on map msg.Command = SuccessCommand
CompletedBunchedRequests[request] = BunchedResponse{Response: resp, Timestamp: time.Now()} msg.origArguments = resp
CompletedBunchLock.Unlock() msg.parseOrigArguments()
msg = SuccessMessageFromString(resp)
} else { } else {
msg.Command = ErrorCommand msg.Command = ErrorCommand
msg.Arguments = err.Error() msg.Arguments = err.Error()
} }
PendingBunchLock.Lock()
bsl := PendingBunchedRequests[request] bsl := PendingBunchedRequests[request]
delete(PendingBunchedRequests, request)
PendingBunchLock.Unlock()
bsl.Lock() bsl.Lock()
for _, member := range bsl.Members { for _, member := range bsl.Members {
msg.MessageID = member.MessageID msg.MessageID = member.MessageID
@ -435,12 +399,8 @@ func HandleBunchedRemoteCommand(conn *websocket.Conn, client *ClientInfo, msg Cl
case member.Client.MessageChannel <- msg: case member.Client.MessageChannel <- msg:
case <-member.Client.MsgChannelIsDone: case <-member.Client.MsgChannelIsDone:
} }
member.Client.MsgChannelKeepalive.Done()
} }
bsl.Unlock() bsl.Unlock()
delete(PendingBunchedRequests, request)
PendingBunchLock.Unlock()
}(br) }(br)
return ClientMessage{Command: AsyncResponseCommand}, nil return ClientMessage{Command: AsyncResponseCommand}, nil