diff --git a/internal/datastore/revisions/hlcrevision.go b/internal/datastore/revisions/hlcrevision.go index 03a1299a07..957992b03c 100644 --- a/internal/datastore/revisions/hlcrevision.go +++ b/internal/datastore/revisions/hlcrevision.go @@ -50,13 +50,14 @@ func parseHLCRevisionString(revisionStr string) (datastore.Revision, error) { return datastore.NoRevision, fmt.Errorf("invalid revision string: %q", revisionStr) } - logicalclock, err := strconv.ParseInt(pieces[1], 10, 32) - if err != nil { - return datastore.NoRevision, fmt.Errorf("invalid revision string: %q", revisionStr) + if len(pieces[1]) > logicalClockLength { + return datastore.NoRevision, spiceerrors.MustBugf("invalid revision string due to unexpected logical clock size (%d): %q", len(pieces[1]), revisionStr) } - if len(pieces[1]) != logicalClockLength { - return datastore.NoRevision, spiceerrors.MustBugf("invalid revision string due to unexpected logical clock size (%d): %q", len(pieces[1]), revisionStr) + paddedLogicalClockStr := pieces[1] + strings.Repeat("0", logicalClockLength-len(pieces[1])) + logicalclock, err := strconv.ParseInt(paddedLogicalClockStr, 10, 32) + if err != nil { + return datastore.NoRevision, fmt.Errorf("invalid revision string: %q", revisionStr) } return HLCRevision{timestamp, uint32(logicalclock) + logicalClockOffset}, nil diff --git a/internal/datastore/revisions/hlcrevision_test.go b/internal/datastore/revisions/hlcrevision_test.go index 962abdfa1f..6aefa6be7b 100644 --- a/internal/datastore/revisions/hlcrevision_test.go +++ b/internal/datastore/revisions/hlcrevision_test.go @@ -17,6 +17,8 @@ func TestNewForHLC(t *testing.T) { "-1", "1.0000000023", "1703283409994227985.0000000004", + "1703283409994227985.0000000040", + "1703283409994227985.0010000000", } for _, tc := range tcs { @@ -41,6 +43,7 @@ func TestTimestampNanoSec(t *testing.T) { "1.0000000023": 1, "9223372036854775807.0000000002": 9223372036854775807, "1703283409994227985.0000000004": 1703283409994227985, + "1703283409994227985.0000000040": 1703283409994227985, } for tc, nano := range tcs { @@ -63,6 +66,11 @@ func TestInexactFloat64(t *testing.T) { "1.0000000023": 1.0000000023, "9223372036854775807.0000000002": 9223372036854775807.0000000002, "1703283409994227985.0000000004": 1703283409994227985.0000000004, + "1703283409994227985.0000000040": 1703283409994227985.000000004, + "1703283409994227985.000000004": 1703283409994227985.000000004, + "1703283409994227985.0010": 1703283409994227985.001, + "1703283409994227985.0010000000": 1703283409994227985.001, + "1703283409994227985.001": 1703283409994227985.001, } for tc, floatValue := range tcs { @@ -117,6 +125,15 @@ func TestHLCKeyEquals(t *testing.T) { { "1703283409994227985.0000000005", "1703283409994227985.0000000005", true, }, + { + "1703283409994227985.0000000050", "1703283409994227985.0000000050", true, + }, + { + "1703283409994227985.0000000050", "1703283409994227985.0000000005", false, + }, + { + "1703283409994227985.000000005", "1703283409994227985.0000000050", true, + }, } for _, tc := range tcs {