mirror of
https://github.com/octoleo/syncthing.git
synced 2025-02-02 03:48:26 +00:00
Don't leak request slots (fixes #483)
This commit is contained in:
parent
5bcf26e324
commit
e1f1ae041f
@ -152,10 +152,7 @@ func (i *inifiteReader) Read(bs []byte) (int, error) {
|
|||||||
// rm -rf
|
// rm -rf
|
||||||
func removeAll(dirs ...string) error {
|
func removeAll(dirs ...string) error {
|
||||||
for _, dir := range dirs {
|
for _, dir := range dirs {
|
||||||
err := os.RemoveAll(dir)
|
os.RemoveAll(dir)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
package integration_test
|
package integration_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@ -39,19 +40,19 @@ func TestRestartSenderDuringTransfer(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func testRestartDuringTransfer(t *testing.T, restartSender, restartReceiver bool, senderDelay, receiverDelay time.Duration) {
|
func testRestartDuringTransfer(t *testing.T, restartSender, restartReceiver bool, senderDelay, receiverDelay time.Duration) {
|
||||||
t.Log("Cleaning...")
|
log.Println("Cleaning...")
|
||||||
err := removeAll("s1", "s2", "f1/index", "f2/index")
|
err := removeAll("s1", "s2", "f1/index", "f2/index")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Log("Generating files...")
|
log.Println("Generating files...")
|
||||||
err = generateFiles("s1", 1000, 20, "../bin/syncthing")
|
err = generateFiles("s1", 1000, 20, "../bin/syncthing")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Log("Starting up...")
|
log.Println("Starting up...")
|
||||||
sender := syncthingProcess{ // id1
|
sender := syncthingProcess{ // id1
|
||||||
log: "1.out",
|
log: "1.out",
|
||||||
argv: []string{"-home", "f1"},
|
argv: []string{"-home", "f1"},
|
||||||
@ -94,12 +95,12 @@ func testRestartDuringTransfer(t *testing.T, restartSender, restartReceiver bool
|
|||||||
|
|
||||||
if curComp > prevComp {
|
if curComp > prevComp {
|
||||||
if restartReceiver {
|
if restartReceiver {
|
||||||
t.Logf("Stopping receiver...")
|
log.Printf("Stopping receiver...")
|
||||||
receiver.stop()
|
receiver.stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
if restartSender {
|
if restartSender {
|
||||||
t.Logf("Stopping sender...")
|
log.Printf("Stopping sender...")
|
||||||
sender.stop()
|
sender.stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +110,7 @@ func testRestartDuringTransfer(t *testing.T, restartSender, restartReceiver bool
|
|||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go func() {
|
go func() {
|
||||||
time.Sleep(receiverDelay)
|
time.Sleep(receiverDelay)
|
||||||
t.Logf("Starting receiver...")
|
log.Printf("Starting receiver...")
|
||||||
receiver.start()
|
receiver.start()
|
||||||
wg.Done()
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
@ -119,7 +120,7 @@ func testRestartDuringTransfer(t *testing.T, restartSender, restartReceiver bool
|
|||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go func() {
|
go func() {
|
||||||
time.Sleep(senderDelay)
|
time.Sleep(senderDelay)
|
||||||
t.Logf("Starting sender...")
|
log.Printf("Starting sender...")
|
||||||
sender.start()
|
sender.start()
|
||||||
wg.Done()
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
@ -133,7 +134,7 @@ func testRestartDuringTransfer(t *testing.T, restartSender, restartReceiver bool
|
|||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Log("Comparing directories...")
|
log.Println("Comparing directories...")
|
||||||
err = compareDirectories("s1", "s2")
|
err = compareDirectories("s1", "s2")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -26,6 +26,7 @@ package model
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -145,8 +146,11 @@ func (p *puller) run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
// Run the pulling loop as long as there are blocks to fetch
|
if sc, sl := cap(p.requestSlots), len(p.requestSlots); sl != sc {
|
||||||
|
panic(fmt.Sprintf("Incorrect number of slots; %d != %d", sl, sc))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the pulling loop as long as there are blocks to fetch
|
||||||
prevVer, queued = p.queueNeededBlocks(prevVer)
|
prevVer, queued = p.queueNeededBlocks(prevVer)
|
||||||
if queued > 0 {
|
if queued > 0 {
|
||||||
p.errors = 0
|
p.errors = 0
|
||||||
@ -169,6 +173,7 @@ func (p *puller) run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if p.errors > 0 && p.errors >= queued {
|
if p.errors > 0 && p.errors >= queued {
|
||||||
|
p.requestSlots <- true
|
||||||
break pull
|
break pull
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,6 +186,7 @@ func (p *puller) run() {
|
|||||||
if debug {
|
if debug {
|
||||||
l.Debugf("%q: pulling loop done", p.repoCfg.ID)
|
l.Debugf("%q: pulling loop done", p.repoCfg.ID)
|
||||||
}
|
}
|
||||||
|
p.requestSlots <- true
|
||||||
break pull
|
break pull
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user