mirror of
https://github.com/octoleo/syncthing.git
synced 2025-01-05 08:02:13 +00:00
wip
This commit is contained in:
parent
b64fbdd1c1
commit
5912f32a34
@ -33,7 +33,7 @@ func newFakeConnection(id protocol.DeviceID, model Model) *fakeConnection {
|
|||||||
f.RequestCalls(func(ctx context.Context, folder, name string, blockNo int, offset int64, size int, hash []byte, weakHash uint32, fromTemporary bool) ([]byte, error) {
|
f.RequestCalls(func(ctx context.Context, folder, name string, blockNo int, offset int64, size int, hash []byte, weakHash uint32, fromTemporary bool) ([]byte, error) {
|
||||||
return f.fileData[name], nil
|
return f.fileData[name], nil
|
||||||
})
|
})
|
||||||
f.IDReturns(id)
|
f.DeviceIDReturns(id)
|
||||||
f.ConnectionIDReturns(rand.String(16))
|
f.ConnectionIDReturns(rand.String(16))
|
||||||
f.CloseCalls(func(err error) {
|
f.CloseCalls(func(err error) {
|
||||||
f.closeOnce.Do(func() {
|
f.closeOnce.Do(func() {
|
||||||
|
@ -56,10 +56,10 @@ func newIndexHandler(conn protocol.Connection, downloads *deviceDownloadState, f
|
|||||||
// the IndexID, or something else weird has
|
// the IndexID, or something else weird has
|
||||||
// happened. We send a full index to reset the
|
// happened. We send a full index to reset the
|
||||||
// situation.
|
// situation.
|
||||||
l.Infof("Device %v folder %s is delta index compatible, but seems out of sync with reality", conn.ID().Short(), folder.Description())
|
l.Infof("Device %v folder %s is delta index compatible, but seems out of sync with reality", conn.DeviceID().Short(), folder.Description())
|
||||||
startSequence = 0
|
startSequence = 0
|
||||||
} else {
|
} else {
|
||||||
l.Debugf("Device %v folder %s is delta index compatible (mlv=%d)", conn.ID().Short(), folder.Description(), startInfo.local.MaxSequence)
|
l.Debugf("Device %v folder %s is delta index compatible (mlv=%d)", conn.DeviceID().Short(), folder.Description(), startInfo.local.MaxSequence)
|
||||||
startSequence = startInfo.local.MaxSequence
|
startSequence = startInfo.local.MaxSequence
|
||||||
}
|
}
|
||||||
} else if startInfo.local.IndexID != 0 {
|
} else if startInfo.local.IndexID != 0 {
|
||||||
@ -67,10 +67,10 @@ func newIndexHandler(conn protocol.Connection, downloads *deviceDownloadState, f
|
|||||||
// not the right one. Either they are confused or we
|
// not the right one. Either they are confused or we
|
||||||
// must have reset our database since last talking to
|
// must have reset our database since last talking to
|
||||||
// them. We'll start with a full index transfer.
|
// them. We'll start with a full index transfer.
|
||||||
l.Infof("Device %v folder %s has mismatching index ID for us (%v != %v)", conn.ID().Short(), folder.Description(), startInfo.local.IndexID, myIndexID)
|
l.Infof("Device %v folder %s has mismatching index ID for us (%v != %v)", conn.DeviceID().Short(), folder.Description(), startInfo.local.IndexID, myIndexID)
|
||||||
startSequence = 0
|
startSequence = 0
|
||||||
} else {
|
} else {
|
||||||
l.Debugf("Device %v folder %s has no index ID for us", conn.ID().Short(), folder.Description())
|
l.Debugf("Device %v folder %s has no index ID for us", conn.DeviceID().Short(), folder.Description())
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the other side's description of themselves. We
|
// This is the other side's description of themselves. We
|
||||||
@ -78,23 +78,23 @@ func newIndexHandler(conn protocol.Connection, downloads *deviceDownloadState, f
|
|||||||
// otherwise we drop our old index data and expect to get a
|
// otherwise we drop our old index data and expect to get a
|
||||||
// completely new set.
|
// completely new set.
|
||||||
|
|
||||||
theirIndexID := fset.IndexID(conn.ID())
|
theirIndexID := fset.IndexID(conn.DeviceID())
|
||||||
if startInfo.remote.IndexID == 0 {
|
if startInfo.remote.IndexID == 0 {
|
||||||
// They're not announcing an index ID. This means they
|
// They're not announcing an index ID. This means they
|
||||||
// do not support delta indexes and we should clear any
|
// do not support delta indexes and we should clear any
|
||||||
// information we have from them before accepting their
|
// information we have from them before accepting their
|
||||||
// index, which will presumably be a full index.
|
// index, which will presumably be a full index.
|
||||||
l.Debugf("Device %v folder %s does not announce an index ID", conn.ID().Short(), folder.Description())
|
l.Debugf("Device %v folder %s does not announce an index ID", conn.DeviceID().Short(), folder.Description())
|
||||||
fset.Drop(conn.ID())
|
fset.Drop(conn.DeviceID())
|
||||||
} else if startInfo.remote.IndexID != theirIndexID {
|
} else if startInfo.remote.IndexID != theirIndexID {
|
||||||
// The index ID we have on file is not what they're
|
// The index ID we have on file is not what they're
|
||||||
// announcing. They must have reset their database and
|
// announcing. They must have reset their database and
|
||||||
// will probably send us a full index. We drop any
|
// will probably send us a full index. We drop any
|
||||||
// information we have and remember this new index ID
|
// information we have and remember this new index ID
|
||||||
// instead.
|
// instead.
|
||||||
l.Infof("Device %v folder %s has a new index ID (%v)", conn.ID().Short(), folder.Description(), startInfo.remote.IndexID)
|
l.Infof("Device %v folder %s has a new index ID (%v)", conn.DeviceID().Short(), folder.Description(), startInfo.remote.IndexID)
|
||||||
fset.Drop(conn.ID())
|
fset.Drop(conn.DeviceID())
|
||||||
fset.SetIndexID(conn.ID(), startInfo.remote.IndexID)
|
fset.SetIndexID(conn.DeviceID(), startInfo.remote.IndexID)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &indexHandler{
|
return &indexHandler{
|
||||||
@ -129,12 +129,12 @@ func (s *indexHandler) waitForFileset(ctx context.Context) (*db.FileSet, error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *indexHandler) Serve(ctx context.Context) (err error) {
|
func (s *indexHandler) Serve(ctx context.Context) (err error) {
|
||||||
l.Infof("Starting index handler for %s to %s at %s (slv=%d)", s.folder, s.conn.ID().Short(), s.conn, s.prevSequence)
|
l.Infof("Starting index handler for %s to %s at %s (slv=%d)", s.folder, s.conn.DeviceID().Short(), s.conn, s.prevSequence)
|
||||||
stop := make(chan struct{})
|
stop := make(chan struct{})
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
err = svcutil.NoRestartErr(err)
|
err = svcutil.NoRestartErr(err)
|
||||||
l.Infof("Exiting index handler for %s to %s at %s: %v", s.folder, s.conn.ID().Short(), s.conn, err)
|
l.Infof("Exiting index handler for %s to %s at %s: %v", s.folder, s.conn.DeviceID().Short(), s.conn, err)
|
||||||
close(stop)
|
close(stop)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -320,7 +320,7 @@ func (s *indexHandler) sendIndexTo(ctx context.Context, fset *db.FileSet) error
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *indexHandler) receive(fs []protocol.FileInfo, update bool, op string) error {
|
func (s *indexHandler) receive(fs []protocol.FileInfo, update bool, op string) error {
|
||||||
deviceID := s.conn.ID()
|
deviceID := s.conn.DeviceID()
|
||||||
|
|
||||||
s.cond.L.Lock()
|
s.cond.L.Lock()
|
||||||
paused := s.paused
|
paused := s.paused
|
||||||
@ -381,7 +381,7 @@ func prepareFileInfoForIndex(f protocol.FileInfo) protocol.FileInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *indexHandler) String() string {
|
func (s *indexHandler) String() string {
|
||||||
return fmt.Sprintf("indexHandler@%p for %s to %s at %s", s, s.folder, s.conn.ID().Short(), s.conn)
|
return fmt.Sprintf("indexHandler@%p for %s to %s at %s", s, s.folder, s.conn.DeviceID().Short(), s.conn)
|
||||||
}
|
}
|
||||||
|
|
||||||
type indexHandlerRegistry struct {
|
type indexHandlerRegistry struct {
|
||||||
@ -426,7 +426,7 @@ func newIndexHandlerRegistry(conn protocol.Connection, downloads *deviceDownload
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *indexHandlerRegistry) String() string {
|
func (r *indexHandlerRegistry) String() string {
|
||||||
return fmt.Sprintf("indexHandlerRegistry/%v", r.conn.ID().Short())
|
return fmt.Sprintf("indexHandlerRegistry/%v", r.conn.DeviceID().Short())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *indexHandlerRegistry) GetSupervisor() *suture.Supervisor {
|
func (r *indexHandlerRegistry) GetSupervisor() *suture.Supervisor {
|
||||||
@ -459,11 +459,11 @@ func (r *indexHandlerRegistry) AddIndexInfo(folder string, startInfo *clusterCon
|
|||||||
if is, ok := r.indexHandlers[folder]; ok {
|
if is, ok := r.indexHandlers[folder]; ok {
|
||||||
r.sup.RemoveAndWait(is.token, 0)
|
r.sup.RemoveAndWait(is.token, 0)
|
||||||
delete(r.indexHandlers, folder)
|
delete(r.indexHandlers, folder)
|
||||||
l.Debugf("Removed index sender for device %v and folder %v due to added pending", r.conn.ID().Short(), folder)
|
l.Debugf("Removed index sender for device %v and folder %v due to added pending", r.conn.DeviceID().Short(), folder)
|
||||||
}
|
}
|
||||||
folderState, ok := r.folderStates[folder]
|
folderState, ok := r.folderStates[folder]
|
||||||
if !ok {
|
if !ok {
|
||||||
l.Debugf("Pending index handler for device %v and folder %v", r.conn.ID().Short(), folder)
|
l.Debugf("Pending index handler for device %v and folder %v", r.conn.DeviceID().Short(), folder)
|
||||||
r.startInfos[folder] = startInfo
|
r.startInfos[folder] = startInfo
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -476,13 +476,13 @@ func (r *indexHandlerRegistry) Remove(folder string) {
|
|||||||
r.mut.Lock()
|
r.mut.Lock()
|
||||||
defer r.mut.Unlock()
|
defer r.mut.Unlock()
|
||||||
|
|
||||||
l.Debugf("Removing index handler for device %v and folder %v", r.conn.ID().Short(), folder)
|
l.Debugf("Removing index handler for device %v and folder %v", r.conn.DeviceID().Short(), folder)
|
||||||
if is, ok := r.indexHandlers[folder]; ok {
|
if is, ok := r.indexHandlers[folder]; ok {
|
||||||
r.sup.RemoveAndWait(is.token, 0)
|
r.sup.RemoveAndWait(is.token, 0)
|
||||||
delete(r.indexHandlers, folder)
|
delete(r.indexHandlers, folder)
|
||||||
}
|
}
|
||||||
delete(r.startInfos, folder)
|
delete(r.startInfos, folder)
|
||||||
l.Debugf("Removed index handler for device %v and folder %v", r.conn.ID().Short(), folder)
|
l.Debugf("Removed index handler for device %v and folder %v", r.conn.DeviceID().Short(), folder)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveAllExcept stops all running index handlers and removes those pending to be started,
|
// RemoveAllExcept stops all running index handlers and removes those pending to be started,
|
||||||
@ -496,13 +496,13 @@ func (r *indexHandlerRegistry) RemoveAllExcept(except map[string]remoteFolderSta
|
|||||||
if _, ok := except[folder]; !ok {
|
if _, ok := except[folder]; !ok {
|
||||||
r.sup.RemoveAndWait(is.token, 0)
|
r.sup.RemoveAndWait(is.token, 0)
|
||||||
delete(r.indexHandlers, folder)
|
delete(r.indexHandlers, folder)
|
||||||
l.Debugf("Removed index handler for device %v and folder %v (removeAllExcept)", r.conn.ID().Short(), folder)
|
l.Debugf("Removed index handler for device %v and folder %v (removeAllExcept)", r.conn.DeviceID().Short(), folder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for folder := range r.startInfos {
|
for folder := range r.startInfos {
|
||||||
if _, ok := except[folder]; !ok {
|
if _, ok := except[folder]; !ok {
|
||||||
delete(r.startInfos, folder)
|
delete(r.startInfos, folder)
|
||||||
l.Debugf("Removed pending index handler for device %v and folder %v (removeAllExcept)", r.conn.ID().Short(), folder)
|
l.Debugf("Removed pending index handler for device %v and folder %v (removeAllExcept)", r.conn.DeviceID().Short(), folder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -511,7 +511,7 @@ func (r *indexHandlerRegistry) RemoveAllExcept(except map[string]remoteFolderSta
|
|||||||
// changes. The exception being if the folder is removed entirely, then call
|
// changes. The exception being if the folder is removed entirely, then call
|
||||||
// Remove. The fset and runner arguments may be nil, if given folder is paused.
|
// Remove. The fset and runner arguments may be nil, if given folder is paused.
|
||||||
func (r *indexHandlerRegistry) RegisterFolderState(folder config.FolderConfiguration, fset *db.FileSet, runner service) {
|
func (r *indexHandlerRegistry) RegisterFolderState(folder config.FolderConfiguration, fset *db.FileSet, runner service) {
|
||||||
if !folder.SharedWith(r.conn.ID()) {
|
if !folder.SharedWith(r.conn.DeviceID()) {
|
||||||
r.Remove(folder.ID)
|
r.Remove(folder.ID)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -528,13 +528,13 @@ func (r *indexHandlerRegistry) RegisterFolderState(folder config.FolderConfigura
|
|||||||
// folderPausedLocked stops a running index handler.
|
// folderPausedLocked stops a running index handler.
|
||||||
// It is a noop if the folder isn't known or has not been started yet.
|
// It is a noop if the folder isn't known or has not been started yet.
|
||||||
func (r *indexHandlerRegistry) folderPausedLocked(folder string) {
|
func (r *indexHandlerRegistry) folderPausedLocked(folder string) {
|
||||||
l.Debugf("Pausing index handler for device %v and folder %v", r.conn.ID().Short(), folder)
|
l.Debugf("Pausing index handler for device %v and folder %v", r.conn.DeviceID().Short(), folder)
|
||||||
delete(r.folderStates, folder)
|
delete(r.folderStates, folder)
|
||||||
if is, ok := r.indexHandlers[folder]; ok {
|
if is, ok := r.indexHandlers[folder]; ok {
|
||||||
is.pause()
|
is.pause()
|
||||||
l.Debugf("Paused index handler for device %v and folder %v", r.conn.ID().Short(), folder)
|
l.Debugf("Paused index handler for device %v and folder %v", r.conn.DeviceID().Short(), folder)
|
||||||
} else {
|
} else {
|
||||||
l.Debugf("No index handler for device %v and folder %v to pause", r.conn.ID().Short(), folder)
|
l.Debugf("No index handler for device %v and folder %v to pause", r.conn.DeviceID().Short(), folder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -553,16 +553,16 @@ func (r *indexHandlerRegistry) folderRunningLocked(folder config.FolderConfigura
|
|||||||
if isOk {
|
if isOk {
|
||||||
r.sup.RemoveAndWait(is.token, 0)
|
r.sup.RemoveAndWait(is.token, 0)
|
||||||
delete(r.indexHandlers, folder.ID)
|
delete(r.indexHandlers, folder.ID)
|
||||||
l.Debugf("Removed index handler for device %v and folder %v in resume", r.conn.ID().Short(), folder.ID)
|
l.Debugf("Removed index handler for device %v and folder %v in resume", r.conn.DeviceID().Short(), folder.ID)
|
||||||
}
|
}
|
||||||
r.startLocked(folder, fset, runner, info)
|
r.startLocked(folder, fset, runner, info)
|
||||||
delete(r.startInfos, folder.ID)
|
delete(r.startInfos, folder.ID)
|
||||||
l.Debugf("Started index handler for device %v and folder %v in resume", r.conn.ID().Short(), folder.ID)
|
l.Debugf("Started index handler for device %v and folder %v in resume", r.conn.DeviceID().Short(), folder.ID)
|
||||||
} else if isOk {
|
} else if isOk {
|
||||||
l.Debugf("Resuming index handler for device %v and folder %v", r.conn.ID().Short(), folder)
|
l.Debugf("Resuming index handler for device %v and folder %v", r.conn.DeviceID().Short(), folder)
|
||||||
is.resume(fset, runner)
|
is.resume(fset, runner)
|
||||||
} else {
|
} else {
|
||||||
l.Debugf("Not resuming index handler for device %v and folder %v as none is paused and there is no start info", r.conn.ID().Short(), folder.ID)
|
l.Debugf("Not resuming index handler for device %v and folder %v as none is paused and there is no start info", r.conn.DeviceID().Short(), folder.ID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1181,7 +1181,7 @@ func (m *model) handleIndex(conn protocol.Connection, folder string, fs []protoc
|
|||||||
op += " update"
|
op += " update"
|
||||||
}
|
}
|
||||||
|
|
||||||
deviceID := conn.ID()
|
deviceID := conn.DeviceID()
|
||||||
l.Debugf("%v (in): %s / %q: %d files", op, deviceID, folder, len(fs))
|
l.Debugf("%v (in): %s / %q: %d files", op, deviceID, folder, len(fs))
|
||||||
|
|
||||||
if cfg, ok := m.cfg.Folder(folder); !ok || !cfg.SharedWith(deviceID) {
|
if cfg, ok := m.cfg.Folder(folder); !ok || !cfg.SharedWith(deviceID) {
|
||||||
@ -1216,7 +1216,7 @@ func (m *model) ClusterConfig(conn protocol.Connection, cm protocol.ClusterConfi
|
|||||||
// Also, collect a list of folders we do share, and if he's interested in
|
// Also, collect a list of folders we do share, and if he's interested in
|
||||||
// temporary indexes, subscribe the connection.
|
// temporary indexes, subscribe the connection.
|
||||||
|
|
||||||
deviceID := conn.ID()
|
deviceID := conn.DeviceID()
|
||||||
connID := conn.ConnectionID()
|
connID := conn.ConnectionID()
|
||||||
l.Debugf("Handling ClusterConfig from %v/%s", deviceID.Short(), connID)
|
l.Debugf("Handling ClusterConfig from %v/%s", deviceID.Short(), connID)
|
||||||
|
|
||||||
@ -1342,7 +1342,7 @@ func (m *model) ClusterConfig(conn protocol.Connection, cm protocol.ClusterConfi
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *model) ensureIndexHandler(conn protocol.Connection) *indexHandlerRegistry {
|
func (m *model) ensureIndexHandler(conn protocol.Connection) *indexHandlerRegistry {
|
||||||
deviceID := conn.ID()
|
deviceID := conn.DeviceID()
|
||||||
connID := conn.ConnectionID()
|
connID := conn.ConnectionID()
|
||||||
|
|
||||||
m.pmut.Lock()
|
m.pmut.Lock()
|
||||||
@ -1629,7 +1629,7 @@ func (m *model) sendClusterConfig(ids []protocol.DeviceID) {
|
|||||||
m.pmut.RUnlock()
|
m.pmut.RUnlock()
|
||||||
// Generating cluster-configs acquires fmut -> must happen outside of pmut.
|
// Generating cluster-configs acquires fmut -> must happen outside of pmut.
|
||||||
for _, conn := range ccConns {
|
for _, conn := range ccConns {
|
||||||
cm, passwords := m.generateClusterConfig(conn.ID())
|
cm, passwords := m.generateClusterConfig(conn.DeviceID())
|
||||||
conn.SetFolderPasswords(passwords)
|
conn.SetFolderPasswords(passwords)
|
||||||
go conn.ClusterConfig(cm)
|
go conn.ClusterConfig(cm)
|
||||||
}
|
}
|
||||||
@ -1861,7 +1861,7 @@ func (m *model) introduceDevice(device protocol.Device, introducerCfg config.Dev
|
|||||||
// Closed is called when a connection has been closed
|
// Closed is called when a connection has been closed
|
||||||
func (m *model) Closed(conn protocol.Connection, err error) {
|
func (m *model) Closed(conn protocol.Connection, err error) {
|
||||||
connID := conn.ConnectionID()
|
connID := conn.ConnectionID()
|
||||||
deviceID := conn.ID()
|
deviceID := conn.DeviceID()
|
||||||
|
|
||||||
m.pmut.Lock()
|
m.pmut.Lock()
|
||||||
conn, ok := m.conns[connID]
|
conn, ok := m.conns[connID]
|
||||||
@ -1948,7 +1948,7 @@ func (m *model) Request(conn protocol.Connection, folder, name string, _, size i
|
|||||||
return nil, protocol.ErrInvalid
|
return nil, protocol.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
deviceID := conn.ID()
|
deviceID := conn.DeviceID()
|
||||||
connID := conn.ConnectionID()
|
connID := conn.ConnectionID()
|
||||||
|
|
||||||
m.fmut.RLock()
|
m.fmut.RLock()
|
||||||
@ -2330,7 +2330,7 @@ func (m *model) GetHello(id protocol.DeviceID) protocol.HelloIntf {
|
|||||||
// be sent to the connected peer, thereafter index updates whenever the local
|
// be sent to the connected peer, thereafter index updates whenever the local
|
||||||
// folder changes.
|
// folder changes.
|
||||||
func (m *model) AddConnection(conn protocol.Connection, hello protocol.Hello) {
|
func (m *model) AddConnection(conn protocol.Connection, hello protocol.Hello) {
|
||||||
deviceID := conn.ID()
|
deviceID := conn.DeviceID()
|
||||||
|
|
||||||
deviceCfg, ok := m.cfg.Device(deviceID)
|
deviceCfg, ok := m.cfg.Device(deviceID)
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -2435,7 +2435,7 @@ func (m *model) promoteConnections() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *model) DownloadProgress(conn protocol.Connection, folder string, updates []protocol.FileDownloadProgressUpdate) error {
|
func (m *model) DownloadProgress(conn protocol.Connection, folder string, updates []protocol.FileDownloadProgressUpdate) error {
|
||||||
deviceID := conn.ID()
|
deviceID := conn.DeviceID()
|
||||||
|
|
||||||
m.fmut.RLock()
|
m.fmut.RLock()
|
||||||
cfg, ok := m.folderCfgs[folder]
|
cfg, ok := m.folderCfgs[folder]
|
||||||
|
@ -1338,7 +1338,7 @@ func TestAutoAcceptEnc(t *testing.T) {
|
|||||||
// would panic.
|
// would panic.
|
||||||
clusterConfig := func(deviceID protocol.DeviceID, cm protocol.ClusterConfig) {
|
clusterConfig := func(deviceID protocol.DeviceID, cm protocol.ClusterConfig) {
|
||||||
m.AddConnection(newFakeConnection(deviceID, m), protocol.Hello{})
|
m.AddConnection(newFakeConnection(deviceID, m), protocol.Hello{})
|
||||||
m.ClusterConfig(&protocolmocks.Connection{IDStub: func() protocol.DeviceID { return deviceID }}, cm)
|
m.ClusterConfig(&protocolmocks.Connection{DeviceIDStub: func() protocol.DeviceID { return deviceID }}, cm)
|
||||||
}
|
}
|
||||||
|
|
||||||
clusterConfig(device1, basicCC())
|
clusterConfig(device1, basicCC())
|
||||||
|
@ -315,15 +315,15 @@ func (t *ProgressEmitter) emptyLocked() bool {
|
|||||||
func (t *ProgressEmitter) temporaryIndexSubscribe(conn protocol.Connection, folders []string) {
|
func (t *ProgressEmitter) temporaryIndexSubscribe(conn protocol.Connection, folders []string) {
|
||||||
t.mut.Lock()
|
t.mut.Lock()
|
||||||
defer t.mut.Unlock()
|
defer t.mut.Unlock()
|
||||||
t.connections[conn.ID()] = conn
|
t.connections[conn.DeviceID()] = conn
|
||||||
t.foldersByConns[conn.ID()] = folders
|
t.foldersByConns[conn.DeviceID()] = folders
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ProgressEmitter) temporaryIndexUnsubscribe(conn protocol.Connection) {
|
func (t *ProgressEmitter) temporaryIndexUnsubscribe(conn protocol.Connection) {
|
||||||
t.mut.Lock()
|
t.mut.Lock()
|
||||||
defer t.mut.Unlock()
|
defer t.mut.Unlock()
|
||||||
delete(t.connections, conn.ID())
|
delete(t.connections, conn.DeviceID())
|
||||||
delete(t.foldersByConns, conn.ID())
|
delete(t.foldersByConns, conn.DeviceID())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ProgressEmitter) clearLocked() {
|
func (t *ProgressEmitter) clearLocked() {
|
||||||
|
@ -463,7 +463,7 @@ func TestSendDownloadProgressMessages(t *testing.T) {
|
|||||||
p.temporaryIndexUnsubscribe(fc)
|
p.temporaryIndexUnsubscribe(fc)
|
||||||
|
|
||||||
sendMsgs(p)
|
sendMsgs(p)
|
||||||
_, ok := p.sentDownloadStates[fc.ID()]
|
_, ok := p.sentDownloadStates[fc.DeviceID()]
|
||||||
if ok {
|
if ok {
|
||||||
t.Error("Should not be there")
|
t.Error("Should not be there")
|
||||||
}
|
}
|
||||||
|
@ -38,9 +38,9 @@ func init() {
|
|||||||
myID, _ = protocol.DeviceIDFromString("ZNWFSWE-RWRV2BD-45BLMCV-LTDE2UR-4LJDW6J-R5BPWEB-TXD27XJ-IZF5RA4")
|
myID, _ = protocol.DeviceIDFromString("ZNWFSWE-RWRV2BD-45BLMCV-LTDE2UR-4LJDW6J-R5BPWEB-TXD27XJ-IZF5RA4")
|
||||||
device1, _ = protocol.DeviceIDFromString("AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR")
|
device1, _ = protocol.DeviceIDFromString("AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR")
|
||||||
device2, _ = protocol.DeviceIDFromString("GYRZZQB-IRNPV4Z-T7TC52W-EQYJ3TT-FDQW6MW-DFLMU42-SSSU6EM-FBK2VAY")
|
device2, _ = protocol.DeviceIDFromString("GYRZZQB-IRNPV4Z-T7TC52W-EQYJ3TT-FDQW6MW-DFLMU42-SSSU6EM-FBK2VAY")
|
||||||
device1Conn.IDReturns(device1)
|
device1Conn.DeviceIDReturns(device1)
|
||||||
device1Conn.ConnectionIDReturns(rand.String(16))
|
device1Conn.ConnectionIDReturns(rand.String(16))
|
||||||
device2Conn.IDReturns(device2)
|
device2Conn.DeviceIDReturns(device2)
|
||||||
device2Conn.ConnectionIDReturns(rand.String(16))
|
device2Conn.ConnectionIDReturns(rand.String(16))
|
||||||
|
|
||||||
cfg := config.New(myID)
|
cfg := config.New(myID)
|
||||||
|
@ -185,8 +185,8 @@ func (e encryptedConnection) SetFolderPasswords(passwords map[string]string) {
|
|||||||
e.folderKeys.setPasswords(passwords)
|
e.folderKeys.setPasswords(passwords)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e encryptedConnection) ID() DeviceID {
|
func (e encryptedConnection) DeviceID() DeviceID {
|
||||||
return e.conn.ID()
|
return e.conn.DeviceID()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e encryptedConnection) Index(ctx context.Context, folder string, files []FileInfo) error {
|
func (e encryptedConnection) Index(ctx context.Context, folder string, files []FileInfo) error {
|
||||||
|
@ -51,6 +51,16 @@ type Connection struct {
|
|||||||
cryptoReturnsOnCall map[int]struct {
|
cryptoReturnsOnCall map[int]struct {
|
||||||
result1 string
|
result1 string
|
||||||
}
|
}
|
||||||
|
DeviceIDStub func() protocol.DeviceID
|
||||||
|
deviceIDMutex sync.RWMutex
|
||||||
|
deviceIDArgsForCall []struct {
|
||||||
|
}
|
||||||
|
deviceIDReturns struct {
|
||||||
|
result1 protocol.DeviceID
|
||||||
|
}
|
||||||
|
deviceIDReturnsOnCall map[int]struct {
|
||||||
|
result1 protocol.DeviceID
|
||||||
|
}
|
||||||
DownloadProgressStub func(context.Context, string, []protocol.FileDownloadProgressUpdate)
|
DownloadProgressStub func(context.Context, string, []protocol.FileDownloadProgressUpdate)
|
||||||
downloadProgressMutex sync.RWMutex
|
downloadProgressMutex sync.RWMutex
|
||||||
downloadProgressArgsForCall []struct {
|
downloadProgressArgsForCall []struct {
|
||||||
@ -68,16 +78,6 @@ type Connection struct {
|
|||||||
establishedAtReturnsOnCall map[int]struct {
|
establishedAtReturnsOnCall map[int]struct {
|
||||||
result1 time.Time
|
result1 time.Time
|
||||||
}
|
}
|
||||||
IDStub func() protocol.DeviceID
|
|
||||||
iDMutex sync.RWMutex
|
|
||||||
iDArgsForCall []struct {
|
|
||||||
}
|
|
||||||
iDReturns struct {
|
|
||||||
result1 protocol.DeviceID
|
|
||||||
}
|
|
||||||
iDReturnsOnCall map[int]struct {
|
|
||||||
result1 protocol.DeviceID
|
|
||||||
}
|
|
||||||
IndexStub func(context.Context, string, []protocol.FileInfo) error
|
IndexStub func(context.Context, string, []protocol.FileInfo) error
|
||||||
indexMutex sync.RWMutex
|
indexMutex sync.RWMutex
|
||||||
indexArgsForCall []struct {
|
indexArgsForCall []struct {
|
||||||
@ -431,6 +431,59 @@ func (fake *Connection) CryptoReturnsOnCall(i int, result1 string) {
|
|||||||
}{result1}
|
}{result1}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fake *Connection) DeviceID() protocol.DeviceID {
|
||||||
|
fake.deviceIDMutex.Lock()
|
||||||
|
ret, specificReturn := fake.deviceIDReturnsOnCall[len(fake.deviceIDArgsForCall)]
|
||||||
|
fake.deviceIDArgsForCall = append(fake.deviceIDArgsForCall, struct {
|
||||||
|
}{})
|
||||||
|
stub := fake.DeviceIDStub
|
||||||
|
fakeReturns := fake.deviceIDReturns
|
||||||
|
fake.recordInvocation("DeviceID", []interface{}{})
|
||||||
|
fake.deviceIDMutex.Unlock()
|
||||||
|
if stub != nil {
|
||||||
|
return stub()
|
||||||
|
}
|
||||||
|
if specificReturn {
|
||||||
|
return ret.result1
|
||||||
|
}
|
||||||
|
return fakeReturns.result1
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *Connection) DeviceIDCallCount() int {
|
||||||
|
fake.deviceIDMutex.RLock()
|
||||||
|
defer fake.deviceIDMutex.RUnlock()
|
||||||
|
return len(fake.deviceIDArgsForCall)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *Connection) DeviceIDCalls(stub func() protocol.DeviceID) {
|
||||||
|
fake.deviceIDMutex.Lock()
|
||||||
|
defer fake.deviceIDMutex.Unlock()
|
||||||
|
fake.DeviceIDStub = stub
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *Connection) DeviceIDReturns(result1 protocol.DeviceID) {
|
||||||
|
fake.deviceIDMutex.Lock()
|
||||||
|
defer fake.deviceIDMutex.Unlock()
|
||||||
|
fake.DeviceIDStub = nil
|
||||||
|
fake.deviceIDReturns = struct {
|
||||||
|
result1 protocol.DeviceID
|
||||||
|
}{result1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fake *Connection) DeviceIDReturnsOnCall(i int, result1 protocol.DeviceID) {
|
||||||
|
fake.deviceIDMutex.Lock()
|
||||||
|
defer fake.deviceIDMutex.Unlock()
|
||||||
|
fake.DeviceIDStub = nil
|
||||||
|
if fake.deviceIDReturnsOnCall == nil {
|
||||||
|
fake.deviceIDReturnsOnCall = make(map[int]struct {
|
||||||
|
result1 protocol.DeviceID
|
||||||
|
})
|
||||||
|
}
|
||||||
|
fake.deviceIDReturnsOnCall[i] = struct {
|
||||||
|
result1 protocol.DeviceID
|
||||||
|
}{result1}
|
||||||
|
}
|
||||||
|
|
||||||
func (fake *Connection) DownloadProgress(arg1 context.Context, arg2 string, arg3 []protocol.FileDownloadProgressUpdate) {
|
func (fake *Connection) DownloadProgress(arg1 context.Context, arg2 string, arg3 []protocol.FileDownloadProgressUpdate) {
|
||||||
var arg3Copy []protocol.FileDownloadProgressUpdate
|
var arg3Copy []protocol.FileDownloadProgressUpdate
|
||||||
if arg3 != nil {
|
if arg3 != nil {
|
||||||
@ -523,59 +576,6 @@ func (fake *Connection) EstablishedAtReturnsOnCall(i int, result1 time.Time) {
|
|||||||
}{result1}
|
}{result1}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *Connection) ID() protocol.DeviceID {
|
|
||||||
fake.iDMutex.Lock()
|
|
||||||
ret, specificReturn := fake.iDReturnsOnCall[len(fake.iDArgsForCall)]
|
|
||||||
fake.iDArgsForCall = append(fake.iDArgsForCall, struct {
|
|
||||||
}{})
|
|
||||||
stub := fake.IDStub
|
|
||||||
fakeReturns := fake.iDReturns
|
|
||||||
fake.recordInvocation("ID", []interface{}{})
|
|
||||||
fake.iDMutex.Unlock()
|
|
||||||
if stub != nil {
|
|
||||||
return stub()
|
|
||||||
}
|
|
||||||
if specificReturn {
|
|
||||||
return ret.result1
|
|
||||||
}
|
|
||||||
return fakeReturns.result1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fake *Connection) IDCallCount() int {
|
|
||||||
fake.iDMutex.RLock()
|
|
||||||
defer fake.iDMutex.RUnlock()
|
|
||||||
return len(fake.iDArgsForCall)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fake *Connection) IDCalls(stub func() protocol.DeviceID) {
|
|
||||||
fake.iDMutex.Lock()
|
|
||||||
defer fake.iDMutex.Unlock()
|
|
||||||
fake.IDStub = stub
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fake *Connection) IDReturns(result1 protocol.DeviceID) {
|
|
||||||
fake.iDMutex.Lock()
|
|
||||||
defer fake.iDMutex.Unlock()
|
|
||||||
fake.IDStub = nil
|
|
||||||
fake.iDReturns = struct {
|
|
||||||
result1 protocol.DeviceID
|
|
||||||
}{result1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fake *Connection) IDReturnsOnCall(i int, result1 protocol.DeviceID) {
|
|
||||||
fake.iDMutex.Lock()
|
|
||||||
defer fake.iDMutex.Unlock()
|
|
||||||
fake.IDStub = nil
|
|
||||||
if fake.iDReturnsOnCall == nil {
|
|
||||||
fake.iDReturnsOnCall = make(map[int]struct {
|
|
||||||
result1 protocol.DeviceID
|
|
||||||
})
|
|
||||||
}
|
|
||||||
fake.iDReturnsOnCall[i] = struct {
|
|
||||||
result1 protocol.DeviceID
|
|
||||||
}{result1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fake *Connection) Index(arg1 context.Context, arg2 string, arg3 []protocol.FileInfo) error {
|
func (fake *Connection) Index(arg1 context.Context, arg2 string, arg3 []protocol.FileInfo) error {
|
||||||
var arg3Copy []protocol.FileInfo
|
var arg3Copy []protocol.FileInfo
|
||||||
if arg3 != nil {
|
if arg3 != nil {
|
||||||
@ -1229,12 +1229,12 @@ func (fake *Connection) Invocations() map[string][][]interface{} {
|
|||||||
defer fake.connectionIDMutex.RUnlock()
|
defer fake.connectionIDMutex.RUnlock()
|
||||||
fake.cryptoMutex.RLock()
|
fake.cryptoMutex.RLock()
|
||||||
defer fake.cryptoMutex.RUnlock()
|
defer fake.cryptoMutex.RUnlock()
|
||||||
|
fake.deviceIDMutex.RLock()
|
||||||
|
defer fake.deviceIDMutex.RUnlock()
|
||||||
fake.downloadProgressMutex.RLock()
|
fake.downloadProgressMutex.RLock()
|
||||||
defer fake.downloadProgressMutex.RUnlock()
|
defer fake.downloadProgressMutex.RUnlock()
|
||||||
fake.establishedAtMutex.RLock()
|
fake.establishedAtMutex.RLock()
|
||||||
defer fake.establishedAtMutex.RUnlock()
|
defer fake.establishedAtMutex.RUnlock()
|
||||||
fake.iDMutex.RLock()
|
|
||||||
defer fake.iDMutex.RUnlock()
|
|
||||||
fake.indexMutex.RLock()
|
fake.indexMutex.RLock()
|
||||||
defer fake.indexMutex.RUnlock()
|
defer fake.indexMutex.RUnlock()
|
||||||
fake.indexUpdateMutex.RLock()
|
fake.indexUpdateMutex.RLock()
|
||||||
|
@ -161,7 +161,7 @@ type Connection interface {
|
|||||||
Start()
|
Start()
|
||||||
SetFolderPasswords(passwords map[string]string)
|
SetFolderPasswords(passwords map[string]string)
|
||||||
Close(err error)
|
Close(err error)
|
||||||
ID() DeviceID
|
DeviceID() DeviceID
|
||||||
Index(ctx context.Context, folder string, files []FileInfo) error
|
Index(ctx context.Context, folder string, files []FileInfo) error
|
||||||
IndexUpdate(ctx context.Context, folder string, files []FileInfo) error
|
IndexUpdate(ctx context.Context, folder string, files []FileInfo) error
|
||||||
Request(ctx context.Context, folder string, name string, blockNo int, offset int64, size int, hash []byte, weakHash uint32, fromTemporary bool) ([]byte, error)
|
Request(ctx context.Context, folder string, name string, blockNo int, offset int64, size int, hash []byte, weakHash uint32, fromTemporary bool) ([]byte, error)
|
||||||
@ -187,7 +187,7 @@ type ConnectionInfo interface {
|
|||||||
type rawConnection struct {
|
type rawConnection struct {
|
||||||
ConnectionInfo
|
ConnectionInfo
|
||||||
|
|
||||||
id DeviceID
|
deviceID DeviceID
|
||||||
model contextLessModel
|
model contextLessModel
|
||||||
startTime time.Time
|
startTime time.Time
|
||||||
|
|
||||||
@ -273,7 +273,7 @@ func newRawConnection(deviceID DeviceID, reader io.Reader, writer io.Writer, clo
|
|||||||
|
|
||||||
return &rawConnection{
|
return &rawConnection{
|
||||||
ConnectionInfo: connInfo,
|
ConnectionInfo: connInfo,
|
||||||
id: deviceID,
|
deviceID: deviceID,
|
||||||
model: receiver,
|
model: receiver,
|
||||||
cr: cr,
|
cr: cr,
|
||||||
cw: cw,
|
cw: cw,
|
||||||
@ -318,8 +318,8 @@ func (c *rawConnection) Start() {
|
|||||||
c.startTime = time.Now().Truncate(time.Second)
|
c.startTime = time.Now().Truncate(time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *rawConnection) ID() DeviceID {
|
func (c *rawConnection) DeviceID() DeviceID {
|
||||||
return c.id
|
return c.deviceID
|
||||||
}
|
}
|
||||||
|
|
||||||
// Index writes the list of file information to the connected peer device
|
// Index writes the list of file information to the connected peer device
|
||||||
@ -602,12 +602,12 @@ func (c *rawConnection) readHeader(fourByteBuf []byte) (Header, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *rawConnection) handleIndex(im Index) error {
|
func (c *rawConnection) handleIndex(im Index) error {
|
||||||
l.Debugf("Index(%v, %v, %d file)", c.id, im.Folder, len(im.Files))
|
l.Debugf("Index(%v, %v, %d file)", c.deviceID, im.Folder, len(im.Files))
|
||||||
return c.model.Index(im.Folder, im.Files)
|
return c.model.Index(im.Folder, im.Files)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *rawConnection) handleIndexUpdate(im IndexUpdate) error {
|
func (c *rawConnection) handleIndexUpdate(im IndexUpdate) error {
|
||||||
l.Debugf("queueing IndexUpdate(%v, %v, %d files)", c.id, im.Folder, len(im.Files))
|
l.Debugf("queueing IndexUpdate(%v, %v, %d files)", c.deviceID, im.Folder, len(im.Files))
|
||||||
return c.model.IndexUpdate(im.Folder, im.Files)
|
return c.model.IndexUpdate(im.Folder, im.Files)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -948,7 +948,7 @@ func (c *rawConnection) internalClose(err error) {
|
|||||||
c.closeOnce.Do(func() {
|
c.closeOnce.Do(func() {
|
||||||
l.Debugln("close due to", err)
|
l.Debugln("close due to", err)
|
||||||
if cerr := c.closer.Close(); cerr != nil {
|
if cerr := c.closer.Close(); cerr != nil {
|
||||||
l.Debugln(c.id, "failed to close underlying conn:", cerr)
|
l.Debugln(c.deviceID, "failed to close underlying conn:", cerr)
|
||||||
}
|
}
|
||||||
close(c.closed)
|
close(c.closed)
|
||||||
|
|
||||||
@ -981,11 +981,11 @@ func (c *rawConnection) pingSender() {
|
|||||||
case <-ticker.C:
|
case <-ticker.C:
|
||||||
d := time.Since(c.cw.Last())
|
d := time.Since(c.cw.Last())
|
||||||
if d < PingSendInterval/2 {
|
if d < PingSendInterval/2 {
|
||||||
l.Debugln(c.id, "ping skipped after wr", d)
|
l.Debugln(c.deviceID, "ping skipped after wr", d)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
l.Debugln(c.id, "ping -> after", d)
|
l.Debugln(c.deviceID, "ping -> after", d)
|
||||||
c.ping()
|
c.ping()
|
||||||
|
|
||||||
case <-c.closed:
|
case <-c.closed:
|
||||||
@ -1006,11 +1006,11 @@ func (c *rawConnection) pingReceiver() {
|
|||||||
case <-ticker.C:
|
case <-ticker.C:
|
||||||
d := time.Since(c.cr.Last())
|
d := time.Since(c.cr.Last())
|
||||||
if d > ReceiveTimeout {
|
if d > ReceiveTimeout {
|
||||||
l.Debugln(c.id, "ping timeout", d)
|
l.Debugln(c.deviceID, "ping timeout", d)
|
||||||
c.internalClose(ErrTimeout)
|
c.internalClose(ErrTimeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
l.Debugln(c.id, "last read within", d)
|
l.Debugln(c.deviceID, "last read within", d)
|
||||||
|
|
||||||
case <-c.closed:
|
case <-c.closed:
|
||||||
return
|
return
|
||||||
|
Loading…
Reference in New Issue
Block a user