atviriduomenys / spinta

Spinta is a framework to describe, extract and publish data (a DEP Framework).
MIT License
13 stars 4 forks source link

Klaida eksporto metu po versijos atnaujinimo #721

Open JuliusLADP opened 2 months ago

JuliusLADP commented 2 months ago

Skirtingiems rinkiniams kartojasi klaidos žinutė: ServiceException: INTERNAL (MagritteRestSource:InternalServerError): {responseCode=500, validCodes=[200, 201, 204], response={"errors":[{"code":"AttributeError","message":"'NoneType' object has no attribute 'keys'"}]}, filename=datasets_gov_lsd_cl_ja_asmenys_JuridinisAsmuo?#2024-07-31T08_39_56.019021096Z}

Nemažai atvejų ši klaida susitvarko pakartotinai pabandžius eksportuoti, nieko nepakeitus. Visgi kai kuriais atvejais klaida kartojasi, nepavyksta eksportuoti visų atnaujinimų.

Iš error message nevisai aišku kas čia tikrinama, gal turite minčių kodėl galėtų atsirasti ši klaida?

Ši klaida kyla duomenų įkėlimo/atnaujinimo metu siunčiant užklausas (insert arba patch) į put.data.gov.lt.

Pvz. rinkinys, kuriam buvo kilusi ši klaida, tačiau pakartotinai paleidus, sėkmingai įsikėlė atsinaujinimai – https://put.data.gov.lt/datasets/gov/lsd/statistika/namu_ukiu_tersalai/S1R058_M8010705/:changes/-10

Šiam rinkiniui klaida kartojasi, nevisos patch užklausos įkeltos, tik dalis – https://put.data.gov.lt/datasets/gov/lsd/cl/ja_asmenys/JuridinisAsmuo/:changes/-10

Log‘ai nežinau ar Jums bus infomatyvūs, pasiteiravau Palantir komandos detalesnio paaiškinimo, laukiame.

JustinasKen commented 2 months ago

Ar yra galimybė gauti traceback logus, kad būtų galima pamatyti, kurioje kodo vietoje ši klaida atsirado ?

sirex commented 2 months ago

Informacija iš serverio žurnalų:

Traceback (most recent call last):
  File "spinta/api/__init__.py", line 272, in homepage
    return await create_http_response(context, params, request)
  File "spinta/utils/response.py", line 147, in create_http_response
    return await commands.getone(
  File "spinta/commands/read.py", line 384, in getone
    resp = await commands.getone(
  File "spinta/commands/read.py", line 425, in getone
    commands.authorize(context, action, model)
  File "multipledispatch/dispatcher.py", line 278, in __call__
    return func(*args, **kwargs)
  File "spinta/types/model.py", line 491, in authorize
    authorized(context, model, action, throw=True)
  File "spinta/auth.py", line 478, in authorized
    unauthorized = token.get_client_id() == get_client_id_from_name(get_clients_path(config), config.default_auth_client)
  File "spinta/auth.py", line 790, in get_client_id_from_name
    if client_name in keymap.keys():
AttributeError: 'NoneType' object has no attribute 'keys'

Galimai susijusi užduotis:

JustinasKen commented 2 months ago

Dar vienas traceback:

Traceback (most recent call last):
   File "/opt/spintatest/env/lib/python3.9/site-packages/gunicorn/arbiter.py", line 589, in spawn_worker
     worker.init_process()
   File "/opt/spintatest/env/lib/python3.9/site-packages/uvicorn/workers.py", line 66, in init_process
     super(UvicornWorker, self).init_process()
   File "/opt/spintatest/env/lib/python3.9/site-packages/gunicorn/workers/base.py", line 134, in init_process
     self.load_wsgi()
   File "/opt/spintatest/env/lib/python3.9/site-packages/gunicorn/workers/base.py", line 146, in load_wsgi
     self.wsgi = self.app.wsgi()
   File "/opt/spintatest/env/lib/python3.9/site-packages/gunicorn/app/base.py", line 67, in wsgi
     self.callable = self.load()
   File "/opt/spintatest/env/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
     return self.load_wsgiapp()
   File "/opt/spintatest/env/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
     return util.import_app(self.app_uri)
   File "/opt/spintatest/env/lib/python3.9/site-packages/gunicorn/util.py", line 359, in import_app
     mod = importlib.import_module(module)
   File "/opt/pyenv/versions/3.9.2/lib/python3.9/importlib/__init__.py", line 127, in import_module
     return _bootstrap._gcd_import(name[level:], package, level)
   File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
   File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
   File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
   File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
   File "<frozen importlib._bootstrap_external>", line 790, in exec_module
   File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
   File "/opt/spintatest/env/lib/python3.9/site-packages/spinta/asgi.py", line 18, in <module>
     commands.check(context, config)
   File "/opt/spintatest/env/lib/python3.9/site-packages/multipledispatch/dispatcher.py", line 278, in __call__
     return func(*args, **kwargs)
   File "/opt/spintatest/env/lib/python3.9/site-packages/spinta/types/config.py", line 114, in check
     if config.default_auth_client and not client_name_exists(path, config.default_auth_client):
   File "/opt/spintatest/env/lib/python3.9/site-packages/spinta/auth.py", line 586, in client_name_exists
     if client in keymap.keys():
 AttributeError: 'NoneType' object has no attribute 'keys'
JustinasKen commented 1 month ago

Lokaliai nepavyksta atkartoti bugo (Windows 10 sistema).

Yra galimi keli sprendimai:

  1. Aptikus None reikšmę, atlikti retry kelis kartus, jei toliau vis gaunam None, mesti klaidą.

    Pliusai:

    • Lengvai įgyvendinama.

    Trūkumai:

    • Nesutvarko esminės klaidos.
  2. Užkrauti Keymap vieną kartą į atmintį (pradžioje) ir visada jį naudoti.

    Pliusai:

    • Sumažina apkrovą skaitymo ir rašymo metu.

    Trūkumai:

    • Sudėtinga įgyvendinti.
    • Rankiniu būdu pakeitus keymap, reikia perkrauti serverį.
JuliusLADP commented 1 month ago

Dėl laiko stokos kol kas bandom išsisukti su 1 variantu.

JustinasKen commented 1 month ago

@sirex pasiūlymas:

Problema, su runtime migracijomis, kad web serveryje, vienu metu startuoja keliolika procesų ir jie visi vienu metu bando leisti migracijas, ko pasekoje, atsiranda raise condition. Todėl ir siūlau, migracijas iškelti į atskirą komandą kur užtikrintai rašymo operacijos bus daromos tik vieną kartą. O runtime, tiesiog read operacijų pagalba patikrinti ar reikia migruoti ir jei reikia, tada mesti klaidą, nurodant, kokią komandą reikia paleisti.

Tai yra, vietoj to, kad bandytume atlikti migracijas paleidimo metu, geriau būtų mesti klaidą, kad reikalinga migracija, naudojant spinta client migrate komanda. Ko pasekoje turėtų sumažėti ar iš vis nelikti klaidų paleidimo metu.

Ar @JuliusLADP tiktų toks veikimo principo pakeitimas ?

JuliusLADP commented 1 month ago

Aš specialistams negaliu patarti, kuris sprendimas yra geresnis. Kaip suprantu Mantas aprašo alternatyvą pačio 2 variantui? Tuomet judviejų, kaip suprantančių detalių specifiką, reikalas pasirinkti tinkamiausią variantą.

JustinasKen commented 1 month ago

@sirex pasiūlymas:

Problema, su runtime migracijomis, kad web serveryje, vienu metu startuoja keliolika procesų ir jie visi vienu metu bando leisti migracijas, ko pasekoje, atsiranda raise condition. Todėl ir siūlau, migracijas iškelti į atskirą komandą kur užtikrintai rašymo operacijos bus daromos tik vieną kartą. O runtime, tiesiog read operacijų pagalba patikrinti ar reikia migruoti ir jei reikia, tada mesti klaidą, nurodant, kokią komandą reikia paleisti.

Tai yra, vietoj to, kad bandytume atlikti migracijas paleidimo metu, geriau būtų mesti klaidą, kad reikalinga migracija, naudojant spinta client migrate komanda. Ko pasekoje turėtų sumažėti ar iš vis nelikti klaidų paleidimo metu.

Ar @JuliusLADP tiktų toks veikimo principo pakeitimas ?

Ši dalis bus įgyvendinta #764 užduotyje

JuliusLADP commented 1 month ago

Tinka

dovileer commented 1 month ago

Ši klaida vis dar kartojasi kasdien, tiek įkeliant naujus rinkinius, tiek atliekant seniau įkeltų rinkinių atnaujinimus. Duomenys įsikelia pilnai, tačiau reikia papildomai imtis veiksmų - paleisti duomenų įkėlimą iš naujo.

response={"errors":[{"code":"AttributeError","message":"'NoneType' object has no attribute 'keys'"

JustinasKen commented 1 month ago

Keliami duomenys į prod ar test serverį ?

Nes šitas fix atsirado 0.1.71 versijoje, o prod yra 0.1.70