561 Ошика: Field is too large (32K) or View's column & selection formulas are too large

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
Доброго времени!

С недавнего времени стали "биться" документы.
Пользователи работают в вебе, RTF сохраняется как MIME.

Схема: html-форма -> http_post_request -> xPage_restService -> java_class -> agent.runWithDocumentContext - LS_agent_save_note.

По непонятным причинам некоторые документы "умирают". При попытке получить к ним доступ (открыть в Notes из представления), получаю ошибку 561: Field is too large (32K) or View's column & selection formulas are too large.

scanEZ прочитать документы не может.
Notes C API (NSFNoteOpenByUNID, NSFNoteOpen, NSFNoteOpenExt) прочитать документы не может.
NotesPeek прочитать документы не может.

consistency check убивает документы.

LS getDocumentByUNID ноду получает, но совершенно пустую. LS removePermanently ноду удаляет корректно.

Log.nsf "чистый".
Access log, Agent log, Referer log "чистые".
Domino\data\domino\workspace\logs\ "чистый".

Db size > 16Gb.

ODS 52.

Domino 9.0.1FP4 64bit.

Вопросы:
1) Где еще можно посмотреть информацию о моменте "поломки"?
2) С чего вдруг документы "умирают"?
3) Как можно вытащить информацию из "убитых" документов (интересует содержимое RTF)?
4) Как можно восстановить документы?

