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:
parent
64cc80c79a
commit
d09e4e592c
1 changed files with 8 additions and 48 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue