Skip to content

Commit 1de90f9

Browse files
feat: Deprecate identity retrieval (#1876)
* feat: Deprecate identity retrieval * fix: Test * fix: Update sharp * fix: Try fixing sharp builds * fix: Sharp version * fix: Remove sharp build
1 parent 2eb305b commit 1de90f9

File tree

11 files changed

+378
-377
lines changed

11 files changed

+378
-377
lines changed

content/src/components.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { ContentAuthenticator } from './service/auth/Authenticator'
3434
import { GarbageCollectionManager } from './service/garbage-collection/GarbageCollectionManager'
3535
import { PointerManager } from './service/pointers/PointerManager'
3636
import { ChallengeSupervisor } from './service/synchronization/ChallengeSupervisor'
37-
import { ContentCluster } from './service/synchronization/ContentCluster'
37+
import { createContentCluster } from './logic/cluster'
3838
import { createBatchDeployerComponent } from './service/synchronization/batchDeployer'
3939
import { createRetryFailedDeployments } from './service/synchronization/retryFailedDeployments'
4040
import { createServerValidator } from './service/validations/server'
@@ -118,11 +118,9 @@ export async function initComponentsWithEnv(env: Environment): Promise<AppCompon
118118
: [env.getConfig(EnvironmentConfig.DECENTRALAND_ADDRESS)]
119119
const authenticator = new ContentAuthenticator(l1Provider, decentralandAddresses as EthAddress[])
120120

121-
const contentCluster = new ContentCluster(
121+
const contentCluster = createContentCluster(
122122
{
123123
daoClient,
124-
challengeSupervisor,
125-
fetcher,
126124
logs,
127125
env,
128126
clock

content/src/logic/cluster-helpers.ts

Lines changed: 0 additions & 73 deletions
This file was deleted.
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import { CatalystServerInfo } from '@dcl/catalyst-contracts'
2+
import { sleep } from '@dcl/snapshots-fetcher/dist/utils'
3+
import { ILoggerComponent } from '@well-known-components/interfaces'
4+
import future from 'fp-future'
5+
import { EnvironmentConfig } from '../../Environment'
6+
import { AppComponents } from '../../types'
7+
import { IContentClusterComponent } from './types'
8+
9+
function shuffleArray<T>(arr: T[]): T[] {
10+
for (let i = arr.length - 1; i > 0; i--) {
11+
const j = Math.floor(Math.random() * (i + 1))
12+
;[arr[i], arr[j]] = [arr[j], arr[i]]
13+
}
14+
return arr
15+
}
16+
17+
function normalizeContentBaseUrl(url: string): string {
18+
return url.toLowerCase().replace(/\/$/, '')
19+
}
20+
21+
function getAllOtherAddressesOnDAO(
22+
allServers: Array<CatalystServerInfo>,
23+
normalizedContentServerAddress: string
24+
): string[] {
25+
const serverUrls = allServers
26+
.map(({ address }) => address)
27+
.filter((address) => normalizeContentBaseUrl(address) != normalizedContentServerAddress)
28+
29+
return shuffleArray(serverUrls)
30+
}
31+
32+
export function createContentCluster(
33+
components: Pick<AppComponents, 'logs' | 'daoClient' | 'env' | 'clock'>,
34+
timeBetweenSyncs: number
35+
): IContentClusterComponent {
36+
const logger: ILoggerComponent.ILogger = components.logs.getLogger('ContentCluster')
37+
38+
const serverClients: Set<string> = new Set()
39+
let timeOfLastSync: number = 0
40+
const syncFinishedEventCallbacks: Array<(serverClients: Set<string>) => void> = []
41+
const stoppedFuture = future<void>()
42+
43+
const normalizedContentServerAddress = normalizeContentBaseUrl(
44+
components.env.getConfig<string>(EnvironmentConfig.CONTENT_SERVER_ADDRESS)
45+
)
46+
47+
async function getContentServersFromDao(): Promise<string[]> {
48+
try {
49+
const allServersInDAO = await components.daoClient.getAllContentServers()
50+
51+
if (allServersInDAO.length == 0) {
52+
throw new Error('There are no servers.')
53+
}
54+
55+
const allServerBaseUrls = getAllOtherAddressesOnDAO(allServersInDAO, normalizedContentServerAddress)
56+
57+
// Remove servers no longer in DAO
58+
for (const serverBaseUrl of serverClients) {
59+
if (!allServerBaseUrls.includes(serverBaseUrl)) {
60+
serverClients.delete(serverBaseUrl)
61+
logger.info(`Removing server '${serverBaseUrl}'`)
62+
}
63+
}
64+
65+
// Detect new servers
66+
for (const serverBaseUrl of allServerBaseUrls) {
67+
if (!serverClients.has(serverBaseUrl)) {
68+
serverClients.add(serverBaseUrl)
69+
logger.info(`Discovered new server '${serverBaseUrl}'.`)
70+
}
71+
}
72+
73+
timeOfLastSync = components.clock.now()
74+
75+
for (const cb of syncFinishedEventCallbacks) {
76+
cb(serverClients)
77+
}
78+
} catch (error) {
79+
logger.error(`Failed to sync with the DAO \n${error}`)
80+
}
81+
return Array.from(serverClients)
82+
}
83+
84+
async function syncWithDAOJob() {
85+
logger.info(`Starting sync with DAO every ${timeBetweenSyncs}ms`)
86+
87+
while (stoppedFuture.isPending) {
88+
await Promise.race([sleep(timeBetweenSyncs), stoppedFuture])
89+
if (!stoppedFuture.isPending) return
90+
await getContentServersFromDao()
91+
}
92+
}
93+
94+
return {
95+
async start() {
96+
await getContentServersFromDao()
97+
syncWithDAOJob().catch(logger.error)
98+
},
99+
100+
async stop() {
101+
stoppedFuture.resolve()
102+
},
103+
104+
getAllServersInCluster(): string[] {
105+
return Array.from(serverClients)
106+
},
107+
108+
onSyncFinished(cb: (serverClients: Set<string>) => void): void {
109+
syncFinishedEventCallbacks.push(cb)
110+
},
111+
112+
getStatus(): { lastSyncWithDAO: number } {
113+
return { lastSyncWithDAO: timeOfLastSync }
114+
}
115+
}
116+
}

content/src/logic/cluster/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { createContentCluster } from './component'
2+
export { IContentClusterComponent } from './types'

content/src/logic/cluster/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { IBaseComponent } from '@well-known-components/interfaces'
2+
3+
export type IContentClusterComponent = IBaseComponent & {
4+
getAllServersInCluster(): string[]
5+
onSyncFinished(cb: (serverClients: Set<string>) => void): void
6+
getStatus(): { lastSyncWithDAO: number }
7+
}

content/src/service/synchronization/ContentCluster.ts

Lines changed: 0 additions & 154 deletions
This file was deleted.

content/src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { ContentAuthenticator } from './service/auth/Authenticator'
3434
import { GarbageCollectionManager } from './service/garbage-collection/GarbageCollectionManager'
3535
import { PointerManager } from './service/pointers/PointerManager'
3636
import { IChallengeSupervisor } from './service/synchronization/ChallengeSupervisor'
37-
import { ContentCluster } from './service/synchronization/ContentCluster'
37+
import { IContentClusterComponent } from './logic/cluster'
3838
import { IRetryFailedDeploymentsComponent } from './service/synchronization/retryFailedDeployments'
3939
import { ServerValidator } from './service/validations/server'
4040
import { ProcessedSnapshotsStorageComponent } from './ports/processedSnapshotStorage'
@@ -83,7 +83,7 @@ export type AppComponents = {
8383
synchronizationState: SynchronizationState
8484
deployedEntitiesBloomFilter: DeployedEntitiesBloomFilter
8585
challengeSupervisor: IChallengeSupervisor
86-
contentCluster: ContentCluster
86+
contentCluster: IContentClusterComponent
8787
pointerManager: PointerManager
8888
failedDeployments: IFailedDeploymentsComponent
8989
deployRateLimiter: IDeployRateLimiterComponent

0 commit comments

Comments
 (0)