Skip to content

Commit 4799dc2

Browse files
committed
fix: docker build and auto-fix timing issues (clamp last scanned to
prevent future times)
1 parent 901d82a commit 4799dc2

4 files changed

Lines changed: 25 additions & 11 deletions

File tree

packages/api/Dockerfile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,18 @@ RUN apt-get update && \
88
apt-get install -y --no-install-recommends pkg-config libssl-dev && \
99
rm -rf /var/lib/apt/lists/*
1010

11-
# Copy workspace files
11+
# Copy workspace files (all members for workspace resolution)
1212
COPY Cargo.toml ./
1313
COPY packages/shared/Cargo.toml packages/shared/
1414
COPY packages/api/Cargo.toml packages/api/
15+
COPY packages/scanner/Cargo.toml packages/scanner/
1516
COPY migration/Cargo.toml migration/
1617

1718
# Create stub files for dependency resolution
18-
RUN mkdir -p packages/shared/src packages/api/src migration/src && \
19+
RUN mkdir -p packages/shared/src packages/api/src packages/scanner/src migration/src && \
1920
echo "pub fn main() {}" > packages/shared/src/lib.rs && \
2021
echo "fn main() {}" > packages/api/src/main.rs && \
22+
echo "fn main() {}" > packages/scanner/src/main.rs && \
2123
echo "pub fn main() {}" > migration/src/lib.rs
2224

2325
# Build dependencies (cached layer)
@@ -26,6 +28,7 @@ RUN cargo fetch
2628
# Copy actual source code
2729
COPY packages/shared/src packages/shared/src
2830
COPY packages/api/src packages/api/src
31+
COPY packages/scanner/src packages/scanner/src
2932
COPY migration/src migration/src
3033

3134
# Build API service

packages/scanner/Dockerfile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@ RUN apt-get update && \
88
apt-get install -y --no-install-recommends pkg-config libssl-dev && \
99
rm -rf /var/lib/apt/lists/*
1010

11-
# Copy workspace files
11+
# Copy workspace files (all members for workspace resolution)
1212
COPY Cargo.toml ./
1313
COPY packages/shared/Cargo.toml packages/shared/
14+
COPY packages/api/Cargo.toml packages/api/
1415
COPY packages/scanner/Cargo.toml packages/scanner/
1516
COPY migration/Cargo.toml migration/
1617

1718
# Create stub files for dependency resolution
18-
RUN mkdir -p packages/shared/src packages/scanner/src migration/src && \
19+
RUN mkdir -p packages/shared/src packages/api/src packages/scanner/src migration/src && \
1920
echo "pub fn main() {}" > packages/shared/src/lib.rs && \
21+
echo "fn main() {}" > packages/api/src/main.rs && \
2022
echo "fn main() {}" > packages/scanner/src/main.rs && \
2123
echo "pub fn main() {}" > migration/src/lib.rs
2224

@@ -25,6 +27,7 @@ RUN cargo fetch
2527

2628
# Copy actual source code
2729
COPY packages/shared/src packages/shared/src
30+
COPY packages/api/src packages/api/src
2831
COPY packages/scanner/src packages/scanner/src
2932
COPY migration/src migration/src
3033

packages/shared/src/repositories/asns.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ impl AsnRepository {
194194
FROM asn_ranges r
195195
JOIN asns a ON r.asn = a.asn
196196
WHERE a.category = '{}'
197-
AND (r.last_scanned_at IS NULL
197+
AND (r.last_scanned_at IS NULL
198+
OR r.last_scanned_at > NOW() -- future timestamps: treat as eligible
198199
OR r.last_scanned_at < NOW() - INTERVAL '{} HOURS')
199200
ORDER BY
200201
r.last_scanned_at ASC NULLS FIRST,

packages/shared/src/services/scheduler.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -432,10 +432,16 @@ impl Scheduler {
432432
// If the range is exhausted, check if enough time has passed before resetting.
433433
// This prevents the same IPs from being rescanned immediately after epoch reset.
434434
if current_offset >= total_ips {
435-
// Check cooldown: only reset if enough time has passed since last scan
435+
// SAFETY: Clamp future timestamps to "now" to prevent permanent cooldown stalls
436+
// (e.g. from clock drift, manual DB edits, or timezone bugs).
437+
// If last_scanned_at is in the future, treat it as None (never scanned = always eligible).
436438
let can_reset = range.last_scanned_at.map_or(true, |last_scan| {
437-
let hours_since = (now - last_scan.and_utc()).num_hours();
438-
hours_since >= min_epoch_hours as i64
439+
if last_scan.and_utc() > now {
440+
true // future timestamp: treat as never scanned, always eligible
441+
} else {
442+
let hours_since = (now - last_scan.and_utc()).num_hours();
443+
hours_since >= min_epoch_hours as i64
444+
}
439445
});
440446

441447
if can_reset {
@@ -450,13 +456,14 @@ impl Scheduler {
450456
);
451457
} else {
452458
ranges_skipped_cooldown += 1;
459+
let hours_since = range.last_scanned_at.map_or(0, |t| {
460+
if t.and_utc() > now { 0 } else { (now - t.and_utc()).num_hours() }
461+
});
453462
tracing::debug!(
454463
"Range {} skipped (epoch {}), only {}h since last scan (need {}h)",
455464
range.cidr,
456465
range.scan_epoch,
457-
range
458-
.last_scanned_at
459-
.map_or(0, |t| (now - t.and_utc()).num_hours()),
466+
hours_since,
460467
min_epoch_hours
461468
);
462469
}

0 commit comments

Comments
 (0)