-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add semgrep rule to catch non-determinism in FSM (#13725)
See `message:` in rule for details. Co-authored-by: Luiz Aoqui <[email protected]>
- Loading branch information
1 parent
d456cc1
commit be2262e
Showing
1 changed file
with
26 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
rules: | ||
- id: "no-time-in-fsm" | ||
patterns: | ||
- pattern: time.Now() | ||
|
||
# Metric state is local to the server and therefore must use time. | ||
- pattern-not-inside: | | ||
defer metrics.MeasureSince(...) | ||
# The timetable's whole point is to roughly track timestamps for Raft log | ||
# indexes, so it must use time. | ||
- pattern-not-inside: | | ||
$N.timetable.Witness(...) | ||
message: | | ||
time.Now() should not be called from within the Server's FSM. Apply Raft | ||
log messages to the State Store must be deterministic so that each server | ||
contains exactly the same state. Since time drifts between nodes, it must | ||
be set before the Raft log message is applied so that all Raft members | ||
see the same timestamp. | ||
languages: | ||
- "go" | ||
severity: "WARNING" | ||
paths: | ||
include: | ||
- "nomad/fsm.*" | ||
- "nomad/state/state_store.*" |