client: add batching of sending events to the server
This commit is contained in:
parent
65e692b701
commit
793e4eb6b2
@ -107,6 +107,7 @@ func StartClient(args []string) {
|
|||||||
go PathLocker(globals.db)
|
go PathLocker(globals.db)
|
||||||
|
|
||||||
//spawn goroutines to handle local events
|
//spawn goroutines to handle local events
|
||||||
|
go SendEvents(globals)
|
||||||
localFileUpdates := make(chan *asink.Event)
|
localFileUpdates := make(chan *asink.Event)
|
||||||
go StartWatching(globals.syncDir, localFileUpdates)
|
go StartWatching(globals.syncDir, localFileUpdates)
|
||||||
|
|
||||||
|
60
asink/net.go
60
asink/net.go
@ -19,6 +19,18 @@ import (
|
|||||||
|
|
||||||
const MIN_ERROR_WAIT = 100 // 1/10 of a second
|
const MIN_ERROR_WAIT = 100 // 1/10 of a second
|
||||||
const MAX_ERROR_WAIT = 10000 // 10 seconds
|
const MAX_ERROR_WAIT = 10000 // 10 seconds
|
||||||
|
const MAX_SEND_AT_ONCE = 50 //maximum number of events to send to the server at once
|
||||||
|
|
||||||
|
type sendEventRequest struct {
|
||||||
|
event *asink.Event
|
||||||
|
returnChan *chan error
|
||||||
|
}
|
||||||
|
|
||||||
|
var sendEventsChan chan *sendEventRequest
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
sendEventsChan = make(chan *sendEventRequest)
|
||||||
|
}
|
||||||
|
|
||||||
func AuthenticatedRequest(method, url, bodyType string, body io.Reader, username, password string) (*http.Response, error) {
|
func AuthenticatedRequest(method, url, bodyType string, body io.Reader, username, password string) (*http.Response, error) {
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
@ -39,14 +51,14 @@ func AuthenticatedPost(url, bodyType string, body io.Reader, username, password
|
|||||||
return AuthenticatedRequest("POST", url, bodyType, body, username, password)
|
return AuthenticatedRequest("POST", url, bodyType, body, username, password)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SendEvent(globals AsinkGlobals, event *asink.Event) error {
|
func actuallySendEvents(globals AsinkGlobals, events []*asink.Event) error {
|
||||||
url := "http://" + globals.server + ":" + strconv.Itoa(int(globals.port)) + "/events/"
|
url := "http://" + globals.server + ":" + strconv.Itoa(int(globals.port)) + "/events/"
|
||||||
|
|
||||||
//construct json payload
|
//construct json payload
|
||||||
events := asink.EventList{
|
eventStruct := asink.EventList{
|
||||||
Events: []*asink.Event{event},
|
Events: events,
|
||||||
}
|
}
|
||||||
b, err := json.Marshal(events)
|
b, err := json.Marshal(eventStruct)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -76,6 +88,46 @@ func SendEvent(globals AsinkGlobals, event *asink.Event) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SendEvents(globals AsinkGlobals) {
|
||||||
|
for {
|
||||||
|
//make arrays to hold events and return channels
|
||||||
|
events := make([]*asink.Event, 1)
|
||||||
|
returnChans := make([]*chan error, 1)
|
||||||
|
|
||||||
|
//wait for the first event
|
||||||
|
request := <-sendEventsChan
|
||||||
|
events[0] = request.event
|
||||||
|
returnChans[0] = request.returnChan
|
||||||
|
|
||||||
|
//get any other events that are currently available to send
|
||||||
|
possiblyMoreEvents := true
|
||||||
|
for possiblyMoreEvents && len(events) <= MAX_SEND_AT_ONCE {
|
||||||
|
select {
|
||||||
|
case request = <-sendEventsChan:
|
||||||
|
events = append(events, request.event)
|
||||||
|
returnChans = append(returnChans, request.returnChan)
|
||||||
|
default:
|
||||||
|
possiblyMoreEvents = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//send all these events
|
||||||
|
err := actuallySendEvents(globals, events)
|
||||||
|
|
||||||
|
//send back any errors (or hopefully nil) to their respective channels
|
||||||
|
for _, c := range returnChans {
|
||||||
|
*c <- err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendEvent(globals AsinkGlobals, event *asink.Event) error {
|
||||||
|
responseChan := make(chan error)
|
||||||
|
request := sendEventRequest{event, &responseChan}
|
||||||
|
sendEventsChan <- &request
|
||||||
|
return <-responseChan
|
||||||
|
}
|
||||||
|
|
||||||
func GetEvents(globals AsinkGlobals, events chan *asink.Event) {
|
func GetEvents(globals AsinkGlobals, events chan *asink.Event) {
|
||||||
url := "http://" + globals.server + ":" + strconv.Itoa(int(globals.port)) + "/events/"
|
url := "http://" + globals.server + ":" + strconv.Itoa(int(globals.port)) + "/events/"
|
||||||
var successiveErrors uint = 0
|
var successiveErrors uint = 0
|
||||||
|
Loading…
Reference in New Issue
Block a user