Skip to content

Commit 8044106

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 b1ef680 commit 8044106

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
@@ -593,12 +593,30 @@ async def _put(self, href, item, etag):
593593
async def update(self, href, item, etag):
594594
if etag is None:
595595
raise ValueError("etag must be given and must not be None.")
596-
href, etag = await self._put(self._normalize_href(href), item, etag)
596+
try:
597+
href, etag = await self._put(self._normalize_href(href), item, etag)
598+
except aiohttp.ClientResponseError as e:
599+
if e.status == 409:
600+
dav_logger.debug("Conflict, will delete old event and recreate it.")
601+
await self.delete(self._normalize_href(href), None)
602+
dav_logger.debug("Now trying again")
603+
href, etag = await self._put(self._normalize_href(href), item, None)
604+
else:
605+
raise e
597606
return etag
598607

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

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

0 commit comments

Comments
 (0)