diff --git a/bindings/restoreContacts.go b/bindings/restoreContacts.go index 61e14d3c1073e3e80a44fcbb58df4b6f400393ea..b970c77a2ed8cbf5664f76a6754904edb9b8d0f0 100644 --- a/bindings/restoreContacts.go +++ b/bindings/restoreContacts.go @@ -29,6 +29,7 @@ type RestoreContactsReport struct { restored []*id.ID failed []*id.ID errs []error + restErr error } // LenRestored returns the length of ID's restored. @@ -56,6 +57,14 @@ func (r *RestoreContactsReport) GetErrorAt(index int) string { return r.errs[index].Error() } +// GetRestoreContactsError returns an error string. Empty if no error. +func (r *RestoreContactsReport) GetRestoreContactsError() string { + if r.restErr == nil { + return "" + } + return r.restErr.Error() +} + // RestoreContactsFromBackup takes as input the jason output of the // `NewClientFromBackup` function, unmarshals it into IDs, looks up // each ID in user discovery, and initiates a session reset request. @@ -65,8 +74,8 @@ func (r *RestoreContactsReport) GetErrorAt(index int) string { // the mobile phone apps and are not intended to be part of the xxDK. It // should be treated as internal functions specific to the phone apps. func RestoreContactsFromBackup(backupPartnerIDs []byte, client *Client, - udManager *UserDiscovery, updatesCb RestoreContactsUpdater) ( - *RestoreContactsReport, error) { + udManager *UserDiscovery, + updatesCb RestoreContactsUpdater) *RestoreContactsReport { restored, failed, errs, err := xxmutils.RestoreContactsFromBackup( backupPartnerIDs, &client.api, udManager.ud, updatesCb) @@ -75,6 +84,7 @@ func RestoreContactsFromBackup(backupPartnerIDs []byte, client *Client, restored: restored, failed: failed, errs: errs, - }, err + restErr: err, + } } diff --git a/xxmutils/restoreContacts.go b/xxmutils/restoreContacts.go index 9505cc7866be3b0416b5b5bf617bc5fee8234796..b64947418cb401ea797c99cc8c5935a60335bfb9 100644 --- a/xxmutils/restoreContacts.go +++ b/xxmutils/restoreContacts.go @@ -149,13 +149,18 @@ func RestoreContactsFromBackup(backupPartnerIDs []byte, client *api.Client, } // Cleanup + // lookupCh -> foundCh -> resetContactCh -> restoredCh close(lookupCh) - close(resetContactCh) - close(failCh) // Now wait for subroutines to close before closing their output chans lcWg.Wait() + // Close input to reset chan after lookup is done to avoid writes after + // close close(foundCh) + close(resetContactCh) rsWg.Wait() + // failCh is closed after exit of the threads to avoid writes after + // close + close(failCh) close(restoredCh) failWg.Wait() @@ -185,8 +190,6 @@ func LookupContacts(in chan *id.ID, out chan *contact.Contact, continue } jww.WARN.Printf("could not lookup %s: %v", lookupID, err) - // Retry later - in <- lookupID } } @@ -207,9 +210,9 @@ func ResetSessions(in, out chan *contact.Contact, failCh chan failure, continue } // If an error, figure out if I should report or retry - // Note: Always retry here for now. + // Note: Always fail here for now. jww.WARN.Printf("could not reset %s: %v", c.ID, err) - in <- c + failCh <- failure{ID: c.ID, Err: err} } }