問題
四半期ごとのリリースに更新する際に、ログにエラーが表示され、いくつかのモジュールが正しく起動しません。
IndexUpdaterUtil-BundleTrackerOpener][IndexUpdaterUtil] com.liferay.document.library.serviceのデータベースインデックスの更新をスキップした。
データベース上でこのクエリを実行すると、state_列に'2'が返されます。これは、コンポーネントの更新中に問題が発生したことを意味します:ReleaseConstants.STATE_VERIFY_FAILURE。
select * from Release_ where servletContextName like('com.liferay.document.library.service')
環境
- 四半期ごとのリリース
解像度
更新中にこの値が表示される原因としては、DLFileにリンクされているDLFileVersionが見つからないことが考えられます。
2024-06-05 09:16:19.658 ERROR [main][VerifyProcessTrackerOSGiCommands:323] com.liferay.document.library.kernel.exception.NoSuchFileVersionException: No DLFileVersion exists with the key {fileEntryId=409124855, version=1.0}
com.liferay.portal.verify.VerifyException: com.liferay.document.library.kernel.exception.NoSuchFileVersionException: No DLFileVersion exists with the key {fileEntryId=409124855, version=1.0}
データベース上でこのクエリを実行すると、DLFileVersionが欠落しているものすべてが返される:
SELECT fileEntryId
FROM dlfileentry where fileEntryId not in (select fileEntryId from dlfileversion);
このモジュールを再び動作させるための回避策は、このGroovyスクリプトですべての不整合データを削除することである:
package com.liferay.support;
import com.liferay.document.library.kernel.service.DLFileEntryLocalServiceUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
public class CheckDLFileEntryVersions {
boolean _fix = false;
Log _log = LogFactoryUtil.getLog("LIFERAY_SUPPORT");
public CheckDLFileEntryVersions(boolean doUpdate) {
this._fix= doUpdate;
}
public void deleteDLFileEntries () {
List<Long> deleteFileEntryIds = new ArrayList<Long>();
deleteFileEntryIds.add(32879L); ///INCLUDE ALL fileEntryId returned by the previous query
long retValue = 0;
if (_fix) {
for (long fileEntryId : deleteFileEntryIds) {
try {
DLFileEntryLocalServiceUtil.deleteFileEntry(DLFileEntryLocalServiceUtil.getFileEntry(fileEntryId));
_log.error("DELETED fileEntry with fileEntryId " + fileEntryId);
retValue++;
} catch (Exception e) {
_log.error("!!!! ERROR", e)
}
}
}
_log.error("#### Deleted"+retValue);
}
}
// set to true for fixing errors
boolean FIX_ERRORS = true;
Thread.start({
(new CheckDLFileEntryVersions(FIX_ERRORS)).deleteDLFileEntries();
})
元のデータベースでこれらのタスクを実行すると、問題は解決する。 実行されるステップの例を以下に説明する:
- Liferay 7.4.13-u60から2024.q1.11へのアップグレードを計画しています。
- 矛盾した DLFileVersion エントリを取得するクエリを実行します。
- u60でGroovyスクリプトを実行し、不整合を一掃する。
- サニタイズされたデータベースをコピーする。
- 2024.q1.11へのアップグレードを実行する。
- 前述のようなエラーは表示されず、モジュールは正しく起動し、release_ tableのstate_カラムは "0"-ReleaseConstants.STATE_GOODとなります。