mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2026-03-25 13:53:03 -04:00
Although #9922 was deployed to Codeberg, it was reported on Matrix that a user observed a `-1` pull request count. @Gusted checked and verified that the stats stored in redis appeared incorrect, and that no errors occurred on Codeberg that included the repo ID (eg. deadlocks, SQL queries). ``` 127.0.0.1:6379> GET Repo:CountPulls:924266 "1" 127.0.0.1:6379> GET Repo:CountPullsClosed:924266 "2" ``` One possible cause is that when `UpdateRepoIssueNumbers` is invoked and invalidates the cache key for the repository, it is currently in a transaction; the next request for that cached count could be computed before the transaction is committed and the update is visible. It's been verified that `UpdateRepoIssueNumbers` is called within a transaction in most interactions (I put a panic in it if `db.InTransaction(ctx)`, and most related tests failed). This PR fixes that hole by performing the cache invalidation in an `AfterTx()` hook which is invoked after the transaction is committed to the database. (Another possible cause is documented in #10127) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10130 Reviewed-by: Gusted <gusted@noreply.codeberg.org> Co-authored-by: Mathieu Fenniak <mathieu@fenniak.net> Co-committed-by: Mathieu Fenniak <mathieu@fenniak.net>
27 lines
732 B
Go
27 lines
732 B
Go
// Copyright 2025 The Forgejo Authors. All rights reserved.
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package stats
|
|
|
|
import (
|
|
"context"
|
|
|
|
"forgejo.org/modules/optional"
|
|
"forgejo.org/modules/timeutil"
|
|
)
|
|
|
|
// Queue a recalculation of the stats on a `Milestone` for a given milestone by its ID
|
|
func QueueRecalcMilestoneByID(ctx context.Context, labelID int64) {
|
|
safePush(ctx, recalcRequest{
|
|
RecalcType: MilestoneByMilestoneID,
|
|
ObjectID: labelID,
|
|
})
|
|
}
|
|
|
|
func QueueRecalcMilestoneByIDWithDate(ctx context.Context, labelID int64, updateTimestamp timeutil.TimeStamp) {
|
|
safePush(ctx, recalcRequest{
|
|
RecalcType: MilestoneByMilestoneID,
|
|
ObjectID: labelID,
|
|
UpdateTimestamp: optional.Some(updateTimestamp),
|
|
})
|
|
}
|