mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-26 01:44:48 +00:00
- Fix version_time.go overflow: guard timestampPart > MaxInt64 before the inversion subtraction to prevent uint64 wrap - Make all expiry checks inclusive (!now.Before instead of now.After) so actions trigger at the exact scheduled instant - Add NoncurrentIndex to ObjectInfo so Evaluate() can properly handle NewerNoncurrentVersions via ShouldExpireNoncurrentVersion() - Add test for high-bit overflow version ID
43 lines
1.2 KiB
Go
43 lines
1.2 KiB
Go
package s3lifecycle
|
|
|
|
import (
|
|
"math"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// versionIdFormatThreshold distinguishes old vs new format version IDs.
|
|
// New format (inverted timestamps) produces values above this threshold;
|
|
// old format (raw timestamps) produces values below it.
|
|
const versionIdFormatThreshold = 0x4000000000000000
|
|
|
|
// GetVersionTimestamp extracts the actual timestamp from a SeaweedFS version ID,
|
|
// handling both old (raw nanosecond) and new (inverted nanosecond) formats.
|
|
// Returns zero time if the version ID is invalid or "null".
|
|
func GetVersionTimestamp(versionId string) time.Time {
|
|
ns := getVersionTimestampNanos(versionId)
|
|
if ns == 0 {
|
|
return time.Time{}
|
|
}
|
|
return time.Unix(0, ns)
|
|
}
|
|
|
|
// getVersionTimestampNanos extracts the raw nanosecond timestamp from a version ID.
|
|
func getVersionTimestampNanos(versionId string) int64 {
|
|
if len(versionId) < 16 || versionId == "null" {
|
|
return 0
|
|
}
|
|
timestampPart, err := strconv.ParseUint(versionId[:16], 16, 64)
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
if timestampPart > math.MaxInt64 {
|
|
return 0
|
|
}
|
|
if timestampPart > versionIdFormatThreshold {
|
|
// New format: inverted timestamp, convert back.
|
|
return int64(math.MaxInt64 - timestampPart)
|
|
}
|
|
return int64(timestampPart)
|
|
}
|