diff options
-rw-r--r-- | databases/rrdtool/Makefile | 4 | ||||
-rw-r--r-- | databases/rrdtool/files/extra-patch-locktimeout | 80 |
2 files changed, 83 insertions, 1 deletions
diff --git a/databases/rrdtool/Makefile b/databases/rrdtool/Makefile index 88591c7e5ada..8d53ecfd2265 100644 --- a/databases/rrdtool/Makefile +++ b/databases/rrdtool/Makefile @@ -26,12 +26,13 @@ CPE_VENDOR= rrdtool_project PORTEXAMPLES= cgi-demo.cgi -OPTIONS_DEFINE= DEJAVU GRAPH MMAP NLS PERL PYTHON \ +OPTIONS_DEFINE= DEJAVU GRAPH MMAP LOCKTIMEOUT NLS PERL PYTHON \ RUBY EXAMPLES DOCS OPTIONS_DEFAULT=DEJAVU GRAPH MMAP PERL OPTIONS_SUB= yes GRAPH_DESC= Enable the rrdtool graph command (needs cairo) DEJAVU_DESC= Use DejaVu fonts (requires X11) +LOCKTIMEOUT_DESC=Enable the patch for lock timeout MMAP_DESC= Use mmap in rrd_update PERL_DESC= Build PERL module PYTHON_DESC= Build PYTHON bindings @@ -46,6 +47,7 @@ GRAPH_CONFIGURE_OFF= --disable-rrdcgi --disable-rrd_graph GRAPH_LIB_DEPENDS= libfreetype.so:print/freetype2 \ libpng.so:graphics/png GRAPH_USE= GNOME=cairo,pango +LOCKTIMEOUT_EXTRA_PATCHES=${PATCHDIR}/extra-patch-locktimeout MMAP_CONFIGURE_ENABLE= mmap NLS_CONFIGURE_ENABLE= nls NLS_USE= GNOME=intltool diff --git a/databases/rrdtool/files/extra-patch-locktimeout b/databases/rrdtool/files/extra-patch-locktimeout new file mode 100644 index 000000000000..9d6d4607a7fb --- /dev/null +++ b/databases/rrdtool/files/extra-patch-locktimeout @@ -0,0 +1,80 @@ +--- src/rrd_open.c.orig 2019-05-28 01:48:09.000000000 +0700 ++++ src/rrd_open.c 2022-07-11 00:05:29.242533000 +0700 +@@ -32,6 +32,16 @@ + #include "rrd_rados.h" + #endif + ++#include <signal.h> ++/* ++ * Signal handler for SIGALRM. ++ */ ++static void ++timeout(int sig) ++{ ++ (void)sig; ++} ++ + #define MEMBLK 8192 + + #ifdef _WIN32 +@@ -776,8 +786,9 @@ int rrd_rwlock( + return 0; + } + #endif +- int rcstat; ++ int rcstat, waitsec; + rrd_simple_file_t *rrd_simple_file; ++ char *endptr, *pwaitsec; + + rrd_simple_file = (rrd_simple_file_t *) rrd_file->pvt; + #ifdef USE_WINDOWS_LOCK +@@ -786,6 +797,25 @@ int rrd_rwlock( + /* Silence unused parameter compiler warning */ + (void) writelock; + #else ++ if ((pwaitsec = getenv("RRDTOOL_LOCK_TIMEOUT")) != NULL) { ++ waitsec = strtol(pwaitsec, &endptr, 0); ++ if (*endptr == '\0' && waitsec >= 0) { ++ if (waitsec > 0) { /* Set up a timeout. */ ++ struct sigaction act; ++ ++ act.sa_handler = timeout; ++ sigemptyset(&act.sa_mask); ++ act.sa_flags = SA_RESETHAND; /* Note that we do not set SA_RESTART. */ ++ sigaction(SIGALRM, &act, NULL); ++ alarm(waitsec); ++ } ++ rcstat = flock(rrd_simple_file->fd, writelock ? LOCK_EX : LOCK_SH); ++ if (waitsec > 0) ++ alarm(0); ++ ++ return (rcstat); ++ } ++ } + { + struct flock lock; + +--- doc/rrdtool.pod.orig 2019-02-04 20:54:28.000000000 +0700 ++++ doc/rrdtool.pod 2022-07-11 00:37:16.486373000 +0700 +@@ -321,6 +321,21 @@ + L<rrdcached>, a caching daemon for RRDtool which may help you lessen the + stress on your disks. + ++=head1 ENVIRONMENT ++ ++=over 8 ++ ++=item RRDTOOL_LOCK_TIMEOUT ++ ++By default, B<RRDtool> tries to lock RRD file and fails ++if it cannot obtain the lock immediately. ++This variable allows to change this behavior and specify ++a time interval in seconds to wait for lock if the file is busy. ++It will fail if the lock cannot be obtained in time. ++Zero value makes it wait for the lock indefinitely. ++ ++=back ++ + =head1 SEE ALSO + + rrdcreate, rrdupdate, rrdgraph, rrddump, rrdfetch, rrdtune, rrdlast, rrdxport, |