Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-oslo.concurrency for 
openSUSE:Factory checked in at 2023-03-07 16:49:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-oslo.concurrency (Old)
 and      /work/SRC/openSUSE:Factory/.python-oslo.concurrency.new.31432 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-oslo.concurrency"

Tue Mar  7 16:49:36 2023 rev:19 rq:1069678 version:5.0.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-oslo.concurrency/python-oslo.concurrency.changes
  2022-05-25 20:34:55.548258083 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-oslo.concurrency.new.31432/python-oslo.concurrency.changes
       2023-03-07 16:50:11.177537824 +0100
@@ -1,0 +2,17 @@
+Mon Mar  6 15:22:54 UTC 2023 - Dirk Müller <[email protected]>
+
+- avoid eventlet lockup
+
+-------------------------------------------------------------------
+Sat Oct  1 12:23:30 UTC 2022 - [email protected]
+
+- update to version 5.0.1
+  - Log when waiting to acquire lock
+  - Ignore coverage result files
+  - Fix formatting of release list
+  - Drop python3.6/3.7 support in testing runtime
+  - Fix fair internal lock used from eventlet.spawn_n
+  - Prove that spawn_n with fair lock is broken
+  - Imported Translations from Zanata
+
+-------------------------------------------------------------------

Old:
----
  oslo.concurrency-4.5.1.tar.gz

New:
----
  oslo.concurrency-5.0.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-oslo.concurrency.spec ++++++
--- /var/tmp/diff_new_pack.2fFxJv/_old  2023-03-07 16:50:11.789541045 +0100
+++ /var/tmp/diff_new_pack.2fFxJv/_new  2023-03-07 16:50:11.793541066 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-oslo.concurrency
 #
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,13 +17,13 @@
 
 
 Name:           python-oslo.concurrency
-Version:        4.5.1
+Version:        5.0.1
 Release:        0
 Summary:        OpenStack oslo.concurrency library
 License:        Apache-2.0
 Group:          Development/Languages/Python
 URL:            https://docs.openstack.org/oslo.concurrency
-Source0:        
https://files.pythonhosted.org/packages/source/o/oslo.concurrency/oslo.concurrency-4.5.1.tar.gz
+Source0:        
https://files.pythonhosted.org/packages/source/o/oslo.concurrency/oslo.concurrency-5.0.1.tar.gz
 BuildRequires:  openstack-macros
 BuildRequires:  python3-eventlet
 BuildRequires:  python3-fasteners >= 0.7.0
@@ -73,7 +73,7 @@
 This package contains the documentation.
 
 %prep
-%autosetup -p1 -n oslo.concurrency-4.5.1
+%autosetup -p1 -n oslo.concurrency-5.0.1
 %py_req_cleanup
 
 %build
@@ -88,7 +88,8 @@
 %{py3_install}
 
 %check
-python3 -m stestr.cli run
+env TEST_EVENTLET=0 %{openstack_stestr_run}
+env TEST_EVENTLET=1 %{openstack_stestr_run}
 
 %files -n python3-oslo.concurrency
 %license LICENSE

++++++ oslo.concurrency-4.5.1.tar.gz -> oslo.concurrency-5.0.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.concurrency-4.5.1/AUTHORS 
new/oslo.concurrency-5.0.1/AUTHORS
--- old/oslo.concurrency-4.5.1/AUTHORS  2022-05-05 11:52:43.000000000 +0200
+++ new/oslo.concurrency-5.0.1/AUTHORS  2022-09-06 13:53:22.000000000 +0200
@@ -7,6 +7,7 @@
 Ann Kamyshnikova <[email protected]>
 Arata Notsu <[email protected]>
 Arthur Dayne <[email protected]>
+Balazs Gibizer <[email protected]>
 Ben Nemec <[email protected]>
 Ben Nemec <[email protected]>
 Brad Pokorny <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.concurrency-4.5.1/ChangeLog 
new/oslo.concurrency-5.0.1/ChangeLog
--- old/oslo.concurrency-4.5.1/ChangeLog        2022-05-05 11:52:43.000000000 
+0200
+++ new/oslo.concurrency-5.0.1/ChangeLog        2022-09-06 13:53:22.000000000 
+0200
@@ -1,6 +1,21 @@
 CHANGES
 =======
 
