Skip to content

Commit c324fc3

Browse files
committed
Add start_time in past check
1 parent 5104edb commit c324fc3

File tree

3 files changed

+17
-2
lines changed

3 files changed

+17
-2
lines changed

src/sonyflake_turbo/pure.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from threading import Lock
2-
from time import sleep, time_ns
2+
from time import sleep, time, time_ns
33
from typing import overload
44

55
try:
@@ -75,6 +75,9 @@ def __init__(self, *machine_ids: int, start_time: int = SONYFLAKE_EPOCH):
7575
if not isinstance(start_time, int):
7676
raise TypeError("start_time must be an integer")
7777

78+
if start_time >= time():
79+
raise ValueError("start_time must be in the past")
80+
7881
self._machine_ids = sorted(machine_ids_set)
7982
self._max_i = len(machine_ids_set) * SONYFLAKE_SEQUENCE_COUNT
8083
self._start_time = start_time * 100

src/sonyflake_turbo/sonyflake.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ static int sonyflake_init(PyObject *py_self, PyObject *args, PyObject *kwargs) {
7878
PyObject *start_time_obj = NULL;
7979
Py_ssize_t machine_ids_len = 0;
8080
long long start_time = 0;
81+
struct timespec now = {0, 0};
8182
long machine_id = 0;
8283
Py_ssize_t i = 0;
8384

@@ -148,6 +149,13 @@ static int sonyflake_init(PyObject *py_self, PyObject *args, PyObject *kwargs) {
148149
goto err;
149150
}
150151

152+
timespec_get(&now, TIME_UTC);
153+
154+
if (start_time >= now.tv_sec) {
155+
PyErr_SetString(PyExc_ValueError, "start_time must be in the past");
156+
goto err;
157+
}
158+
151159
self->start_time.tv_sec = start_time;
152160
self->start_time.tv_nsec = 0;
153161

tests/test_sonyflake_turbo.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import threading
44
from concurrent.futures import ThreadPoolExecutor
55
from datetime import datetime
6-
from time import perf_counter, sleep
6+
from time import perf_counter, sleep, time
77

88
from pytest import mark, raises
99

@@ -64,6 +64,10 @@ def test_non_int_start_time(self, cls: type) -> None:
6464
start_time=datetime(2025, 1, 1),
6565
)
6666

67+
def test_start_time_in_future(self, cls: type) -> None:
68+
with raises(ValueError, match=r"start_time must be in the past"):
69+
cls(0x0000, start_time=int(time() + 10))
70+
6771
@mark.parametrize(
6872
["use_iter", "n"],
6973
[(use_iter, n) for use_iter in [True, False] for n in [1, 100, 250000]],

0 commit comments

Comments
 (0)