'Perform ssync with remote node.
:returns: a 2-tuple, in the form (success, can_delete_objs) where
success is a boolean and can_delete_objs is the map of
objects that are in sync with the receiver. Each entry in
can_delete_objs maps a hash => timestamp of data file or
tombstone file'

def __call__(self):

    if (not self.suffixes):
        return (True, {})
    try:
        try:
            self.connect()
            self.missing_check()
            if (self.remote_check_objs is None):
                self.updates()
                can_delete_obj = self.available_map
            else:
                in_sync_hashes = (set(self.available_map.keys()) - set(self.send_map.keys()))
                can_delete_obj = dict(((hash_, self.available_map[hash_]) for hash_ in in_sync_hashes))
            if (not self.failures):
                return (True, can_delete_obj)
            else:
                return (False, {})
        except (exceptions.MessageTimeout, exceptions.ReplicationException) as err:
            self.daemon.logger.error('%s:%s/%s/%s    %s', self.node.get('replication_ip'), self.node.get('replication_port'), self.node.get('device'), self.job.get('partition'), err)
        except Exception:
            self.daemon.logger.exception('%s:%s/%s/%s    EXCEPTION    in    ssync.Sender', self.node.get('replication_ip'), self.node.get('replication_port'), self.node.get('device'), self.job.get('partition'))
        finally:
            self.disconnect()
    except Exception:
        self.daemon.logger.exception('EXCEPTION    in    ssync.Sender')
    return (False, {})
