UI не обновляется после нескольких правок поста

Я многократно замечал это, но проблема проявляется непоследовательно.

Когда я создаю ответ, публикую его, затем сразу же возвращаюсь, редактирую и нажимаю «Сохранить», а потом повторяю то же самое, иногда интерфейс не отображает последние правки. Правки сохраняются на сервере, потому что при обновлении страницы они появляются, но проблема в том, что они не всегда отображаются до перезагрузки страницы. Это происходит как с новыми ответами, так и при многократном редактировании в течение 2–3 минут до того, как пост зарегистрирует тег изменённой версии.

Я наблюдаю это после обновления до версии 3.1.0 (сейчас используется 3.1.2, 1 ГБ ОЗУ и 1 процесс Unicorn) при использовании браузера Chrome (Windows 10) и Safari на iPhone (iOS 17.0.3). Это происходит довольно часто, поэтому я и сообщаю об этом.

Раньше такого не было. С момента появления проблемы произошло только два изменения:

  1. Обновление Discourse до версии 3.x
  2. Уменьшение количества процессов Unicorn с 2 до 1
2 лайка

Один из простых способов воспроизвести эту проблему: если сотрудник/руководитель уровня TL4 редактирует и заголовок, и содержание темы, отображается только одно из двух изменений (обычно редактирование поста), тогда как другое изменение отмечается, но не видно.

2 лайка

Спасибо за отчет… :slight_smile:
Не могли бы вы, случайно, записать короткое видео, демонстрирующее это поведение?

Если вы посмотрите в инструменты разработчика Chrome, видите ли вы там множество ошибок, запросы, которые не возвращают статус 200?

В консоли инструментов разработчика Chrome я вижу следующее, похоже, это 429 (я не знаю, для чего 404):

content-script.js:1 cornhusk, shared-service, error: TypeError: Failed to construct 'URL': Invalid URLInvalid url: 
extractOriginPath @ content-script.js:1
Show 1 more frame
Show less
content-script.js:1 cornhusk, shared-service, error: TypeError: Failed to construct 'URL': Invalid URLInvalid url: 
extractOriginPath @ content-script.js:1
Show 1 more frame
Show less
video.google.com/get_player?docid=1wQ5F_aEDhPpC8sW7ZTrAhbNVrSOAXsXr&ps=docs&partnerid=30&cc_load_policy=1:1 
        
        
       Failed to load resource: the server responded with a status of 404 ()
content-script.js:1 cornhusk, shared-service, error: TypeError: Failed to construct 'URL': Invalid URLInvalid url: 
extractOriginPath @ content-script.js:1
Show 1 more frame
Show less
content-script.js:1 cornhusk, shared-service, error: TypeError: Failed to construct 'URL': Invalid URLInvalid url: 
extractOriginPath @ content-script.js:1
Show 1 more frame
Show less
content-script.js:1 cornhusk, shared-service, error: TypeError: Failed to construct 'URL': Invalid URLInvalid url: 
extractOriginPath @ content-script.js:1
fingerprintPage @ content-script.js:1
observeCheckoutMutations @ content-script.js:1
Show 3 more frames
Show less
content-script.js:1 cornhusk, shared-service, error: TypeError: Failed to construct 'URL': Invalid URLInvalid url: 
extractOriginPath @ content-script.js:1
fingerprintPage @ content-script.js:1
observeCheckoutMutations @ content-script.js:1
Show 3 more frames
Show less
jquery.js:9930 
        
        
       POST https://xxxx.com/message-bus/2089d5dd986440908b29e8064c58d208/poll 429 (Too Many Requests)
