more use of identifiable errors, improvements to inner error rendering, and more heuristics for is-retryable-error

This commit is contained in:
Hazelnoot 2025-05-22 12:27:54 -04:00
parent c8797451e3
commit 2cba0ada3c
33 changed files with 241 additions and 157 deletions

View file

@ -133,23 +133,18 @@ export class DeliverProcessorService {
}
});
if (res instanceof StatusError) {
if (res instanceof StatusError && !res.isRetryable) {
// 4xx
if (!res.isRetryable) {
// 相手が閉鎖していることを明示しているため、配送停止する
if (job.data.isSharedInbox && res.statusCode === 410) {
this.federatedInstanceService.fetchOrRegister(host).then(i => {
this.federatedInstanceService.update(i.id, {
suspensionState: 'goneSuspended',
});
// 相手が閉鎖していることを明示しているため、配送停止する
if (job.data.isSharedInbox && res.statusCode === 410) {
this.federatedInstanceService.fetchOrRegister(host).then(i => {
this.federatedInstanceService.update(i.id, {
suspensionState: 'goneSuspended',
});
throw new Bull.UnrecoverableError(`${host} is gone`);
}
throw new Bull.UnrecoverableError(`${res.statusCode} ${res.statusMessage}`);
});
throw new Bull.UnrecoverableError(`${host} is gone`);
}
// 5xx etc.
throw new Error(`${res.statusCode} ${res.statusMessage}`);
throw new Bull.UnrecoverableError(`${res.statusCode} ${res.statusMessage}`);
} else {
// DNS error, socket error, timeout ...
throw res;

View file

@ -228,7 +228,7 @@ export class InboxProcessorService implements OnApplicationShutdown {
const ldHost = this.utilityService.extractDbHost(authUser.user.uri);
if (!this.utilityService.isFederationAllowedHost(ldHost)) {
throw new Bull.UnrecoverableError(`Blocked request: ${ldHost}`);
throw new Bull.UnrecoverableError(`skip: request host is blocked: ${ldHost}`);
}
} else {
throw new Bull.UnrecoverableError(`skip: http-signature verification failed and no LD-Signature. keyId=${signature.keyId}`);

View file

@ -133,7 +133,7 @@ export class ScheduleNotePostProcessorService {
reason: renderInlineError(err),
});
await this.noteScheduleRepository.remove(data);
this.logger.error(`Scheduled note failed:`, err);
this.logger.error(`Scheduled note failed: ${renderInlineError(err)}`);
throw err;
});
await this.noteScheduleRepository.remove(data);

View file

@ -71,14 +71,9 @@ export class SystemWebhookDeliverProcessorService {
latestStatus: res instanceof StatusError ? res.statusCode : 1,
});
if (res instanceof StatusError) {
if (res instanceof StatusError && !res.isRetryable) {
// 4xx
if (!res.isRetryable) {
throw new Bull.UnrecoverableError(`${res.statusCode} ${res.statusMessage}`);
}
// 5xx etc.
throw new Error(`${res.statusCode} ${res.statusMessage}`);
throw new Bull.UnrecoverableError(`${res.statusCode} ${res.statusMessage}`);
} else {
// DNS error, socket error, timeout ...
throw res;

View file

@ -69,14 +69,9 @@ export class UserWebhookDeliverProcessorService {
latestStatus: res instanceof StatusError ? res.statusCode : 1,
});
if (res instanceof StatusError) {
if (res instanceof StatusError && !res.isRetryable) {
// 4xx
if (!res.isRetryable) {
throw new Bull.UnrecoverableError(`${res.statusCode} ${res.statusMessage}`);
}
// 5xx etc.
throw new Error(`${res.statusCode} ${res.statusMessage}`);
throw new Bull.UnrecoverableError(`${res.statusCode} ${res.statusMessage}`);
} else {
// DNS error, socket error, timeout ...
throw res;