whole_func_string: function stopAll(cb) {
    //sync is not started yet, but connect could be called already. In this case, just reset a few things
    if (!syncStarted) {
      interceptors.restore();
      dataHandlers.restore();
      hashProvider.restore();
      mongoDbClient = null;
      redisClient = null;
      metricsClient = null;
      return cb();
    }
    debug('stopAll syncs');
    datasetClientCleaner.stop();
    async.parallel([
      async.apply(syncStorage.updateManyDatasetClients, {}, {stopped: true}),
      async.apply(stopAllWorkers, syncWorkers),
      async.apply(stopAllWorkers, ackWorkers),
      async.apply(stopAllWorkers, pendingWorkers),
      async.apply(syncScheduler.stop.bind(syncScheduler))
    ], function(err) {
      if (err) {
        debugError('Failed to stop sync due to error : %s', err);
        return cb(err);
      }
      setConfig();
      interceptors.restore();
      dataHandlers.restore();
      hashProvider.restore();
      mongoDbClient = null;
      redisClient = null;
      metricsClient = null;
      ackQueue = null;
      pendingQueue = null;
      syncQueue = null;
      ackWorkers = [];
      pendingWorkers = [];
      syncWorkers = [];
      syncStarted = false;
      syncLock = null;
      datasetClientCleaner = null;
      // Reset the memoized start fn so it can be called again
      module.exports.api.start = async.memoize(start);
      return cb();
    });
  }
func_code_string: function stopAll(cb) {
    //sync is not started yet, but connect could be called already. In this case, just reset a few things
    if (!syncStarted) {
      interceptors.restore();
      dataHandlers.restore();
      hashProvider.restore();
      mongoDbClient = null;
      redisClient = null;
      metricsClient = null;
      return cb();
    }
    debug('stopAll syncs');
    datasetClientCleaner.stop();
    async.parallel([
      async.apply(syncStorage.updateManyDatasetClients, {}, {stopped: true}),
      async.apply(stopAllWorkers, syncWorkers),
      async.apply(stopAllWorkers, ackWorkers),
      async.apply(stopAllWorkers, pendingWorkers),
      async.apply(syncScheduler.stop.bind(syncScheduler))
    ], function(err) {
      if (err) {
        debugError('Failed to stop sync due to error : %s', err);
        return cb(err);
      }
      setConfig();
      interceptors.restore();
      dataHandlers.restore();
      hashProvider.restore();
      mongoDbClient = null;
      redisClient = null;
      metricsClient = null;
      ackQueue = null;
      pendingQueue = null;
      syncQueue = null;
      ackWorkers = [];
      pendingWorkers = [];
      syncWorkers = [];
      syncStarted = false;
      syncLock = null;
      datasetClientCleaner = null;
      // Reset the memoized start fn so it can be called again
      module.exports.api.start = async.memoize(start);
      return cb();
    });
  }
func_documentation_string: Stop cloud data sync service for ALL datasets and reset.
  This should really only used by tests.