From: Alan T. DeKok Date: Fri, 10 Nov 2017 14:51:02 +0000 (-0500) Subject: do exponential backoff for trying to lock the detail.work file X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2f88d91e892a3feedbd11ed93fa5c02b7077c31;p=thirdparty%2Ffreeradius-server.git do exponential backoff for trying to lock the detail.work file --- diff --git a/src/modules/proto_detail/proto_detail.h b/src/modules/proto_detail/proto_detail.h index 7a81e901d13..5c1b93e0afb 100644 --- a/src/modules/proto_detail/proto_detail.h +++ b/src/modules/proto_detail/proto_detail.h @@ -83,6 +83,8 @@ typedef struct proto_detail_work_t { uint32_t poll_interval; //!< interval between polling + uint32_t lock_interval; //!< interval between trying the locks. + uint32_t irt; uint32_t mrt; uint32_t mrc; diff --git a/src/modules/proto_detail/proto_detail_file.c b/src/modules/proto_detail/proto_detail_file.c index 5612a87d86a..ad1d5c6bfaf 100644 --- a/src/modules/proto_detail/proto_detail_file.c +++ b/src/modules/proto_detail/proto_detail_file.c @@ -242,8 +242,14 @@ static void work_exists(proto_detail_file_t *inst, int fd) close(fd); - when.tv_sec = 0; - when.tv_usec = USEC / 10; + when.tv_usec = inst->lock_interval % USEC; + when.tv_sec = inst->lock_interval / USEC; + + /* + * Ensure that we don't do massive busy-polling. + */ + inst->lock_interval += inst->lock_interval / 2; + if (inst->lock_interval > (30 * USEC)) inst->lock_interval = 30 * USEC; DEBUG3("Waiting %d.%06ds for lock on file %s", (int) when.tv_sec, (int) when.tv_usec, inst->filename_work); @@ -448,6 +454,8 @@ redo: return; } + inst->lock_interval = USEC / 10; + /* * It exists, go process it! *