]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Take nanoseconds into account in `DynBlock`'s `until` accessor 14570/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 20 Aug 2024 13:14:45 +0000 (15:14 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 20 Aug 2024 13:14:45 +0000 (15:14 +0200)
pdns/dnsdistdist/dnsdist-lua-inspection.cc

index b9828e0e8abbfd1cd9b5f82962dfffbed780d2f8..cba8e03e4e0cee6d06c3081e5d4b154b30abd64c 100644 (file)
@@ -1054,7 +1054,21 @@ void setupLuaInspection(LuaContext& luaCtx)
       gettime(&nowMonotonic);
       timespec nowRealTime{};
       gettime(&nowRealTime, true);
-      nowRealTime.tv_sec += (block.until.tv_sec - nowMonotonic.tv_sec);
+
+      auto seconds = block.until.tv_sec - nowMonotonic.tv_sec;
+      auto nseconds = block.until.tv_nsec - nowMonotonic.tv_nsec;
+      if (nseconds < 0) {
+        seconds -= 1;
+        nseconds += 1000000000;
+      }
+
+      nowRealTime.tv_sec += seconds;
+      nowRealTime.tv_nsec += nseconds;
+      if (nowRealTime.tv_nsec > 1000000000) {
+        nowRealTime.tv_sec += 1;
+        nowRealTime.tv_nsec -= 1000000000;
+      }
+
       return nowRealTime; }, [](DynBlock& block, [[maybe_unused]] timespec until) {});
   luaCtx.registerMember<DynBlock, unsigned int>(
     "blocks", [](const DynBlock& block) { return block.blocks.load(); }, [](DynBlock& block, [[maybe_unused]] unsigned int blocks) {});