|
@@ -800,10 +800,10 @@ type FolderCompletion struct {
|
|
|
NeedItems int
|
|
|
NeedDeletes int
|
|
|
Sequence int64
|
|
|
- Accepted bool
|
|
|
+ RemoteState remoteFolderState
|
|
|
}
|
|
|
|
|
|
-func newFolderCompletion(global, need db.Counts, sequence int64, accepted bool) FolderCompletion {
|
|
|
+func newFolderCompletion(global, need db.Counts, sequence int64, state remoteFolderState) FolderCompletion {
|
|
|
comp := FolderCompletion{
|
|
|
GlobalBytes: global.Bytes,
|
|
|
NeedBytes: need.Bytes,
|
|
@@ -811,7 +811,7 @@ func newFolderCompletion(global, need db.Counts, sequence int64, accepted bool)
|
|
|
NeedItems: need.Files + need.Directories + need.Symlinks,
|
|
|
NeedDeletes: need.Deleted,
|
|
|
Sequence: sequence,
|
|
|
- Accepted: accepted,
|
|
|
+ RemoteState: state,
|
|
|
}
|
|
|
comp.setComplectionPct()
|
|
|
return comp
|
|
@@ -843,7 +843,7 @@ func (comp *FolderCompletion) setComplectionPct() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// Map returns the members as a map, e.g. used in api to serialize as Json.
|
|
|
+// Map returns the members as a map, e.g. used in api to serialize as JSON.
|
|
|
func (comp FolderCompletion) Map() map[string]interface{} {
|
|
|
return map[string]interface{}{
|
|
|
"completion": comp.CompletionPct,
|
|
@@ -853,7 +853,7 @@ func (comp FolderCompletion) Map() map[string]interface{} {
|
|
|
"needItems": comp.NeedItems,
|
|
|
"needDeletes": comp.NeedDeletes,
|
|
|
"sequence": comp.Sequence,
|
|
|
- "accepted": comp.Accepted,
|
|
|
+ "remoteState": comp.RemoteState,
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -904,7 +904,7 @@ func (m *model) folderCompletion(device protocol.DeviceID, folder string) (Folde
|
|
|
defer snap.Release()
|
|
|
|
|
|
m.pmut.RLock()
|
|
|
- accepted := m.remoteFolderStates[device][folder] != remoteNotSharing
|
|
|
+ state := m.remoteFolderStates[device][folder]
|
|
|
downloaded := m.deviceDownloads[device].BytesDownloaded(folder)
|
|
|
m.pmut.RUnlock()
|
|
|
|
|
@@ -915,7 +915,7 @@ func (m *model) folderCompletion(device protocol.DeviceID, folder string) (Folde
|
|
|
need.Bytes = 0
|
|
|
}
|
|
|
|
|
|
- comp := newFolderCompletion(snap.GlobalSize(), need, snap.Sequence(device), accepted)
|
|
|
+ comp := newFolderCompletion(snap.GlobalSize(), need, snap.Sequence(device), state)
|
|
|
|
|
|
l.Debugf("%v Completion(%s, %q): %v", m, device, folder, comp.Map())
|
|
|
return comp, nil
|
|
@@ -1147,6 +1147,10 @@ type clusterConfigDeviceInfo struct {
|
|
|
local, remote protocol.Device
|
|
|
}
|
|
|
|
|
|
+type ClusterConfigReceivedEventData struct {
|
|
|
+ Device protocol.DeviceID `json:"device"`
|
|
|
+}
|
|
|
+
|
|
|
func (m *model) ClusterConfig(deviceID protocol.DeviceID, cm protocol.ClusterConfig) error {
|
|
|
// Check the peer device's announced folders against our own. Emits events
|
|
|
// for folders that we don't expect (unknown or not shared).
|
|
@@ -1234,6 +1238,10 @@ func (m *model) ClusterConfig(deviceID protocol.DeviceID, cm protocol.ClusterCon
|
|
|
m.remoteFolderStates[deviceID] = states
|
|
|
m.pmut.Unlock()
|
|
|
|
|
|
+ m.evLogger.Log(events.ClusterConfigReceived, ClusterConfigReceivedEventData{
|
|
|
+ Device: deviceID,
|
|
|
+ })
|
|
|
+
|
|
|
if len(tempIndexFolders) > 0 {
|
|
|
m.pmut.RLock()
|
|
|
conn, ok := m.conn[deviceID]
|
|
@@ -1278,7 +1286,7 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
|
|
|
}
|
|
|
of := db.ObservedFolder{Time: time.Now().Truncate(time.Second)}
|
|
|
for _, folder := range folders {
|
|
|
- seenFolders[folder.ID] = remoteValid
|
|
|
+ seenFolders[folder.ID] = remoteFolderValid
|
|
|
|
|
|
cfg, ok := m.cfg.Folder(folder.ID)
|
|
|
if ok {
|
|
@@ -1319,7 +1327,7 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
|
|
|
|
|
|
if folder.Paused {
|
|
|
indexHandlers.Remove(folder.ID)
|
|
|
- seenFolders[cfg.ID] = remotePaused
|
|
|
+ seenFolders[cfg.ID] = remoteFolderPaused
|
|
|
continue
|
|
|
}
|
|
|
|
|
@@ -1374,8 +1382,8 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
|
|
|
// Explicitly mark folders we offer, but the remote has not accepted
|
|
|
for folderID, cfg := range m.cfg.Folders() {
|
|
|
if _, seen := seenFolders[folderID]; !seen && cfg.SharedWith(deviceID) {
|
|
|
- l.Debugf("Remote device %v has not accepted folder %s", deviceID.Short(), cfg.Description())
|
|
|
- seenFolders[folderID] = remoteNotSharing
|
|
|
+ l.Debugf("Remote device %v has not accepted sharing folder %s", deviceID.Short(), cfg.Description())
|
|
|
+ seenFolders[folderID] = remoteFolderNotSharing
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2712,7 +2720,7 @@ func (m *model) availabilityInSnapshotPRlocked(cfg config.FolderConfiguration, s
|
|
|
if _, ok := m.remoteFolderStates[device]; !ok {
|
|
|
continue
|
|
|
}
|
|
|
- if state, ok := m.remoteFolderStates[device][cfg.ID]; !ok || state == remotePaused {
|
|
|
+ if state := m.remoteFolderStates[device][cfg.ID]; state != remoteFolderValid {
|
|
|
continue
|
|
|
}
|
|
|
_, ok := m.conn[device]
|