Skip to content

[GRDM-62502] 20250906からのアップグレード失敗とWEKO登録時の500エラーを修正 - #779

Draft
yacchin1205 wants to merge 3 commits into
RCOSDP:developfrom
yacchin1205:fix/migration-historical-models
Draft

[GRDM-62502] 20250906からのアップグレード失敗とWEKO登録時の500エラーを修正#779
yacchin1205 wants to merge 3 commits into
RCOSDP:developfrom
yacchin1205:fix/migration-historical-models

Conversation

@yacchin1205

@yacchin1205 yacchin1205 commented Aug 20, 2026

Copy link
Copy Markdown

Purpose

2件の不具合を修正します。

1. 20250906 のデータベースからのアップグレードで migration が失敗する

osf.0267_split_name_fields の適用中に django.db.utils.ProgrammingError: column osf_osfuser.ial does not exist で失敗し、アップグレードが完了しません。#777ialプロパティ追加前に267, 270のmigrationを適用していれば、本問題は発生しません。

0267 は data migration の中で現行モデルの FileMetadata.save() を呼んでおり、その save() が検索インデックスの更新を誘発して FileMetadata.creator(現行の OSFUser モデル)を参照します。migration の途中では osf_osfuser は 0267 時点のスキーマのままなので、それ以降に追加された列(今回は #777ial)を参照した時点で落ちます。

このため 0267 より後に osf_osfuser へ列を追加するたびに、過去バージョンからのアップグレードが遡って壊れます。FileMetadata のレコードが存在する環境でのみ発生し、レコードが無い新規構築では発生しません。同じ実装を使う osf.0270_remove_metadata_access_rights も同様です。

2. WEKO へのメタデータ登録が「エラーが発生しました: INTERNAL SERVER ERROR」で終わることがある

登録操作の後、進捗を取得する weko_get_publishing_file が 500 を返し、画面にエラーダイアログが表示されて登録完了の表示に進みません。サーバ側は KeyError: 'progress' で失敗しています。

進捗取得は AsyncResult.info を複数回参照していますが、info は参照のたびに celery のバックエンドへ問い合わせるため、タスクが進行中の間は参照ごとに内容が変わります(celery は完了状態になるまで結果をキャッシュしません)。'progress' in aresult.info で判定した後、aresult.info['progress'] を取り出す前にタスクが完了へ遷移すると、info の中身が進捗({'progress': ...})から結果({'result': ...})に変わり、キーが存在しなくなります。

画面は進捗を毎秒ポーリングしており、登録が成功する瞬間にこの遷移を引くと失敗します。同じ実装が _get_publishing_project_metadata_progress、および Metadata アドオンの get_task_result / metadata_get_importing_dataset にもあります。

Changes

  • osf/migrations/0267_split_name_fields.py, osf/migrations/0270_remove_metadata_access_rights.py
    • RunPython に渡される appsFileMetadataMigrator へ引き渡す
  • addons/metadata/utils.py
    • FileMetadataMigrator が historical model(apps.get_model)で対象を取得・保存するように変更。現行モデルの save() を経由しないため、検索インデックスの更新も走らない
  • addons/weko/views.py
    • 重複していたタスク状態の解釈を _resolve_deposit_task に集約し、stateinfo を1度だけ取得した値で判定する
  • addons/metadata/dataset.py, addons/metadata/packages.py
    • 同じく AsyncResult の複数回参照を解消(get_task_resultinfo を最大9回参照していた)
  • addons/weko/tests/test_view.py
    • _resolve_deposit_task のテストを追加。進行中・完了・失敗に加え、判定と取り出しの間で完了へ遷移する場合を含む

QA Notes

  • データマイグレーションの実装を変更していますが、変換結果は従来と同一です。適用済みの環境では再実行されないため影響はありません
  • 権限判定のコードには触れていません
  • 20250906 のデータベースからのアップグレードを含む E2E で、全シナリオが成功することを確認しています。修正前は migration が失敗して起動できず、WEKO のメタデータ送信シナリオは 2 回連続で同じ 500 により失敗していました
  • 影響範囲は file metadata の data migration と、WEKO / Metadata アドオンの進捗取得 API です

Documentation

None

Side Effects

  • 0267 / 0270 の適用時に検索インデックスの更新が行われなくなります。インデックスの再作成が必要な場合は migration とは別に実施してください
  • 進捗取得の応答では stateinfo がごくわずかに異なる時点の値になる場合がありますが、いずれも表示のみに使用されます

Ticket

GRDM-62502

@yacchin1205 yacchin1205 changed the title 20250906からのアップグレード失敗とWEKO登録時の500エラーを修正 [GRDM-62502] 20250906からのアップグレード失敗とWEKO登録時の500エラーを修正 Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant