Зависание приложения на MS SQL при загрузке файла, с включенным параметром webdav.autoGenerateUniqueResourceUri

Добрый день!

При обновлении аддона WebDav на версию 2.6.1 обнаружили ошибку. Сначала при отключенном свойстве приложения webdav.autoGenerateUniqueResourceUri ловили ошибку уникальности ключа. Почитали документацию, решили проблему установив значение этого свойства в true, а затем обнаружили, что приложение на MS SQL стало виснуть.

Воспроизводится в демо-приложении:

  1. Меняем версию Cuba на 7.2.20.
  2. Меняем версию аддона WebDav на 2.6.1.
  3. Устанавливаем базу данных MSSQL12+.
  4. Генерируем скрипты базы данных.
  5. Запускаем приложение.
  6. Изменяем свойство приложения webdav.autoGenerateUniqueResourceUri в true.
  7. Открываем экран создания почти любой (см. ниже) сущности.
  8. Нажимаем кнопку Upload и указываем прикрепляемый файл.

ОР

  • окно выбора файла закрылось, появилась ссылка на прикрепленный файл.

ФР

  • окно выбора файла закрылось, приложение зависло.
состояние UI при зависании:

image

сущности, на которых происходит зависание:

V - нет зависания.
X - есть зависание.

image

свойства приложения, при зависании приложения:

image

P.S.
При установке параметра webdav.enable в true - идентичное поведение.
При использовании Postgres все сущности создаются без проблем.

Обстановка:
  • CUBA Platform version: 7.2.20
  • CUBA Studio plugin version: 15.10-223
  • IntelliJ version: IntelliJ IDEA 2022.3.1 (Community Edition)
  • WebDav 2.6.1
  • Mssql-jdbc:7.2.2.jre8

Добавлю еще, что в логах тишина.
В логе eclipse тоже ни ошибок, ни предупреждений.

@krivopustov Есть какие-то варианты исправления или обхода проблемы?
Как на зло, редкий клиент на MS SQL использует еще и WebDav… По факту на 2.6.1 у него работа Очень затруднена.
Пока поставили ему *webdav.autoGenerateUniqueResourceUri=false`,но и в таком варианте у них пользователи наступают на проблему ошибки уникальности имени файла и вынуждены ручками из переименовывать…
А при прикреплении документов, созданных по шаблону одноименность - это не редкость :frowning:

Коллеги, добрый день!

Занимаемся проблемой, как только появится решение, сразу дадим знать.

С уважением,
Дмитрий

1 симпатия

Коллеги, добрый вечер!

Спасибо, что сообщили о проблеме! Причину обнаружили и завели тикет. Проблема в блокировке из-за чтения данных в параллельной транзакции из той же таблицы, куда происходит коммит.

Как воркэраунд можно в проекте переопределить бин webdav_WebdavDocumentsManagementService, чтобы загрузка происходила в той же самой транзакции:

public class FixedWebdavDocumentsManagementServiceBean extends WebdavDocumentsManagementServiceBean {

    public FixedWebdavDocumentsManagementServiceBean(Metadata metadata, DataManager dataManager, ViewRepository viewRep, TimeSource timeSource, WebdavMiddlewareTools wpersist, WebdavTools wtools, WebdavPreconditions wprecond, WebdavSecurityTools wsec, WebdavNaturalVersionIdGenerator versionIdGenerator, WebdavConfig webdavConfig, Persistence persistence, WebdavResourceUriTools uriTools) {
        super(metadata, dataManager, viewRep, timeSource, wpersist, wtools, wprecond, wsec, versionIdGenerator, webdavConfig, persistence, uriTools);
    }

    @Nullable
    @Override
    public WebdavDocument retrieveDocumentByWebdavDocumentUri(URI documentPath, View view) {
        documentPath = uriTools.removeTrailingSlashFromURI(documentPath);

        LoadContext<WebdavDocument> loadContext = LoadContext.create(WebdavDocument.class)
                .setJoinTransaction(true)//fixes the problem
                .setView(view)
                .setQuery(LoadContext.createQuery(RETRIEVE_WEBDAV_DOCUMENT_BY_PATH)
                        .setParameter("fullPath", documentPath));
        return dataManager.secure().load(loadContext);
    }
}

Что проверено на примере demo-app:
webdav-demo-fixed_lock.zip (227.9 КБ)

С уважением,
Дмитрий

1 симпатия