insales / insales-uploader

Менеджер ассетов для платформы InSales.
https://insales.github.io/insales-uploader/
MIT License
12 stars 5 forks source link

Ошибка Error edit: <Filename> #7

Closed MrLogaz closed 6 years ago

MrLogaz commented 6 years ago

При запуске загрузки с помощью IU.upload() из gulp Скрипт выполняется, идет загрузка, но потом до ходит до файла и вылетает с ошибкой.

[16:28:06] theme:upload:start
[16:28:08] Внимание! Большое кол-во операций, увеличен тайм-аут между запросами!

[16:32:39] Error edit: C:/git/gd-config/brn/media/webpro.js

[16:32:39] Проверьте id темы 1026550, url tomsk.gigant-dveri.ru, а так же token/password
(node:11760) UnhandledPromiseRejectionWarning: #<Object>
(node:11760) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error origi               nated either by throwing inside of an async function without a catch block, or by rejecting                a promise which was not handled with .catch(). (rejection id: 1)
(node:11760) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In t               he future, promise rejections that are not handled will terminate the Node.js process with a                non-zero exit code.

Попробовал выполнить uploader upload оно сработало хорошо, тема полностью залилась без ошибок. Пробую повторить gulp задачу и снова вылетает, но уже на другом файле.

[17:03:13] theme:upload:start
[17:03:22] Внимание! Большое кол-во операций, увеличен тайм-аут между запросами!

[17:08:09] Error edit: C:/git/gd-config/brn/media/kd.png

[17:08:10] Проверьте id темы 1026550, url tomsk.gigant-dveri.ru, а так же token/password
(node:820) UnhandledPromiseRejectionWarning: #<Object>
(node:820) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:820) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Если снова повторить эту же галп задачу, то загрузка снова споткнется именно на это этом файле, если запустить спустя какое время то может уже на другом файле споткнуться.

Как быть с этой проблемой? Версия "insales-uploader": "1.8.30",

MrLogaz commented 6 years ago

Заметил еще один забавный факт, время выполнения скрипта доя его вылета примерно одинаковое.

[16:28:08] Внимание! Большое кол-во операций, увеличен тайм-аут между запросами! [16:32:39] Error edit: C:/git/gd-config/brn/media/webpro.js Разница 04:31

[16:48:26] Внимание! Большое кол-во операций, увеличен тайм-аут между запросами! [16:53:12] Error edit: C:/git/gd-config/brn/media/kd.png Разница 04:46

[17:03:22] Внимание! Большое кол-во операций, увеличен тайм-аут между запросами! [17:08:09] Error edit: C:/git/gd-config/brn/media/kd.png Розница 04:47

[17:33:27] Внимание! Большое кол-во операций, увеличен тайм-аут между запросами! [17:38:13] Error edit: C:/git/gd-config/brn/media/footer-heading.svg Разница 04:46

[17:59:25] Внимание! Большое кол-во операций, увеличен тайм-аут между запросами! [18:04:02] Error edit: C:/git/gd-config/brn/media/line-2.png Разница 04:37

Разница во времени практически одинаковая, складывается ощущение что сервер insales обрывает соединение по некому таймауту.

VladimirIvanin commented 6 years ago

У API существует лимит обращений - 500 в минуту. В вашем случае как раз он проявился, я увеличу тайм аут между операциями ещё и выведу нормальную ошибку в случае превышения лимита.

Если в теме много файлов, советую загружать тему с помощью загрузки из файла в бек-офисе. image

VladimirIvanin commented 6 years ago

В 1.8.31 вывел ошибку про ограничение лимита.

MrLogaz commented 6 years ago

@VladimirIvanin

if (taskListLength > 200 && taskListLength < 300) {
  _this.options.delay = 300;
} else if (taskListLength >= 300 && taskListLength < 400) {
  _this.options.delay = 500;
} else if (taskListLength >= 400 && taskListLength < 600) {
  _this.options.delay = 1300;
} else if (taskListLength >= 600) {
  _this.options.delay = 2000;
} else {
  _this.options.delay = 100;
}

Даже при условии что каждый таск будет выполняться мгновенно, лимит в 500 обращений в минуту должен сработать при таймауте обращений между задачами меньше 120 мс. 60000/500=120

Это ограничение не должно было срабатывать даже при старых таймаутах

if (taskListLength > 200) {
  this.options.delay = 300;
}

Особенно при прошлых таймаутах в 500 и 1000.

Тем не менее после этих изменений загрузка прошла успешно, хоть и крайне долго за 18 минут.

VladimirIvanin commented 6 years ago

Я воспроизводил вашу ошибку с точно такими же результатами и в ответе сервера была статистика обращений в минуту, ошибку выдавало когда обращений к API больше 500. Повторюсь, темы с большим кол-вом файлов никак не получится заливать быстро по API. Притом что оказывается ограничение в 500 запросов не на 1 минуту, а на 5. Код нужно править снова

Подробнее про проблему Частота запросов к API На приложение накладываются ограничение в 500 запросов к API одного магазина за 5 минут. Время расчитывается с момента первого запроса в серии. Количество выполненых запросов в текущем промежутке времени передается в HTTP заголовке API-Usage-Limit (пример: API-Usage-Limit: 1/500).

При превышении лимита доступ к API становится недоступным до окончания текущих 5 минут. В таком случае код ответа сервера - 503 и при этом в HTTP заголовке Retry-After передается время до начала предоставления доступа в секундах.

https://wiki.insales.ru/wiki/%D0%9A%D0%B0%D0%BA_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F_%D1%81_InSales

Что мешает загружать архив руками? Замечу, что с радостью сделал бы и автоматическое создание новых тем и быструю загрузку если бы API позволяло.

VladimirIvanin commented 6 years ago

В лучшем случае в будущем появится возможность заливать архив темы через API Чтоб сокращать время и не делать вот такие таймауты