Обновился с Remnawave 2.8.1 до 3.4.1. После обновления у части пользователей при первом импорте подписки появляется сообщение о превышении лимита устройств. При этом устройств у пользователя нет, лимит установлен на 5 (общий).
Если сразу обновить подписку в приложении, ошибка исчезает. В панели после этого отображается одно устройство. На 2.8.1 такого поведения не было.
Логи в момент ошибки
Похоже, при одновременных запросах панель повторно пытается создать уже добавленный HWID и воспринимает конфликт как превышение лимита.
В 2.8.1 здесь использовался upsert:
public async createWithAdvisoryLock(
entity: HwidUserDeviceEntity,
deviceLimit: number,
): Promise<{ created: boolean; hwidUserDevice: HwidUserDeviceEntity | null }> {
let created = false;
let hwidUserDevice: HwidUserDeviceEntity | null = null;
await this.prisma.withTransaction(async () => {
await this.prisma.tx.$executeRaw`
SELECT pg_advisory_xact_lock(${HWID_LOCK_PREFIX + entity.userId})
`;
const count = await this.prisma.tx.hwidUserDevices.count({
where: { userId: entity.userId },
});
if (count >= deviceLimit) {
return;
}
Файл был обрезан. показать оригинал
В 3.4.1 используется create:
public async createWithAdvisoryLock(
entity: HwidUserDeviceEntity,
deviceLimit: number,
): Promise<{
hwidDevice: HwidUserDeviceEntity | null;
}> {
await this.prisma.tx.$executeRaw`
SELECT pg_advisory_xact_lock(${HWID_LOCK_PREFIX + entity.userId})
`;
const hwids = await this.qb.kysely
.selectFrom('hwidUserDevices')
.select('hwid')
.where('userId', '=', entity.userId)
.limit(deviceLimit)
.execute();
if (hwids.length >= deviceLimit) {
return { hwidDevice: null };
}
Файл был обрезан. показать оригинал
Ошибка воспроизводится в приложение incy для iOS
Спасибо за подробное описание и логи.
зафиксировано 03:11PM - 30 Aug 26 UTC
Фикс будет доступен в следующем релизе.