send @ jquery.js:9930
ajax @ jquery.js:9511
s @ message-bus.js:22
n.baseUrl.n.ajax @ message-bus.js:88
k @ chunk.660.3ca404a8b6b50dfefca7.js:2
n @ chunk.660.3ca404a8b6b50dfefca7.js:2
(anonymous) @ chunk.660.3ca404a8b6b50dfefca7.js:2
setTimeout (async)
complete @ chunk.660.3ca404a8b6b50dfefca7.js:2
e.complete @ message-bus.js:17
l @ jquery.js:3213
fireWith @ jquery.js:3343
E @ jquery.js:9632
abort @ jquery.js:9332
unsubscribe @ chunk.660.3ca404a8b6b50dfefca7.js:2
unsubscribe @ presence.js:179
_unsubscribe @ presence.js:397
unsubscribe @ presence.js:101
_setupChannel @ composer-presence-display.js:81
_setupChannels @ composer-presence-display.js:93
b @ index.js:207
l @ index.js:423
p.invoke @ queue.ts:201
p.flush @ queue.ts:98
h.flush @ deferred-action-queues.ts:75
$._end @ index.ts:616
_boundAutorunEnd @ index.ts:257
Promise.then (async)
n @ platform.ts:28
flush @ index.js:41
$._scheduleAutorun @ index.ts:803
$._end @ index.ts:623
_boundAutorunEnd @ index.ts:257
Promise.then (async)
n @ platform.ts:28
flush @ index.js:41
$._scheduleAutorun @ index.ts:803
$._end @ index.ts:623
_boundAutorunEnd @ index.ts:257
Promise.then (async)
n @ platform.ts:28
flush @ index.js:41
$._scheduleAutorun @ index.ts:803
$._end @ index.ts:623
_boundAutorunEnd @ index.ts:257
Promise.then (async)
n @ platform.ts:28
flush @ index.js:41
$._scheduleAutorun @ index.ts:803
$._end @ index.ts:623
_boundAutorunEnd @ index.ts:257
Promise.then (async)
n @ platform.ts:28
flush @ index.js:41
$._scheduleAutorun @ index.ts:803
$._ensureInstance @ index.ts:791
$.ensureInstance @ index.ts:579
scheduleRevalidate @ index.js:5390
dirtyTag @ validator.js:411
R @ validator.js:486
F @ index.js:497
z @ index.js:533
De @ index.js:1409
Te @ index.js:1385
set @ observable.js:175
save @ composer.js:707
saveAction @ composer.js:554
_triggerAction @ d-button.js:178
click @ d-button.js:144
jquery.js:9930 
        
        
       POST https://xxxx.com/message-bus/2089d5dd986440908b29e8064c58d208/poll?dlp=t 429 (Too Many Requests)
send @ jquery.js:9930
ajax @ jquery.js:9511
s @ message-bus.js:22
n.baseUrl.n.ajax @ message-bus.js:88
k @ chunk.660.3ca404a8b6b50dfefca7.js:2
n @ chunk.660.3ca404a8b6b50dfefca7.js:2
(anonymous) @ chunk.660.3ca404a8b6b50dfefca7.js:2
setTimeout (async)
complete @ chunk.660.3ca404a8b6b50dfefca7.js:2
e.complete @ message-bus.js:17
l @ jquery.js:3213
fireWith @ jquery.js:3343
E @ jquery.js:9632
(anonymous) @ jquery.js:9878
load (async)
send @ jquery.js:9897
ajax @ jquery.js:9511
s @ message-bus.js:22
n.baseUrl.n.ajax @ message-bus.js:88
k @ chunk.660.3ca404a8b6b50dfefca7.js:2
n @ chunk.660.3ca404a8b6b50dfefca7.js:2
document.addEventListener.e.onVisibilityChange @ chunk.660.3ca404a8b6b50dfefca7.js:2
callback @ message-bus.js:49
d @ user-presence.js:90
p @ user-presence.js:103
m @ user-presence.js:110
22:1 Error handling response: TypeError: Cannot read properties of undefined (reading 'isCheckout')
    at chrome-extension://clmkdohmabikagpnhjmgacbclihgmdje/content-script.js:1:5043
22:1 Unchecked runtime.lastError: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received

Это означает, что вы действуете слишком быстро, и вам нужно замедлиться. Это механизм защиты, предотвращающий наводнение вашего форума скриптами. Многие веб-приложения предупреждают вас, когда вы действуете слишком быстро, и затем отклоняют вашу операцию.

4 лайка

Я понял это из кода 429. Если вы посмотрите на приведённый выше пример видео, кажется ли он быстрым? Форум должен уметь различать быстрое создание постов с одного аккаунта/IP и редактирование пользователем своего поста примерно через 5 секунд.

Кроме того: я не вижу никаких проблем при редактировании этого поста каждые 5 секунд или около того. Это уже моя 5-я правка в течение минуты.

6-я правка: значит, что-то изменилось после обновления до версии 3.1.x, потому что раньше всё работало нормально. Или порог для 429 зависит от количества единорогов?

Имеет ли ошибка 429 какое-либо отношение к количеству настроенных единорогов (1 или больше)? Я не вижу этой проблемы на этом сайте, но она стабильно возникает на моём.

Так что же, это не влияет на этот сайт? Я могу вносить правки в свой пост здесь каждые несколько секунд без каких-либо проблем (я пробовал редактировать до 8 раз подряд за несколько секунд), но на моём сайте это, похоже, является проблемой (даже при всего двух правках).

1 лайк