Add periodic connection re-sync (#260)

This commit is contained in:
Brendan Kellam 2025-04-03 17:51:01 -07:00 committed by GitHub
parent bbd8b221d6
commit 21bbe09fc9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 44 additions and 1 deletions

View file

@ -11,6 +11,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Change connection manager upsert timeout to 5 minutes - Change connection manager upsert timeout to 5 minutes
- Fix issue with repo display names being poorly formatted, especially for gerrit. ([#259](https://github.com/sourcebot-dev/sourcebot/pull/259)) - Fix issue with repo display names being poorly formatted, especially for gerrit. ([#259](https://github.com/sourcebot-dev/sourcebot/pull/259))
### Added
- Added config setting `resyncConnectionIntervalMs` to control how often a connection should be re-synced. ([#260](https://github.com/sourcebot-dev/sourcebot/pull/260))
## [3.0.1] - 2025-04-01 ## [3.0.1] - 2025-04-01
### Fixes ### Fixes

View file

@ -55,6 +55,11 @@ Some teams require Sourcebot to be configured via a file (where it can be stored
"description": "The interval (in milliseconds) at which the indexer should re-index all repositories. Defaults to 1 hour.", "description": "The interval (in milliseconds) at which the indexer should re-index all repositories. Defaults to 1 hour.",
"minimum": 1 "minimum": 1
}, },
"resyncConnectionIntervalMs": {
"type": "number",
"description": "The interval (in milliseconds) at which the connection manager should check for connections that need to be re-synced. Defaults to 24 hours.",
"minimum": 1
},
"resyncConnectionPollingIntervalMs": { "resyncConnectionPollingIntervalMs": {
"type": "number", "type": "number",
"description": "The polling rate (in milliseconds) at which the db should be checked for connections that need to be re-synced. Defaults to 1 second.", "description": "The polling rate (in milliseconds) at which the db should be checked for connections that need to be re-synced. Defaults to 1 second.",

View file

@ -71,9 +71,29 @@ export class ConnectionManager implements IConnectionManager {
public async registerPollingCallback() { public async registerPollingCallback() {
setInterval(async () => { setInterval(async () => {
const thresholdDate = new Date(Date.now() - this.settings.resyncConnectionIntervalMs);
const connections = await this.db.connection.findMany({ const connections = await this.db.connection.findMany({
where: { where: {
syncStatus: ConnectionSyncStatus.SYNC_NEEDED, OR: [
// When the connection needs to be synced, we want to sync it immediately.
{
syncStatus: ConnectionSyncStatus.SYNC_NEEDED,
},
// When the connection has already been synced, we only want to re-sync if the re-sync interval has elapsed
// (or if the date isn't set for some reason).
{
AND: [
{ OR: [
{ syncStatus: ConnectionSyncStatus.SYNCED },
{ syncStatus: ConnectionSyncStatus.SYNCED_WITH_WARNINGS },
]},
{ OR: [
{ syncedAt: null },
{ syncedAt: { lt: thresholdDate } },
]}
]
}
]
} }
}); });
for (const connection of connections) { for (const connection of connections) {

View file

@ -7,6 +7,7 @@ export const DEFAULT_SETTINGS: Settings = {
maxFileSize: 2 * 1024 * 1024, // 2MB in bytes maxFileSize: 2 * 1024 * 1024, // 2MB in bytes
maxTrigramCount: 20000, maxTrigramCount: 20000,
reindexIntervalMs: 1000 * 60 * 60, // 1 hour reindexIntervalMs: 1000 * 60 * 60, // 1 hour
resyncConnectionIntervalMs: 1000 * 60 * 60 * 24, // 24 hours
resyncConnectionPollingIntervalMs: 1000 * 1, // 1 second resyncConnectionPollingIntervalMs: 1000 * 1, // 1 second
reindexRepoPollingIntervalMs: 1000 * 1, // 1 second reindexRepoPollingIntervalMs: 1000 * 1, // 1 second
maxConnectionSyncJobConcurrency: 8, maxConnectionSyncJobConcurrency: 8,

View file

@ -23,6 +23,11 @@ const schema = {
"description": "The interval (in milliseconds) at which the indexer should re-index all repositories. Defaults to 1 hour.", "description": "The interval (in milliseconds) at which the indexer should re-index all repositories. Defaults to 1 hour.",
"minimum": 1 "minimum": 1
}, },
"resyncConnectionIntervalMs": {
"type": "number",
"description": "The interval (in milliseconds) at which the connection manager should check for connections that need to be re-synced. Defaults to 24 hours.",
"minimum": 1
},
"resyncConnectionPollingIntervalMs": { "resyncConnectionPollingIntervalMs": {
"type": "number", "type": "number",
"description": "The polling rate (in milliseconds) at which the db should be checked for connections that need to be re-synced. Defaults to 1 second.", "description": "The polling rate (in milliseconds) at which the db should be checked for connections that need to be re-synced. Defaults to 1 second.",

View file

@ -39,6 +39,10 @@ export interface Settings {
* The interval (in milliseconds) at which the indexer should re-index all repositories. Defaults to 1 hour. * The interval (in milliseconds) at which the indexer should re-index all repositories. Defaults to 1 hour.
*/ */
reindexIntervalMs?: number; reindexIntervalMs?: number;
/**
* The interval (in milliseconds) at which the connection manager should check for connections that need to be re-synced. Defaults to 24 hours.
*/
resyncConnectionIntervalMs?: number;
/** /**
* The polling rate (in milliseconds) at which the db should be checked for connections that need to be re-synced. Defaults to 1 second. * The polling rate (in milliseconds) at which the db should be checked for connections that need to be re-synced. Defaults to 1 second.
*/ */

View file

@ -23,6 +23,11 @@
"description": "The interval (in milliseconds) at which the indexer should re-index all repositories. Defaults to 1 hour.", "description": "The interval (in milliseconds) at which the indexer should re-index all repositories. Defaults to 1 hour.",
"minimum": 1 "minimum": 1
}, },
"resyncConnectionIntervalMs": {
"type": "number",
"description": "The interval (in milliseconds) at which the connection manager should check for connections that need to be re-synced. Defaults to 24 hours.",
"minimum": 1
},
"resyncConnectionPollingIntervalMs": { "resyncConnectionPollingIntervalMs": {
"type": "number", "type": "number",
"description": "The polling rate (in milliseconds) at which the db should be checked for connections that need to be re-synced. Defaults to 1 second.", "description": "The polling rate (in milliseconds) at which the db should be checked for connections that need to be re-synced. Defaults to 1 second.",