+5.0.1
+-----
+
+* Ignore coverage result files
+* Fix fair internal lock used from eventlet.spawn\_n
+* Prove that spawn\_n with fair lock is broken
+
+5.0.0
+-----
+
+* Log when waiting to acquire lock
+* Imported Translations from Zanata
+* Fix formatting of release list
+* Drop python3.6/3.7 support in testing runtime
+
 4.5.1
 -----
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.concurrency-4.5.1/PKG-INFO 
new/oslo.concurrency-5.0.1/PKG-INFO
--- old/oslo.concurrency-4.5.1/PKG-INFO 2022-05-05 11:52:43.497313700 +0200
+++ new/oslo.concurrency-5.0.1/PKG-INFO 2022-09-06 13:53:22.727933200 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: oslo.concurrency
-Version: 4.5.1
+Version: 5.0.1
 Summary: Oslo Concurrency library
 Home-page: https://docs.openstack.org/oslo.concurrency/latest/
 Author: OpenStack
@@ -42,10 +42,8 @@
 Classifier: Operating System :: POSIX :: Linux
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: Implementation :: CPython
-Requires-Python: >=3.6
+Requires-Python: >=3.8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.concurrency-4.5.1/oslo.concurrency.egg-info/PKG-INFO 
new/oslo.concurrency-5.0.1/oslo.concurrency.egg-info/PKG-INFO
--- old/oslo.concurrency-4.5.1/oslo.concurrency.egg-info/PKG-INFO       
2022-05-05 11:52:43.000000000 +0200
+++ new/oslo.concurrency-5.0.1/oslo.concurrency.egg-info/PKG-INFO       
2022-09-06 13:53:22.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: oslo.concurrency
-Version: 4.5.1
+Version: 5.0.1
 Summary: Oslo Concurrency library
 Home-page: https://docs.openstack.org/oslo.concurrency/latest/
 Author: OpenStack
@@ -42,10 +42,8 @@
 Classifier: Operating System :: POSIX :: Linux
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: Implementation :: CPython
-Requires-Python: >=3.6
+Requires-Python: >=3.8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.concurrency-4.5.1/oslo.concurrency.egg-info/SOURCES.txt 
new/oslo.concurrency-5.0.1/oslo.concurrency.egg-info/SOURCES.txt
--- old/oslo.concurrency-4.5.1/oslo.concurrency.egg-info/SOURCES.txt    
2022-05-05 11:52:43.000000000 +0200
+++ new/oslo.concurrency-5.0.1/oslo.concurrency.egg-info/SOURCES.txt    
2022-09-06 13:53:22.000000000 +0200
@@ -61,6 +61,7 @@
 releasenotes/notes/add-python-exec-kwarg-3a7a0c0849f9bb21.yaml
 releasenotes/notes/add_reno-3b4ae0789e9c45b4.yaml
 releasenotes/notes/drop-python27-support-7d837a45dae941bb.yaml
+releasenotes/notes/log_acquiring_lock-1b224c0b1562ec97.yaml
 releasenotes/notes/timeout-c3fb65acda04c1c7.yaml
 releasenotes/source/conf.py
 releasenotes/source/index.rst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.concurrency-4.5.1/oslo.concurrency.egg-info/pbr.json 
