fi-ksi / web-backend

Backend for KSI web written in Python.
MIT License
8 stars 3 forks source link

Deploy ulohy obcas selze s `MultipleResultsFound: Multiple rows were found for one_or_none()` #129

Open jiridanek opened 3 years ago

jiridanek commented 3 years ago
Fetching origin...
Updated origin/2020_06_01_ledoborec to 87a34ab1b34529f91c802349b1ea7eec876158ab
Checking out 2020_06_01_ledoborec
Your branch is up-to-date with 'origin/2020_06_01_ledoborec'.
Hard-reseting to origin/2020_06_01_ledoborec
Parsing data/seminar/2020/vlna6/uloha_01_ledoborec
Processing meta data/seminar/2020/vlna6/uloha_01_ledoborec/task.json
Parsing 374
Processing assignment
Processing solution
Task processing done
Exception: Traceback (most recent call last):
  File "/root/web-backend/ksi-py3-venv/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 3463, in one
    ret = self.one_or_none()
  File "/root/web-backend/ksi-py3-venv/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 3441, in one_or_none
    "Multiple rows were found for one_or_none()"
sqlalchemy.orm.exc.MultipleResultsFound: Multiple rows were found for one_or_none()

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/root/web-backend/util/admin/taskDeploy.py", line 91, in deploy
    process_task(task, util.git.GIT_SEMINAR_PATH + task.git_path)
  File "/root/web-backend/util/admin/taskDeploy.py", line 159, in process_task
    process_solution(task, path + "/solution.md")
  File "/root/web-backend/util/admin/taskDeploy.py", line 368, in process_solution
    task.solution = parse_simple_text(task, data)
  File "/root/web-backend/util/admin/taskDeploy.py", line 894, in parse_simple_text
    ksi_pseudocode(text))))))
  File "/root/web-backend/util/admin/taskDeploy.py", line 872, in change_links
    res = re.sub(r"(\.\./)*data_solution/", util.config.backend_url() +
  File "/root/web-backend/util/config.py", line 32, in backend_url
    return get("backend_url")
  File "/root/web-backend/util/config.py", line 12, in get
    return session.query(model.Config).get(key).value
  File "/root/web-backend/ksi-py3-venv/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 1018, in get
    return self._get_impl(ident, loading.load_on_pk_identity)
  File "/root/web-backend/ksi-py3-venv/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 1135, in _get_impl
    return db_load_fn(self, primary_key_identity)
  File "/root/web-backend/ksi-py3-venv/lib/python3.7/site-packages/sqlalchemy/orm/loading.py", line 286, in load_on_pk_identity
    return q.one()
  File "/root/web-backend/ksi-py3-venv/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 3469, in one
    replace_context=err,
  File "/root/web-backend/ksi-py3-venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
sqlalchemy.orm.exc.MultipleResultsFound: Multiple rows were found for one()

Done
BorysekOndrej commented 3 years ago

Jo, občas to vídám když mi píšou ostatní orgové a teď se dívám, že jsem to asi fakt nikdy nezareportoval. +1 Díky Jirko.

Doplňující informace: stejná chybová hláška se objevuje obvykle, když někdo nahrazuje jeden druh modulu za jiný, nebo některý z modulů maže. Řešením toho je šáhnout do DB a smazat submissions a evaluations pro ten modul, pak už deploy projde.

Ten výpis co poslal Jirka možná není úplně to stejné, obzvlášť mě od toho odrazuje Your branch is up-to-date with 'origin/2020_06_01_ledoborec'. který vypadá, že tam k žádné změně modulu dojít nemuselo.

horacekj commented 3 years ago

Vůbec netuším, čím to je :(

BorysekOndrej commented 3 years ago

Měl jsem teďka volnou čtvrthodinku, tak jsem na to mrkl.

File "/root/web-backend/util/admin/taskDeploy.py", line 872, in change_links
    res = re.sub(r"(\.\./)*data_solution/", util.config.backend_url() +
  File "/root/web-backend/util/config.py", line 32, in backend_url
    return get("backend_url")

Co je příčinou si nejsem jistý, ale z logu je zjevné, že si SQLAlchemy myslí, že existují dva či více záznamy "backend_url" v DB. To určitě není pravda, v té tabulce je primární klíč přímo ten název.

SQLAlchemy používá pro .get nějakou trochu magii, kdy se prvně dívá do lokální cache, a pak teprve případně do DB. Trochu podezřívám, že se jí první lookup povede, a druhý už má invalidovanou cache a tak přijde jako nový záznam z DB.

res = re.sub(r"(\.\./)*data_solution/", util.config.backend_url() +
                  f"/taskContent/{task.id}/{task.mangled_soldir}/", source)
res = re.sub(r"(\.\./)*data/", util.config.backend_url() +
                  f"/taskContent/{task.id}/{task.mangled_datadir}/", res)

Možná kdyby se vytáhl předem do proměnné a pak se používala ta proměnná… Ale nevím, taky nechápu proč se to děje.