prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Make usage tracking opt-in
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `parsl/config.py`
  Content:
  ```
  1 import logging
  2 
  3 from parsl.utils import RepresentationMixin
  4 from parsl.executors.threads import ThreadPoolExecutor
  5 from parsl.dataflow.error import ConfigurationError
  6 
  7 logger = logging.getLogger(__name__)
  8 
  9 
  10 class Config(RepresentationMixin):
  11     """
  12     Specification of Parsl configuration options.
  13 
  14     Parameters
  15     ----------
  16     executors : list of ParslExecutor, optional
  17         List of executor instances to use. Possible executors include :class:`~parsl.executors.threads.ThreadPoolExecutor`,
  18         :class:`~parsl.executors.ipp.IPyParallelExecutor`, or :class:`~parsl.executors.swift_t.TurbineExecutor`. Default
  19         is [:class:`~parsl.executors.threads.ThreadPoolExecutor()`].
  20     app_cache : bool, optional
  21         Enable app caching. Default is True.
  22     checkpoint_files : list of str, optional
  23         List of paths to checkpoint files. Default is None.
  24     checkpoint_mode : str, optional
  25         Checkpoint mode to use, can be 'dfk_exit', 'task_exit', or 'periodic'. If set to
  26         `None`, checkpointing will be disabled. Default is None.
  27     checkpoint_period : str, optional
  28         Time interval (in "HH:MM:SS") at which to checkpoint completed tasks. Only has an effect if
  29         `checkpoint_mode='periodic'`.
  30     data_management_max_threads : int, optional
  31         Maximum number of threads to allocate for the data manager to use for managing input and output transfers.
  32         Default is 10.
  33     monitoring_config : MonitoringConfig, optional
  34         The config to use for database monitoring. Default is None which does not log to a database.
  35     lazy_errors : bool, optional
  36         If True, errors from task failures will not be raised until `future.result()` is called. Otherwise, they will
  37         be raised as soon as the task returns. Default is True.
  38     retries : int, optional
  39         Set the number of retries in case of failure. Default is 0.
  40     run_dir : str, optional
  41         Path to run directory. Default is 'runinfo'.
  42     strategy : str, optional
  43         Strategy to use for scaling resources according to workflow needs. Can be 'simple' or `None`. If `None`, dynamic
  44         scaling will be disabled. Default is 'simple'.
  45     usage_tracking : bool, optional
  46         Enable usage tracking. Default is True.
  47     """
  48     def __init__(self,
  49                  executors=None,
  50                  app_cache=True,
  51                  checkpoint_files=None,
  52                  checkpoint_mode=None,
  53                  checkpoint_period=None,
  54                  data_management_max_threads=10,
  55                  lazy_errors=True,
  56                  retries=0,
  57                  run_dir='runinfo',
  58                  strategy='simple',
  59                  monitoring_config=None,
  60                  usage_tracking=True):
  61         if executors is None:
  62             executors = [ThreadPoolExecutor()]
  63         self.executors = executors
  64         self.app_cache = app_cache
  65         self.checkpoint_files = checkpoint_files
  66         self.checkpoint_mode = checkpoint_mode
  67         if checkpoint_period is not None:
  68             if checkpoint_mode is None:
  69                 logger.debug('The requested `checkpoint_period={}` will have no effect because `checkpoint_mode=None`'.format(
  70                     checkpoint_period)
  71                 )
  72             elif checkpoint_mode != 'periodic':
  73                 logger.debug("Requested checkpoint period of {} only has an effect with checkpoint_mode='periodic'".format(
  74                     checkpoint_period)
  75                 )
  76         if checkpoint_mode == 'periodic' and checkpoint_period is None:
  77             checkpoint_period = "00:30:00"
  78         self.checkpoint_period = checkpoint_period
  79         self.data_management_max_threads = data_management_max_threads
  80         self.lazy_errors = lazy_errors
  81         self.retries = retries
  82         self.run_dir = run_dir
  83         self.strategy = strategy
  84         self.usage_tracking = usage_tracking
  85         self.monitoring_config = monitoring_config
  86 
  87     @property
  88     def executors(self):
  89         return self._executors
  90 
  91     @executors.setter
  92     def executors(self, executors):
  93         labels = [e.label for e in executors]
  94         duplicates = [e for n, e in enumerate(labels) if e in labels[:n]]
  95         if len(duplicates) > 0:
  96             raise ConfigurationError('Executors must have unique labels ({})'.format(
  97                 ', '.join(['label={}'.format(repr(d)) for d in duplicates])))
  98         self._executors = executors
  99
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/parsl/config.py b/parsl/config.py
  --- a/parsl/config.py
  +++ b/parsl/config.py
  @@ -43,7 +43,8 @@
           Strategy to use for scaling resources according to workflow needs. Can be 'simple' or `None`. If `None`, dynamic
           scaling will be disabled. Default is 'simple'.
       usage_tracking : bool, optional
  -        Enable usage tracking. Default is True.
  +        Set this field to True to Opt-in to Parsl's usage tracking system. Parsl only collects minimal, non personally-identifiable,
  +        information used for reporting to our funding agencies. Default is False.
       """
       def __init__(self,
                    executors=None,
  @@ -57,7 +58,7 @@
                    run_dir='runinfo',
                    strategy='simple',
                    monitoring_config=None,
  -                 usage_tracking=True):
  +                 usage_tracking=False):
           if executors is None:
               executors = [ThreadPoolExecutor()]
           self.executors = executors
  
verification_info: {"golden_diff": "diff --git a/parsl/config.py b/parsl/config.py\n--- a/parsl/config.py\n+++ b/parsl/config.py\n@@ -43,7 +43,8 @@\n         Strategy to use for scaling resources according to workflow needs. Can be 'simple' or `None`. If `None`, dynamic\n         scaling will be disabled. Default is 'simple'.\n     usage_tracking : bool, optional\n-        Enable usage tracking. Default is True.\n+        Set this field to True to Opt-in to Parsl's usage tracking system. Parsl only collects minimal, non personally-identifiable,\n+        information used for reporting to our funding agencies. Default is False.\n     \"\"\"\n     def __init__(self,\n                  executors=None,\n@@ -57,7 +58,7 @@\n                  run_dir='runinfo',\n                  strategy='simple',\n                  monitoring_config=None,\n-                 usage_tracking=True):\n+                 usage_tracking=False):\n         if executors is None:\n             executors = [ThreadPoolExecutor()]\n         self.executors = executors\n", "issue": "Make usage tracking opt-in\n\n", "before_files": [{"content": "import logging\n\nfrom parsl.utils import RepresentationMixin\nfrom parsl.executors.threads import ThreadPoolExecutor\nfrom parsl.dataflow.error import ConfigurationError\n\nlogger = logging.getLogger(__name__)\n\n\nclass Config(RepresentationMixin):\n    \"\"\"\n    Specification of Parsl configuration options.\n\n    Parameters\n    ----------\n    executors : list of ParslExecutor, optional\n        List of executor instances to use. Possible executors include :class:`~parsl.executors.threads.ThreadPoolExecutor`,\n        :class:`~parsl.executors.ipp.IPyParallelExecutor`, or :class:`~parsl.executors.swift_t.TurbineExecutor`. Default\n        is [:class:`~parsl.executors.threads.ThreadPoolExecutor()`].\n    app_cache : bool, optional\n        Enable app caching. Default is True.\n    checkpoint_files : list of str, optional\n        List of paths to checkpoint files. Default is None.\n    checkpoint_mode : str, optional\n        Checkpoint mode to use, can be 'dfk_exit', 'task_exit', or 'periodic'. If set to\n        `None`, checkpointing will be disabled. Default is None.\n    checkpoint_period : str, optional\n        Time interval (in \"HH:MM:SS\") at which to checkpoint completed tasks. Only has an effect if\n        `checkpoint_mode='periodic'`.\n    data_management_max_threads : int, optional\n        Maximum number of threads to allocate for the data manager to use for managing input and output transfers.\n        Default is 10.\n    monitoring_config : MonitoringConfig, optional\n        The config to use for database monitoring. Default is None which does not log to a database.\n    lazy_errors : bool, optional\n        If True, errors from task failures will not be raised until `future.result()` is called. Otherwise, they will\n        be raised as soon as the task returns. Default is True.\n    retries : int, optional\n        Set the number of retries in case of failure. Default is 0.\n    run_dir : str, optional\n        Path to run directory. Default is 'runinfo'.\n    strategy : str, optional\n        Strategy to use for scaling resources according to workflow needs. Can be 'simple' or `None`. If `None`, dynamic\n        scaling will be disabled. Default is 'simple'.\n    usage_tracking : bool, optional\n        Enable usage tracking. Default is True.\n    \"\"\"\n    def __init__(self,\n                 executors=None,\n                 app_cache=True,\n                 checkpoint_files=None,\n                 checkpoint_mode=None,\n                 checkpoint_period=None,\n                 data_management_max_threads=10,\n                 lazy_errors=True,\n                 retries=0,\n                 run_dir='runinfo',\n                 strategy='simple',\n                 monitoring_config=None,\n                 usage_tracking=True):\n        if executors is None:\n            executors = [ThreadPoolExecutor()]\n        self.executors = executors\n        self.app_cache = app_cache\n        self.checkpoint_files = checkpoint_files\n        self.checkpoint_mode = checkpoint_mode\n        if checkpoint_period is not None:\n            if checkpoint_mode is None:\n                logger.debug('The requested `checkpoint_period={}` will have no effect because `checkpoint_mode=None`'.format(\n                    checkpoint_period)\n                )\n            elif checkpoint_mode != 'periodic':\n                logger.debug(\"Requested checkpoint period of {} only has an effect with checkpoint_mode='periodic'\".format(\n                    checkpoint_period)\n                )\n        if checkpoint_mode == 'periodic' and checkpoint_period is None:\n            checkpoint_period = \"00:30:00\"\n        self.checkpoint_period = checkpoint_period\n        self.data_management_max_threads = data_management_max_threads\n        self.lazy_errors = lazy_errors\n        self.retries = retries\n        self.run_dir = run_dir\n        self.strategy = strategy\n        self.usage_tracking = usage_tracking\n        self.monitoring_config = monitoring_config\n\n    @property\n    def executors(self):\n        return self._executors\n\n    @executors.setter\n    def executors(self, executors):\n        labels = [e.label for e in executors]\n        duplicates = [e for n, e in enumerate(labels) if e in labels[:n]]\n        if len(duplicates) > 0:\n            raise ConfigurationError('Executors must have unique labels ({})'.format(\n                ', '.join(['label={}'.format(repr(d)) for d in duplicates])))\n        self._executors = executors\n", "path": "parsl/config.py"}], "after_files": [{"content": "import logging\n\nfrom parsl.utils import RepresentationMixin\nfrom parsl.executors.threads import ThreadPoolExecutor\nfrom parsl.dataflow.error import ConfigurationError\n\nlogger = logging.getLogger(__name__)\n\n\nclass Config(RepresentationMixin):\n    \"\"\"\n    Specification of Parsl configuration options.\n\n    Parameters\n    ----------\n    executors : list of ParslExecutor, optional\n        List of executor instances to use. Possible executors include :class:`~parsl.executors.threads.ThreadPoolExecutor`,\n        :class:`~parsl.executors.ipp.IPyParallelExecutor`, or :class:`~parsl.executors.swift_t.TurbineExecutor`. Default\n        is [:class:`~parsl.executors.threads.ThreadPoolExecutor()`].\n    app_cache : bool, optional\n        Enable app caching. Default is True.\n    checkpoint_files : list of str, optional\n        List of paths to checkpoint files. Default is None.\n    checkpoint_mode : str, optional\n        Checkpoint mode to use, can be 'dfk_exit', 'task_exit', or 'periodic'. If set to\n        `None`, checkpointing will be disabled. Default is None.\n    checkpoint_period : str, optional\n        Time interval (in \"HH:MM:SS\") at which to checkpoint completed tasks. Only has an effect if\n        `checkpoint_mode='periodic'`.\n    data_management_max_threads : int, optional\n        Maximum number of threads to allocate for the data manager to use for managing input and output transfers.\n        Default is 10.\n    monitoring_config : MonitoringConfig, optional\n        The config to use for database monitoring. Default is None which does not log to a database.\n    lazy_errors : bool, optional\n        If True, errors from task failures will not be raised until `future.result()` is called. Otherwise, they will\n        be raised as soon as the task returns. Default is True.\n    retries : int, optional\n        Set the number of retries in case of failure. Default is 0.\n    run_dir : str, optional\n        Path to run directory. Default is 'runinfo'.\n    strategy : str, optional\n        Strategy to use for scaling resources according to workflow needs. Can be 'simple' or `None`. If `None`, dynamic\n        scaling will be disabled. Default is 'simple'.\n    usage_tracking : bool, optional\n        Set this field to True to Opt-in to Parsl's usage tracking system. Parsl only collects minimal, non personally-identifiable,\n        information used for reporting to our funding agencies. Default is False.\n    \"\"\"\n    def __init__(self,\n                 executors=None,\n                 app_cache=True,\n                 checkpoint_files=None,\n                 checkpoint_mode=None,\n                 checkpoint_period=None,\n                 data_management_max_threads=10,\n                 lazy_errors=True,\n                 retries=0,\n                 run_dir='runinfo',\n                 strategy='simple',\n                 monitoring_config=None,\n                 usage_tracking=False):\n        if executors is None:\n            executors = [ThreadPoolExecutor()]\n        self.executors = executors\n        self.app_cache = app_cache\n        self.checkpoint_files = checkpoint_files\n        self.checkpoint_mode = checkpoint_mode\n        if checkpoint_period is not None:\n            if checkpoint_mode is None:\n                logger.debug('The requested `checkpoint_period={}` will have no effect because `checkpoint_mode=None`'.format(\n                    checkpoint_period)\n                )\n            elif checkpoint_mode != 'periodic':\n                logger.debug(\"Requested checkpoint period of {} only has an effect with checkpoint_mode='periodic'\".format(\n                    checkpoint_period)\n                )\n        if checkpoint_mode == 'periodic' and checkpoint_period is None:\n            checkpoint_period = \"00:30:00\"\n        self.checkpoint_period = checkpoint_period\n        self.data_management_max_threads = data_management_max_threads\n        self.lazy_errors = lazy_errors\n        self.retries = retries\n        self.run_dir = run_dir\n        self.strategy = strategy\n        self.usage_tracking = usage_tracking\n        self.monitoring_config = monitoring_config\n\n    @property\n    def executors(self):\n        return self._executors\n\n    @executors.setter\n    def executors(self, executors):\n        labels = [e.label for e in executors]\n        duplicates = [e for n, e in enumerate(labels) if e in labels[:n]]\n        if len(duplicates) > 0:\n            raise ConfigurationError('Executors must have unique labels ({})'.format(\n                ', '.join(['label={}'.format(repr(d)) for d in duplicates])))\n        self._executors = executors\n", "path": "parsl/config.py"}]}