new/oslo.concurrency-5.0.1/oslo.concurrency.egg-info/pbr.json
--- old/oslo.concurrency-4.5.1/oslo.concurrency.egg-info/pbr.json       
2022-05-05 11:52:43.000000000 +0200
+++ new/oslo.concurrency-5.0.1/oslo.concurrency.egg-info/pbr.json       
2022-09-06 13:53:22.000000000 +0200
@@ -1 +1 @@
-{"git_version": "145f060", "is_release": true}
\ No newline at end of file
+{"git_version": "01cf2ff", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.concurrency-4.5.1/oslo_concurrency/locale/en_GB/LC_MESSAGES/oslo_concurrency.po
 
new/oslo.concurrency-5.0.1/oslo_concurrency/locale/en_GB/LC_MESSAGES/oslo_concurrency.po
--- 
old/oslo.concurrency-4.5.1/oslo_concurrency/locale/en_GB/LC_MESSAGES/oslo_concurrency.po
    2022-05-05 11:52:12.000000000 +0200
+++ 
new/oslo.concurrency-5.0.1/oslo_concurrency/locale/en_GB/LC_MESSAGES/oslo_concurrency.po
    2022-09-06 13:52:43.000000000 +0200
@@ -8,15 +8,16 @@
 # Andreas Jaeger <[email protected]>, 2016. #zanata
 # Andi Chandler <[email protected]>, 2017. #zanata
 # Andi Chandler <[email protected]>, 2020. #zanata
+# Andi Chandler <[email protected]>, 2022. #zanata
 msgid ""
 msgstr ""
 "Project-Id-Version: oslo.concurrency VERSION\n"
 "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n";
-"POT-Creation-Date: 2020-04-27 10:22+0000\n"
+"POT-Creation-Date: 2022-05-11 16:22+0000\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2020-04-27 08:12+0000\n"
+"PO-Revision-Date: 2022-06-13 07:42+0000\n"
 "Last-Translator: Andi Chandler <[email protected]>\n"
 "Language: en_GB\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -70,6 +71,9 @@
 msgid "Command requested root, but did not specify a root helper."
 msgstr "Command requested root, but did not specify a root helper."
 
+msgid "Disabling blocking is not supported when using fair locks."
+msgstr "Disabling blocking is not supported when using fair locks."
+
 msgid "Environment not supported over SSH"
 msgstr "Environment not supported over SSH"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.concurrency-4.5.1/oslo_concurrency/lockutils.py 
new/oslo.concurrency-5.0.1/oslo_concurrency/lockutils.py
--- old/oslo.concurrency-4.5.1/oslo_concurrency/lockutils.py    2022-05-05 
11:52:12.000000000 +0200
+++ new/oslo.concurrency-5.0.1/oslo_concurrency/lockutils.py    2022-09-06 
13:52:43.000000000 +0200
@@ -32,6 +32,14 @@
 
 from oslo_concurrency._i18n import _
 
+try:
+    # import eventlet optionally
+    import eventlet
+    from eventlet import patcher as eventlet_patcher
+except ImportError:
+    eventlet = None
+    eventlet_patcher = None
+
 
 LOG = logging.getLogger(__name__)
 
@@ -79,12 +87,23 @@
     return conf.oslo_concurrency.lock_path
 
 
-InterProcessLock = fasteners.InterProcessLock
-ReaderWriterLock = fasteners.ReaderWriterLock
-"""A reader/writer lock.
+class ReaderWriterLock(fasteners.ReaderWriterLock):
+    """A reader/writer lock.
+
+    .. versionadded:: 0.4
+    """
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        # Until https://github.com/eventlet/eventlet/issues/731 is resolved
+        # we need to use eventlet.getcurrent instead of
+        # threading.current_thread if we are running in a monkey patched
+        # environment
+        if eventlet is not None and eventlet_patcher is not None:
+            if eventlet_patcher.is_monkey_patched('thread'):
+                self._current_thread = eventlet.getcurrent
+
 
-.. versionadded:: 0.4
-"""
+InterProcessLock = fasteners.InterProcessLock
 
 
 class FairLocks(object):
@@ -289,6 +308,8 @@
     else:
         int_lock = internal_lock(name, semaphores=semaphores,
                                  blocking=blocking)
+    if do_log:
+        LOG.debug('Acquiring lock "%s"', name)
     with int_lock:
         if do_log:
             LOG.debug('Acquired lock "%(lock)s"', {'lock': name})
@@ -378,7 +399,9 @@
             t1 = timeutils.now()
             t2 = None
             gotten = True
+            f_name = reflection.get_callable_name(f)
             try:
+                LOG.debug('Acquiring lock "%s" by "%s"', name, f_name)
                 with lock(name, lock_file_prefix, external, lock_path,
                           do_log=False, semaphores=semaphores, delay=delay,
                           fair=fair, blocking=blocking):
@@ -386,7 +409,7 @@
                     LOG.debug('Lock "%(name)s" acquired by "%(function)s" :: '
                               'waited %(wait_secs)0.3fs',
                               {'name': name,
-                               'function': reflection.get_callable_name(f),
+                               'function': f_name,
                                'wait_secs': (t2 - t1)})
                     return f(*args, **kwargs)
             except AcquireLockFailedException:
@@ -401,7 +424,7 @@
                           ' held %(held_secs)s',
                           {'name': name,
                            'gotten': 'released' if gotten else 'unacquired',
-                           'function': reflection.get_callable_name(f),
+                           'function': f_name,
                            'held_secs': held_secs})
         return inner
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.concurrency-4.5.1/oslo_concurrency/tests/unit/test_lockutils_eventlet.py
 