Спасибо.
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
467
а ФП по-новее? и из реплики на локал тоже не тащится?
По непонятным причинам некоторые документы "умирают". При попытке получить к ним доступ (открыть в Notes из представления), получаю ошибку 561: Field is too large (32K) or View's column & selection formulas are too large.
может поле "получилось" не РТ (т.е. создавался док, создавали поле, но не было computeWithForm)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
467
3) Как можно вытащить информацию из "убитых" документов (интересует содержимое RTF)?
если РТ получилось не РТ - скорее-всего никак, если программно док недоступен - там и саммари снять не получится :(
scanEZ прочитать документы не может.
Notes C API (NSFNoteOpenByUNID, NSFNoteOpen, NSFNoteOpenExt) прочитать документы не может.
NotesPeek прочитать документы не может.
это все через СиАПИ и потому одинаковый результат, не знаю есть ли бинарный анализатор для nsf
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
Схема: html-форма -> http_post_request -> xPage_restService -> java_class -> agent.runWithDocumentContext - LS_agent_save_note.
Кучерявая схема.
Можно в LS_agent_save_note проверять на валидность RT поля (размер, тип, итп).
Судя по всему - где то теряется контекст документа - как создается document stub ?.
Кста - а где он образуется? (xPage_restService \ java_class ?)
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
Схема мне самому не нравится, но пришлось вызывать агентов, т.к. они уже были и переписывать всю логику не было и времени и желания.

Образуется в java class
Java:
Database db = ExtLibUtil.getCurrentDatabase();
Agent agent = db.getAgent("(AGENT_NAME)");
agent.runWithDocumentContext(db.getDocumentByUNID(unid));
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
agent.runWithDocumentContext(db.getDocumentByUNID(unid));
имхо - я бы явно инициализировал NotesDocument перед вызовом agent.runWithDocumentContext.
Судя по всему - документ уже есть сохраненый в БД. и передавать контекст в принципе смысла то и нет...
Для тестов - вполне можно простой runOnServer(NoteID)
Другое дело - что БД документа для LS агента не известно - но тут опять таки доля тестов можно наверное захардкодить...
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
имхо - я бы явно инициализировал NotesDocument перед вызовом agent.runWithDocumentContext.
Судя по всему - документ уже есть сохраненый в БД. и передавать контекст в принципе смысла то и нет...
Для тестов - вполне можно простой runOnServer(NoteID)
Другое дело - что БД документа для LS агента не известно - но тут опять таки доля тестов можно наверное захардкодить...
Или как вариант - если это возможно , по цепочке html-форма -> http_post_request -> xPage_restService -> java_class -> agent.runWithDocumentContex не сохранять его, а сохранять в LS агенте.
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
документ сохраняется и в java классе, перед вызовом LS агента. И в LS агенте документ тоже сохраняется.
 

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
документ сохраняется и в java классе, перед вызовом LS агента. И в LS агенте документ тоже сохраняется.
ну вот тут может быть косяк. надо попробовать runOnServer(NoteID) и даже по runWithDocumentContext но поднять в LS агенте док из БД и его уже сохранить.
 

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
Совсем простой вопрос. А проверка на вебе на размер содержимого есть? В RTF поле поэму случаем не пишут?
//Length of a string literal 16,267 characters (32,000 bytes).
cl = $('#Content').val().length;
if ( cl > 16267) { ... };

или кучей сразу проверять
$(form).serialize().length;
 
Последнее редактирование:

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
Совсем простой вопрос. А проверка на вебе на размер содержимого есть? В RTF поле поэму случаем не пишут?
//Length of a string literal 16,267 characters (32,000 bytes).
cl = $('#Content').val().length;
if ( cl > 16267) { ... };

или кучей сразу проверять
$(form).serialize().length;
Тексты могут объемные - много отладочной информации, может быть в виде xml тегов.
Пробовал вкладывать ооочень большой текст (полтора млн байт) - все хорошо. Про ограничение в 16,267 для стринга не совсем понял.
RTF - он и есть RTF, "почти" безграничен.
 
Последнее редактирование:

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
RTF - он и есть RTF, "почти" безграничен.
Не совсем. Лимиты Domino —
Но вот какие наперстки с ним в агенте крутятся - вопрос. Даже если гиг в поле, то как это прочесть и зачем? Такие объемы надо в файлы и приаттачивать. И не будет проблем, имхо.
Я себе так и сделал, ограничив из под WEB RTF литералом. Иначе наезжает на HTTP Web Server: Lotus Notes Exception - Memory allocation request exceeded 65,000 bytes
Все что свыше геренерится в файл.
 
Последнее редактирование:

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
43
Имхо - речь про гиг - в плане что заявленного лимита достаточно для практического применения. И вряд ли гиг будет в MIME )
Другое дело - как создается in memory документ с сформированным МИМЕ полем.
В классик веб этим занимается сама форма , на которую идет сабмит. В отладчике видно, что летит обычный POST с x-www-form-urlencoded . Вся остальная кухня уже в зависимости от типа поля на форме. МИМЕ так МИМЕ, если станет вдруг RTF - то станет RTF. и именно так оно прилетит агенту в виде Document.Context Можно и без формы - но тогда формат поля и наполнение формируется самостоятельно из Request_Content_хх.
Под xPage - мне не понятно, кто и на каком этапе занимается сериализацией из фронта в объект документа. и на основе чего.
все же думаю что в той цепочке и в рамках фактически одной транзакции появляются 2 инстанса одного объекта - одна в xpage, другая в LS агенте... И что то там идет не так)))
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
Все что свыше геренерится в файл.
На сколько я понял, проблема как раз не в объеме, а в некоем стечении обстоятельств.

все же думаю что в той цепочке и в рамках фактически одной транзакции появляются 2 инстанса одного объекта - одна в xpage, другая в LS агенте... И что то там идет не так)))
тоже склоняюсь к такому выводу. но вот отладочной информации не хватает.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
467
Под xPage - мне не понятно, кто и на каком этапе занимается сериализацией из фронта в объект документа. и на основе чего.
можно из стрима, руками, на nsftools дергал
можно рестсервис (небольшой) сделать и использовать как сервлет, выкладывал код
по топику: как выше упоминал - в опред. условиях нет терминальной стадии создания поля опред. типа (возможно в доке тупо нет поля типа РТ)
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!