ponder-sh / ponder

A backend framework for crypto apps
https://ponder.sh
MIT License
585 stars 84 forks source link

Ponder crashes on 2nd startup if using custom indexes #899

Closed mchmatt closed 3 months ago

mchmatt commented 3 months ago

Description

If I add a custom index to a model and shutdown Ponder after it is done indexing (through CTRL-C), it fails starting back up.

Repro - model

Accounts: p.createTable({
  id: p.hex(),
  nftBalances: p.many("NFTBalances.ownerId")
}),
NFTBalances: p.createTable({
  id: p.string(), // `${contractAddress}-${tokenId}-${ownerAddress}`
  balance: p.bigint(),
  lastUpdatedAtBlock: p.bigint(),
  ownerId: p.hex().references("Accounts.id")
}, {
  ownerIndex: p.index(["ownerId"]) // WHERE "ownerId" = '0x0000...'
})

Repro - flow

Possibly related: I'm getting this in Windows; will test in a Linux environment a few hours from now

  1. npm run start
  2. wait until indexing finishes
  3. stop with ctrl-c
  4. npm run start should crash

Relevant logs

(this is when running Ponder for the second time, after shutdown)

11:04:43 AM INFO  indexing   Completed historical indexing
11:04:43 AM WARN  internal   Database error during 'createIndexes', retrying after 100 milliseconds. Error: relation "NFTBalances_ownerIndex" already exists
11:04:43 AM WARN  internal   Database error during 'createIndexes', retrying after 200 milliseconds. Error: relation "NFTBalances_ownerIndex" already exists
11:04:43 AM WARN  internal   Database error during 'createIndexes', retrying after 400 milliseconds. Error: relation "NFTBalances_ownerIndex" already exists
11:04:44 AM ERROR process    Caught unhandledRejection event with error:
error: relation "NFTBalances_ownerIndex" already exists
    at C:\Users\Matt\Desktop\Work\projects\reworked-systems\items-indexer\node_modules\pg\lib\client.js:526:17
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at PostgresConnection.executeQuery (file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/kysely/dist/esm/dialect/postgres/postgres-driver.js:69:28)
    at PostgresConnection.connection.executeQuery (file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/kysely/dist/esm/driver/runtime-driver.js:89:24)
    at file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/kysely/dist/esm/query-executor/query-executor-base.js:35:28
    at DefaultConnectionProvider.provideConnection (file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/kysely/dist/esm/driver/default-connection-provider.js:10:20)
    at DefaultQueryExecutor.executeQuery (file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/kysely/dist/esm/query-executor/query-executor-base.js:34:16)
    at file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/@ponder/core/src/database/postgres/service.ts:633:13
    at HeadlessKysely.wrap (file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/@ponder/core/src/database/kysely.ts:35:24)
    at file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/@ponder/core/src/database/postgres/service.ts:614:11
    at PostgresConnection.executeQuery (file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/kysely/dist/esm/dialect/postgres/postgres-driver.js:88:41)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at PostgresConnection.connection.executeQuery (file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/kysely/dist/esm/driver/runtime-driver.js:89:24)
    at file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/kysely/dist/esm/query-executor/query-executor-base.js:35:28
    at DefaultConnectionProvider.provideConnection (file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/kysely/dist/esm/driver/default-connection-provider.js:10:20)
    at file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/@ponder/core/src/database/postgres/service.ts:633:13
    at HeadlessKysely.wrap (file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/@ponder/core/src/database/kysely.ts:35:24)
    at file:///C:/Users/Matt/Desktop/Work/projects/reworked-systems/items-indexer/node_modules/@ponder/core/src/database/postgres/service.ts:614:11
    at async Promise.all (index 0)
mchmatt commented 3 months ago

Looks like https://github.com/ponder-sh/ponder/pull/898 might fix this, will test and report back

mchmatt commented 3 months ago

Can confirm it works after merging that PR locally! \:D