We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
confusing error message with simple configs
Using this config:

```
config = Config(executors=[ThreadPoolExecutor()])
```

parsl startup logs this message to the logger:

```
$ ./c.py 
2018-07-11 08:04:42 parsl.config:66 [DEBUG]  Checkpoint period only has an effect with checkpoint_mode='periodic'
```

This appears to be in config creation, as it happens even without passing that config to create a DataFlowKernel.

This might cause user confusion that something is broken/misconfigured.


--- 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 libsubmit.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     lazy_errors : bool, optional
34         If True, errors from task failures will not be raised until `future.result()` is called. Otherwise, they will
35         be raised as soon as the task returns. Default is True.
36     retries : int, optional
37         Set the number of retries in case of failure. Default is 0.
38     run_dir : str, optional
39         Path to run directory. Default is 'runinfo'.
40     strategy : str, optional
41         Strategy to use for scaling resources according to workflow needs. Can be 'simple' or `None`. If `None`, dynamic
42         scaling will be disabled. Default is 'simple'.
43     usage_tracking : bool, optional
44         Enable usage tracking. Default is True.
45     """
46     def __init__(self,
47                  executors=None,
48                  app_cache=True,
49                  checkpoint_files=None,
50                  checkpoint_mode=None,
51                  checkpoint_period="00:30:00",
52                  data_management_max_threads=10,
53                  lazy_errors=True,
54                  retries=0,
55                  run_dir='runinfo',
56                  strategy='simple',
57                  db_logger_config=None,
58                  usage_tracking=True):
59         if executors is None:
60             executors = [ThreadPoolExecutor()]
61         self.executors = executors
62         self.app_cache = app_cache
63         self.checkpoint_files = checkpoint_files
64         self.checkpoint_mode = checkpoint_mode
65         if checkpoint_mode is not 'periodic' and checkpoint_period is not None:
66             logger.debug("Checkpoint period only has an effect with checkpoint_mode='periodic'")
67         self.checkpoint_period = checkpoint_period
68         self.data_management_max_threads = data_management_max_threads
69         self.lazy_errors = lazy_errors
70         self.retries = retries
71         self.run_dir = run_dir
72         self.strategy = strategy
73         self.usage_tracking = usage_tracking
74         self.db_logger_config = db_logger_config
75 
76     @property
77     def executors(self):
78         return self._executors
79 
80     @executors.setter
81     def executors(self, executors):
82         labels = [e.label for e in executors]
83         duplicates = [e for n, e in enumerate(labels) if e in labels[:n]]
84         if len(duplicates) > 0:
85             raise ConfigurationError('Executors must have unique labels ({})'.format(
86                 ', '.join(['label={}'.format(repr(d)) for d in duplicates])))
87         self._executors = executors
88
```
--- 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
@@ -48,7 +48,7 @@
                  app_cache=True,
                  checkpoint_files=None,
                  checkpoint_mode=None,
-                 checkpoint_period="00:30:00",
+                 checkpoint_period=None,
                  data_management_max_threads=10,
                  lazy_errors=True,
                  retries=0,
@@ -62,8 +62,17 @@
         self.app_cache = app_cache
         self.checkpoint_files = checkpoint_files
         self.checkpoint_mode = checkpoint_mode
-        if checkpoint_mode is not 'periodic' and checkpoint_period is not None:
-            logger.debug("Checkpoint period only has an effect with checkpoint_mode='periodic'")
+        if checkpoint_period is not None:
+            if checkpoint_mode is None:
+                logger.debug('The requested `checkpoint_period={}` will have no effect because `checkpoint_mode=None`'.format(
+                    checkpoint_period)
+                )
+            elif checkpoint_mode is not 'periodic':
+                logger.debug("Requested checkpoint period of {} only has an effect with checkpoint_mode='periodic'".format(
+                    checkpoint_period)
+                )
+        if checkpoint_mode is 'periodic' and checkpoint_period is None:
+            checkpoint_period = "00:30:00"
         self.checkpoint_period = checkpoint_period
         self.data_management_max_threads = data_management_max_threads
         self.lazy_errors = lazy_errors

{"golden_diff": "diff --git a/parsl/config.py b/parsl/config.py\n--- a/parsl/config.py\n+++ b/parsl/config.py\n@@ -48,7 +48,7 @@\n                  app_cache=True,\n                  checkpoint_files=None,\n                  checkpoint_mode=None,\n-                 checkpoint_period=\"00:30:00\",\n+                 checkpoint_period=None,\n                  data_management_max_threads=10,\n                  lazy_errors=True,\n                  retries=0,\n@@ -62,8 +62,17 @@\n         self.app_cache = app_cache\n         self.checkpoint_files = checkpoint_files\n         self.checkpoint_mode = checkpoint_mode\n-        if checkpoint_mode is not 'periodic' and checkpoint_period is not None:\n-            logger.debug(\"Checkpoint period only has an effect with checkpoint_mode='periodic'\")\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 is not '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 is '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", "issue": "confusing error message with simple configs\nUsing this config:\r\n\r\n```\r\nconfig = Config(executors=[ThreadPoolExecutor()])\r\n```\r\n\r\nparsl startup logs this message to the logger:\r\n\r\n```\r\n$ ./c.py \r\n2018-07-11 08:04:42 parsl.config:66 [DEBUG]  Checkpoint period only has an effect with checkpoint_mode='periodic'\r\n```\r\n\r\nThis appears to be in config creation, as it happens even without passing that config to create a DataFlowKernel.\r\n\r\nThis might cause user confusion that something is broken/misconfigured.\r\n\n", "before_files": [{"content": "import logging\n\nfrom libsubmit.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    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=\"00:30:00\",\n                 data_management_max_threads=10,\n                 lazy_errors=True,\n                 retries=0,\n                 run_dir='runinfo',\n                 strategy='simple',\n                 db_logger_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_mode is not 'periodic' and checkpoint_period is not None:\n            logger.debug(\"Checkpoint period only has an effect with checkpoint_mode='periodic'\")\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.db_logger_config = db_logger_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 libsubmit.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    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                 db_logger_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 is not '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 is '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.db_logger_config = db_logger_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"}]}