mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-10 15:20:56 +00:00
e660d683a0
Knowing why a relay server failed to join the pool can be important. This is typically an issue which must be investigated after it occurred, so having logs available is useful. Running with -debug permanently enabled is impractical, due to the amount of traffic that is generated, particularly when data is being transferred. Logging is limited to at most one message per minute, although one message per hour is more likely.
68 lines
1.6 KiB
Go
68 lines
1.6 KiB
Go
// Copyright (C) 2015 Audrius Butkevicius and Contributors (see the CONTRIBUTORS file).
|
|
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
)
|
|
|
|
func poolHandler(pool string, uri *url.URL) {
|
|
if debug {
|
|
log.Println("Joining", pool)
|
|
}
|
|
for {
|
|
var b bytes.Buffer
|
|
json.NewEncoder(&b).Encode(struct {
|
|
URL string `json:"url"`
|
|
}{
|
|
uri.String(),
|
|
})
|
|
|
|
resp, err := http.Post(pool, "application/json", &b)
|
|
if err != nil {
|
|
log.Println("Error joining pool", pool, err)
|
|
} else if resp.StatusCode == 500 {
|
|
if debug {
|
|
bs, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
log.Println("Failed to read response body for", pool, err)
|
|
} else {
|
|
log.Println("Response for", pool, string(bs))
|
|
}
|
|
resp.Body.Close()
|
|
} else {
|
|
log.Println(pool, "failed to join due to an internal server error")
|
|
}
|
|
} else if resp.StatusCode == 429 {
|
|
log.Println(pool, "under load, will retry in a minute")
|
|
time.Sleep(time.Minute)
|
|
continue
|
|
} else if resp.StatusCode == 403 {
|
|
log.Println(pool, "failed to join due to IP address not matching external address. Aborting")
|
|
return
|
|
} else if resp.StatusCode == 200 {
|
|
var x struct {
|
|
EvictionIn time.Duration `json:"evictionIn"`
|
|
}
|
|
err := json.NewDecoder(resp.Body).Decode(&x)
|
|
if err == nil {
|
|
rejoin := x.EvictionIn - (x.EvictionIn / 5)
|
|
log.Println("Joined", pool, "rejoining in", rejoin)
|
|
time.Sleep(rejoin)
|
|
continue
|
|
} else {
|
|
log.Println("Failed to deserialize response", err)
|
|
}
|
|
} else {
|
|
log.Println(pool, "unknown response type from server", resp.StatusCode)
|
|
}
|
|
time.Sleep(time.Hour)
|
|
}
|
|
}
|