diff --git a/packages/nocodb/src/lib/version-upgrader/ncAttachmentUpgrader.ts b/packages/nocodb/src/lib/version-upgrader/ncAttachmentUpgrader.ts index a66cae4359..f5c1393b3a 100644 --- a/packages/nocodb/src/lib/version-upgrader/ncAttachmentUpgrader.ts +++ b/packages/nocodb/src/lib/version-upgrader/ncAttachmentUpgrader.ts @@ -6,6 +6,7 @@ import Model from '../models/Model'; import { XKnex } from '../db/sql-data-mapper/index'; import NcConnectionMgrv2 from '../utils/common/NcConnectionMgrv2'; import { BaseType, UITypes } from 'nocodb-sdk'; +import { throwTimeoutError } from './ncUpgradeErrors'; // before 0.103.0, an attachment object was like // [{ @@ -68,6 +69,12 @@ export default async function ({ ncMeta }: NcUpgraderCtx) { : NcConnectionMgrv2.get(base); const models = await base.getModels(ncMeta); + // used in timeout error message + const timeoutErrorInfo = { + projectTitle: project.title, + connection: knex.client.config.connection, + }; + for (const model of models) { try { // if the table is missing in database, skip @@ -170,6 +177,9 @@ export default async function ({ ncMeta }: NcUpgraderCtx) { } catch (e) { // ignore the error related to deleted project if (!isProjectDeleted) { + // throw the custom timeout error message if applicable + throwTimeoutError(e, timeoutErrorInfo); + // throw general error throw e; } } diff --git a/packages/nocodb/src/lib/version-upgrader/ncAttachmentUpgrader_0104002.ts b/packages/nocodb/src/lib/version-upgrader/ncAttachmentUpgrader_0104002.ts index 3531b296c9..cb47f72122 100644 --- a/packages/nocodb/src/lib/version-upgrader/ncAttachmentUpgrader_0104002.ts +++ b/packages/nocodb/src/lib/version-upgrader/ncAttachmentUpgrader_0104002.ts @@ -6,6 +6,7 @@ import Model from '../models/Model'; import { XKnex } from '../db/sql-data-mapper/index'; import NcConnectionMgrv2 from '../utils/common/NcConnectionMgrv2'; import { BaseType, UITypes } from 'nocodb-sdk'; +import { throwTimeoutError } from './ncUpgradeErrors'; // after 0101002 upgrader, the attachment object would become broken when // (1) switching views after updating a singleSelect field @@ -60,6 +61,12 @@ export default async function ({ ncMeta }: NcUpgraderCtx) { : NcConnectionMgrv2.get(base); const models = await base.getModels(ncMeta); + // used in timeout error message + const timeoutErrorInfo = { + projectTitle: project.title, + connection: knex.client.config.connection, + }; + for (const model of models) { try { // if the table is missing in database, skip @@ -151,6 +158,9 @@ export default async function ({ ncMeta }: NcUpgraderCtx) { } catch (e) { // ignore the error related to deleted project if (!isProjectDeleted) { + // throw the custom timeout error message if applicable + throwTimeoutError(e, timeoutErrorInfo); + // throw general error throw e; } } diff --git a/packages/nocodb/src/lib/version-upgrader/ncUpgradeErrors.ts b/packages/nocodb/src/lib/version-upgrader/ncUpgradeErrors.ts new file mode 100644 index 0000000000..3b9b7330ab --- /dev/null +++ b/packages/nocodb/src/lib/version-upgrader/ncUpgradeErrors.ts @@ -0,0 +1,27 @@ +export function throwTimeoutError(e, timeoutErrorInfo) { + if ( + [ + 'EHOSTDOWN', + 'ETIMEDOUT', + 'EHOSTUNREACH', + 'ENOTFOUND', + 'ECONNREFUSED', + ].includes(e.code) + ) { + let db = ''; + if (timeoutErrorInfo.connection.filename) { + // for sqlite + db = timeoutErrorInfo.connection.filename; + } else if ( + timeoutErrorInfo.connection.database && + timeoutErrorInfo.connection.host && + timeoutErrorInfo.connection.port + ) { + db = `${timeoutErrorInfo.connection.database} (${timeoutErrorInfo.connection.host}:${timeoutErrorInfo.connection.port})`; + } + throw new Error( + `Failed to connect the database ${db} for Project ${timeoutErrorInfo.projectTitle}. + Please fix the connection issue or remove the project before trying to upgrade.` + ); + } +}