new/oslo.concurrency-5.0.1/oslo_concurrency/tests/unit/test_lockutils_eventlet.py
--- 
old/oslo.concurrency-4.5.1/oslo_concurrency/tests/unit/test_lockutils_eventlet.py
   2022-05-05 11:52:12.000000000 +0200
+++ 
new/oslo.concurrency-5.0.1/oslo_concurrency/tests/unit/test_lockutils_eventlet.py
   2022-09-06 13:52:43.000000000 +0200
@@ -51,3 +51,54 @@
         pool.waitall()
 
         self.assertTrue(self.completed)
+
+
+class TestInternalLock(test_base.BaseTestCase):
+    def _test_internal_lock_with_two_threads(self, fair, spawn):
+        self.other_started = eventlet.event.Event()
+        self.other_finished = eventlet.event.Event()
+
+        def other():
+            self.other_started.send('started')
+            with lockutils.lock("my-lock", fair=fair):
+                pass
+            self.other_finished.send('finished')
+
+        with lockutils.lock("my-lock", fair=fair):
+            # holding the lock and starting another thread that also wants to
+            # take it before finishes
+            spawn(other)
+            # let the other thread start
+            self.other_started.wait()
+            eventlet.sleep(0)
+            # the other thread should not have finished as it would need the
+            # lock we are holding
+            self.assertIsNone(
+                self.other_finished.wait(0.5),
+                "Two threads was able to take the same lock",
+            )
+
+        # we released the lock, let the other thread take it and run to
+        # completion
+        result = self.other_finished.wait()
+        self.assertEqual('finished', result)
+
+    def test_lock_with_spawn(self):
+        self._test_internal_lock_with_two_threads(
+            fair=False, spawn=eventlet.spawn
+        )
+
+    def test_lock_with_spawn_n(self):
+        self._test_internal_lock_with_two_threads(
+            fair=False, spawn=eventlet.spawn_n
+        )
+
+    def test_fair_lock_with_spawn(self):
+        self._test_internal_lock_with_two_threads(
+            fair=True, spawn=eventlet.spawn
+        )
+
+    def test_fair_lock_with_spawn_n(self):
+        self._test_internal_lock_with_two_threads(
+            fair=True, spawn=eventlet.spawn_n
+        )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.concurrency-4.5.1/releasenotes/notes/log_acquiring_lock-1b224c0b1562ec97.yaml
 
new/oslo.concurrency-5.0.1/releasenotes/notes/log_acquiring_lock-1b224c0b1562ec97.yaml
--- 
old/oslo.concurrency-4.5.1/releasenotes/notes/log_acquiring_lock-1b224c0b1562ec97.yaml
      1970-01-01 01:00:00.000000000 +0100
+++ 
new/oslo.concurrency-5.0.1/releasenotes/notes/log_acquiring_lock-1b224c0b1562ec97.yaml
      2022-09-06 13:52:43.000000000 +0200
@@ -0,0 +1,5 @@
+---
+features:
+  - |
+    Log before trying to acquire a lock to help detect deadlocks and long waits
+    to acquire locks.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.concurrency-4.5.1/releasenotes/source/index.rst 
new/oslo.concurrency-5.0.1/releasenotes/source/index.rst
--- old/oslo.concurrency-4.5.1/releasenotes/source/index.rst    2022-05-05 
11:52:12.000000000 +0200
+++ new/oslo.concurrency-5.0.1/releasenotes/source/index.rst    2022-09-06 
13:52:43.000000000 +0200
@@ -2,16 +2,16 @@
  oslo.concurrency Release Notes
 ================================
 
