Skip to content
This repository has been archived by the owner on Sep 6, 2022. It is now read-only.

Commit

Permalink
fix: make timestamps strictly increasing
Browse files Browse the repository at this point in the history
On Linux, this is almost always the case. Windows, however, doesn't have
nanosecond accuracy.

We make the timestamp sequence numbers strictly increasing by returning
the last timestamp + 1 where necessary.
  • Loading branch information
Stebalien committed Jul 16, 2021
1 parent e5b6740 commit ccdc39e
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion peer/record.go
Expand Up @@ -2,6 +2,7 @@ package peer

import (
"fmt"
"sync/atomic"
"time"

pb "github.com/libp2p/go-libp2p-core/peer/pb"
Expand Down Expand Up @@ -125,9 +126,21 @@ func PeerRecordFromProtobuf(msg *pb.PeerRecord) (*PeerRecord, error) {
return record, nil
}

var lastTimestamp uint64

// TimestampSeq is a helper to generate a timestamp-based sequence number for a PeerRecord.
func TimestampSeq() uint64 {
return uint64(time.Now().UnixNano())
now := uint64(time.Now().UnixNano())
previous := atomic.LoadUint64(&lastTimestamp)
// If the new time is not greater than the last tiemstamp, or if someone else beats us to
// updateing the timestamp, just use last+1.
//
// Technically, last+1 could be before "now". But it's still strictly increasing and close
// enough.
if now <= previous || !atomic.CompareAndSwapUint64(&lastTimestamp, previous, now) {
now = atomic.AddUint64(&lastTimestamp, 1)
}
return now
}

// Domain is used when signing and validating PeerRecords contained in Envelopes.
Expand Down

0 comments on commit ccdc39e

Please sign in to comment.