Skip to content

Migration workflow

Johnny Mariéthoz edited this page Sep 23, 2025 · 67 revisions

Migration workflow steps

Restore test

Index:

uv run invenio rero es snapshot repository create backup /invenio/storage/prod/es-backup

uv run invenio rero es snapshot list backup
uv run invenio rero es snapshot restore backup XXXXXX
rm -rf /invenio/storage/dev/files/*
cp -rv /invenio/storage/prod/files/* /invenio/storage/dev/files/
# rsync -avr --delete /data/sonar/prod/files/ /data/sonar/dev/files/  --exclude=lost+found/
chown -R debian9:debian9 /data/sonar/dev/files/*

DB kerosen

export kerosen

ssh root@kerosen
su - postgres
pg_dumpall > /database/dump/sonar_prod_20250923.sql
exit

#### import sonar dev
su - postgres
psql -U sonar -f /invenio/storage/backup/dump/sonar_prod_20250923.sql
exit
exit

Correct problems

poetry run /invenio/storage/scripts/correct_sonar.py utils correct-wrong-pids -t doc -v -c

# v1.11.0 --> v1.12.0

DB migration 9 -> 17 ???

Alembic

uv run invenio alembic stamp 428b919be0ea
uv run invenio alembic upgrade
# TODO: uv run invenio rero es index update-mapping

Update mapping

from invenio_search import current_search_client
current_search_client.indices.create('records-record-v1.0.0')
uv run invenio rero es index update-mapping

Documents

Remove _oai in documents.

# estimation for 300'000 records: 5h
from invenio_db import db
from invenio_pidstore.models import PersistentIdentifier
from sonar.modules.documents.api import DocumentRecord
import datetime
start = datetime.datetime.now()
n = 0
for pid in PersistentIdentifier.query.filter_by(
            pid_type='doc').all():
    try:
        record = DocumentRecord.get_record(pid.object_uuid)
        n += 1
        if record.get('_oai'):
            del record['_oai']
            record.commit()
            db.session.commit()
            record.reindex()
    except Exception as e:
        # raise(e)
        print(f"Failed to update record {pid.pid_value}")

print(f"Updated {n} records")
end = datetime.datetime.now()
print(f"Duration: {end - start}")
index_name=`uv run invenio rero es index info -i documents |grep -v percolator`
echo $index_name
uv run invenio rero es index move documents $index_name documents-document-v1.0.0-20250923 -v
uv run invenio index delete $index_name --yes-i-know

Deposits

Remove category from deposit.

from sonar.modules.deposits.api import DepositRecord
n = 0
for pid in PersistentIdentifier.query.filter_by(
            pid_type='depo').all():
    try:
        record = DepositRecord.get_record(pid.object_uuid) 
        n += 1
        changed = False
        for f in record.get('_files', []):
            if 'category' in f:
                del f['category']
                changed = True
            if 'embargo' in f:
                del f['embargo']
                changed = True
        if changed:
            record.commit()
            db.session.commit()
            record.reindex()
    except:
        print(f"Failed to update record {pid.pid_value}")

print(f"Updated {n} records")
index_name=`uv run invenio rero es index info -i deposits`
echo $index_name
uv run invenio rero es index move deposits $index_name deposits-deposit-v1.0.0-20250923 -v
uv run invenio index delete $index_name --yes-i-know

Organisations

index_name=`uv run invenio rero es index info -i organisations`
echo $index_name
uv run invenio rero es index move organisations $index_name rganisations-organisation-v1.0.0-20250923 -v
uv run invenio index delete $index_name --yes-i-know

ConfigMap

  • replace INVENIO_SQLALCHEMY_POOL_RECYCLE by INVENIO_SQLALCHEMY_ENGINE_OPTIONS: '{ "pool_recycle": 360 }'
  • set the config in the sqlalchemy container/server by setting PGOPTIONS to -c statement_timeout=30s -c idle_in_transaction_session_timeout=60s

Clone this wiki locally