Skip to content

Commit 3fe7dd7

Browse files
committed
Retry PUT 409 errors - delete and re-create event
Attempt to address #963 I would appreciate a code review here - there might be a more elegant way to address this problem, but it works for my (very limited) use case.
1 parent 2fbb0ab commit 3fe7dd7

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

vdirsyncer/storage/dav.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -592,12 +592,30 @@ async def _put(self, href, item, etag):
592592
async def update(self, href, item, etag):
593593
if etag is None:
594594
raise ValueError("etag must be given and must not be None.")
595-
href, etag = await self._put(self._normalize_href(href), item, etag)
595+
try:
596+
href, etag = await self._put(self._normalize_href(href), item, etag)
597+
except aiohttp.ClientResponseError as e:
598+
if e.status == 409:
599+
dav_logger.debug("Conflict, will delete old event and recreate it.")
600+
await self.delete(self._normalize_href(href), None)
601+
dav_logger.debug("Now trying again")
602+
href, etag = await self._put(self._normalize_href(href), item, None)
603+
else:
604+
raise e
596605
return etag
597606

598607
async def upload(self, item: Item):
599608
href = self._get_href(item)
600-
rv = await self._put(href, item, None)
609+
try:
610+
rv = await self._put(href, item, None)
611+
except aiohttp.ClientResponseError as e:
612+
if e.status == 409:
613+
dav_logger.debug("Conflict, will delete old event and recreate it.")
614+
await self.delete(href, None)
615+
dav_logger.debug("Now trying again")
616+
rv = await self._put(href, item, None)
617+
else:
618+
raise e
601619
return rv
602620

603621
async def delete(self, href, etag):

0 commit comments

Comments
 (0)