Arreglada race condition de get_discs_of_artist

Ademas hice algo inteligente y agrege logs a la funcion, es mas facil
ver que carajo paso
This commit is contained in:
Daniel Cortes
2020-06-10 05:28:00 -04:00
parent 2a639f557f
commit 1d4c5f28ac

View File

@@ -5,6 +5,7 @@ correspondientes con lo que debe entregar la api, se encarga de casos como
traducción. traducción.
""" """
import json import json
import logging
from math import ceil from math import ceil
from country_list import countries_for_language from country_list import countries_for_language
@@ -14,6 +15,9 @@ from fetcher import jobs
from utils import get_redis_connection from utils import get_redis_connection
_log = logging.getLogger('fetcher_medium')
_log.addHandler(logging.NullHandler())
### ###
# Utility code # Utility code
### ###
@@ -209,13 +213,27 @@ def get_discs_of_artist(mbid, limit, page):
# Si es que coinciden significa que se cargaron todos los discos, pero si no, quizás aun no # Si es que coinciden significa que se cargaron todos los discos, pero si no, quizás aun no
# terminan de guardarse, por lo que salto el código de obtención y voy directo a musicbrainz # terminan de guardarse, por lo que salto el código de obtención y voy directo a musicbrainz
with get_redis_connection() as redis: with get_redis_connection() as redis:
_log.debug('Intentando encontrar en cache los discos de %s', mbid)
key_releases = f'artist:{mbid}:release_groups' key_releases = f'artist:{mbid}:release_groups'
if key_releases in redis: if key_releases in redis:
if int(redis.get(f'{key_releases}:count')) == redis.zcard(key_releases): if int(redis.get(f'{key_releases}:count')) == redis.zcard(key_releases):
mb_discs = [get_disc(mbid) for mbid in redis.zrange(key_releases, offset, limit)] release_ids = redis.zrange(key_releases, offset, limit)
total = redis.zcard(key_releases) keys = [f'release_group:{mbid}' for mbid in release_ids]
if redis.exists(*keys) == len(release_ids):
_log.debug('Encontrados los discos de %s', mbid)
mb_discs = [get_disc(mbid) for mbid in release_ids]
total = redis.zcard(key_releases)
else:
_log.debug('Aun no se cargan todas las release_groups de %s', mbid)
else:
_log.debug('La cantidad de release_groups que hay almacenadas para %s no coinciden '
'con las totales', key_releases)
else:
_log.debug('%s no se encontraba en redis, saltando código', key_releases)
if len(mb_discs) == 0: if len(mb_discs) == 0:
_log.debug('Cargar desde musicbrainz las releases de %s', mbid)
# Si es que no había ningún disco, enviar a cargar al artista, quizás nunca se a guardado # Si es que no había ningún disco, enviar a cargar al artista, quizás nunca se a guardado
# en cache antes # en cache antes
jobs.load_artist_on_cache.delay(mbid) jobs.load_artist_on_cache.delay(mbid)
@@ -224,6 +242,7 @@ def get_discs_of_artist(mbid, limit, page):
includes=['artist-credits'], includes=['artist-credits'],
limit=limit, offset=offset) limit=limit, offset=offset)
if 'error' in mb_discs_browse: if 'error' in mb_discs_browse:
_log.error('Error al hacer browse %s', mb_discs_browse)
return mb_discs_browse return mb_discs_browse
mb_discs = mb_discs_browse.get('release_groups') mb_discs = mb_discs_browse.get('release_groups')