[lib/httputils] fixed floating-point error when parsing time in RFC3339 format (#5814)

* [lib/promutils, lib/httputils] fixed floating-point error when parsing time in RFC3339 format (#5801)

* fixed tests

* fixed test

* Revert "fixed test"

This reverts commit 8a29764806.

* Revert "fixed tests"

This reverts commit 9ce13d1042.

* Revert "[lib/promutils, lib/httputils] fixed floating-point error when parsing time in RFC3339 format (#5801)"

This reverts commit a7a04bd4

* [lib/httputils] fixed floating-point error when parsing time in RFC3339 format (#5801)

---------

Co-authored-by: Nikolay <nik@victoriametrics.com>
This commit is contained in:
Alexander Marshalov 2024-02-22 10:20:54 +01:00 committed by GitHub
parent 7332431b90
commit ce3ec3ff2e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 5 additions and 2 deletions

View file

@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"math"
"time" "time"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
@ -18,7 +19,7 @@ func parseTime(s string) (time.Time, error) {
if err != nil { if err != nil {
return time.Time{}, fmt.Errorf("cannot parse %s: %w", s, err) return time.Time{}, fmt.Errorf("cannot parse %s: %w", s, err)
} }
msecs := int64(secs * 1e3) msecs := int64(math.Round(secs * 1e3))
if msecs < minTimeMsecs { if msecs < minTimeMsecs {
msecs = 0 msecs = 0
} }

View file

@ -40,6 +40,7 @@ See also [LTS releases](https://docs.victoriametrics.com/LTS-releases.html).
* BUGFIX: fix the misleading error `0ms is out of allowed range [0 ...` when passing `step=0` to [/api/v1/query](https://docs.victoriametrics.com/keyconcepts/#instant-query) * BUGFIX: fix the misleading error `0ms is out of allowed range [0 ...` when passing `step=0` to [/api/v1/query](https://docs.victoriametrics.com/keyconcepts/#instant-query)
or [/api/v1/query_range](https://docs.victoriametrics.com/keyconcepts/#range-query). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5795). or [/api/v1/query_range](https://docs.victoriametrics.com/keyconcepts/#range-query). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5795).
* BUGFIX: [Single-node VictoriaMetrics](https://docs.victoriametrics.com/) and `vmselect` in [VictoriaMetrics cluster](https://docs.victoriametrics.com/cluster-victoriametrics/): fixed floating-point error when parsing time in RFC3339 format. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5801) for details.
* BUGFIX: [vmalert](https://docs.victoriametrics.com/#vmalert): consistently sort groups by name and filename on `/groups` page in UI. This should prevent non-deterministic sorting for groups with identical names. * BUGFIX: [vmalert](https://docs.victoriametrics.com/#vmalert): consistently sort groups by name and filename on `/groups` page in UI. This should prevent non-deterministic sorting for groups with identical names.
## [v1.98.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.98.0) ## [v1.98.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.98.0)

View file

@ -32,7 +32,7 @@ func GetTime(r *http.Request, argKey string, defaultMs int64) (int64, error) {
if err != nil { if err != nil {
return 0, fmt.Errorf("cannot parse %s=%s: %w", argKey, argValue, err) return 0, fmt.Errorf("cannot parse %s=%s: %w", argKey, argValue, err)
} }
msecs := int64(secs * 1e3) msecs := int64(math.Round(secs * 1e3))
if msecs < minTimeMsecs { if msecs < minTimeMsecs {
msecs = 0 msecs = 0
} }

View file

@ -47,6 +47,7 @@ func TestGetTimeSuccess(t *testing.T) {
f("2019-02-02T01:01:00", 1549069260000) f("2019-02-02T01:01:00", 1549069260000)
f("2019-02-02T01:01:01", 1549069261000) f("2019-02-02T01:01:01", 1549069261000)
f("2019-07-07T20:01:02Z", 1562529662000) f("2019-07-07T20:01:02Z", 1562529662000)
f("2020-02-21T16:07:49.433Z", 1582301269433)
f("2019-07-07T20:47:40+03:00", 1562521660000) f("2019-07-07T20:47:40+03:00", 1562521660000)
f("-292273086-05-16T16:47:06Z", minTimeMsecs) f("-292273086-05-16T16:47:06Z", minTimeMsecs)
f("292277025-08-18T07:12:54.999999999Z", maxTimeMsecs) f("292277025-08-18T07:12:54.999999999Z", maxTimeMsecs)