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()

```

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

{"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"}]}