- .. toctree::
-    :maxdepth: 1
+.. toctree::
+   :maxdepth: 1
 
-    unreleased
-    victoria
-    ussuri
-    train
-    stein
-    rocky
-    queens
-    pike
-    ocata
-    newton
+   unreleased
+   victoria
+   ussuri
+   train
+   stein
+   rocky
+   queens
+   pike
+   ocata
+   newton
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo.concurrency-4.5.1/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
 
new/oslo.concurrency-5.0.1/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
--- 
old/oslo.concurrency-4.5.1/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
     2022-05-05 11:52:12.000000000 +0200
+++ 
new/oslo.concurrency-5.0.1/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
     2022-09-06 13:52:43.000000000 +0200
@@ -2,15 +2,16 @@
 # Andi Chandler <[email protected]>, 2017. #zanata
 # Andi Chandler <[email protected]>, 2018. #zanata
 # Andi Chandler <[email protected]>, 2020. #zanata
+# Andi Chandler <[email protected]>, 2022. #zanata
 msgid ""
 msgstr ""
 "Project-Id-Version: oslo.concurrency\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-07-01 10:57+0000\n"
+"POT-Creation-Date: 2022-05-11 16:21+0000\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2020-07-09 08:16+0000\n"
+"PO-Revision-Date: 2022-06-13 07:42+0000\n"
 "Last-Translator: Andi Chandler <[email protected]>\n"
 "Language-Team: English (United Kingdom)\n"
 "Language: en_GB\n"
@@ -106,6 +107,9 @@
 msgid "Ussuri Series Release Notes"
 msgstr "Ussuri Series Release Notes"
 
+msgid "Victoria Series Release Notes"
+msgstr "Victoria Series Release Notes"
+
 msgid ""
 "We now have optional support for ``fair`` locks.  When fair locks are "
 "specified, blocking waiters will acquire the lock in the order that they "
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.concurrency-4.5.1/setup.cfg 
new/oslo.concurrency-5.0.1/setup.cfg
--- old/oslo.concurrency-4.5.1/setup.cfg        2022-05-05 11:52:43.497313700 
+0200
+++ new/oslo.concurrency-5.0.1/setup.cfg        2022-09-06 13:53:22.727933200 
+0200
@@ -6,7 +6,7 @@
 author = OpenStack
 author_email = [email protected]
 home_page = https://docs.openstack.org/oslo.concurrency/latest/
-python_requires = >=3.6
+python_requires = >=3.8
 classifier = 
        Environment :: OpenStack
        Intended Audience :: Information Technology
@@ -15,8 +15,6 @@
        Operating System :: POSIX :: Linux
        Programming Language :: Python
        Programming Language :: Python :: 3
-       Programming Language :: Python :: 3.6
-       Programming Language :: Python :: 3.7
        Programming Language :: Python :: 3.8
        Programming Language :: Python :: 3.9
        Programming Language :: Python :: 3 :: Only
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo.concurrency-4.5.1/tox.ini 
new/oslo.concurrency-5.0.1/tox.ini
--- old/oslo.concurrency-4.5.1/tox.ini  2022-05-05 11:52:12.000000000 +0200
+++ new/oslo.concurrency-5.0.1/tox.ini  2022-09-06 13:52:43.000000000 +0200
@@ -37,7 +37,7 @@
 setenv =
   PYTHON=coverage run --source oslo_concurrency --parallel-mode
 commands =
-  stestr run {posargs}
+  env TEST_EVENTLET=0 lockutils-wrapper stestr run {posargs}
   coverage combine
   coverage html -d cover
   coverage xml -o cover/coverage.xml
@@ -55,4 +55,3 @@
 deps = {[testenv:docs]deps}
 commands =
   sphinx-build -a -E -W -d releasenotes/build/doctrees --keep-going -b html 
releasenotes/source releasenotes/build/html
-

Reply via email to