MAILTO=""

# NOTE: This file is organized in chronological order of the start hour of each job, keeping jobs spread over the night and not overlapping.

# Delete pending listens and update our listen counts, timestamps hourly
0 * * * * root /usr/local/bin/python /code/listenbrainz/manage.py delete_listens >> /logs/listen_metadata.log 2>&1

# Generating troi daily playlists runs hourly
0 * * * * root /usr/local/bin/python /code/listenbrainz/manage.py run-daily-jams >> /logs/troi.log 2>&1
# Batch generate weekly playlists
4 * * * 0,1 root /usr/local/bin/python /code/listenbrainz/manage.py spark request_troi_playlists --slug weekly-jams >> /logs/troi_spark.log
5 * * * 0,1 root /usr/local/bin/python /code/listenbrainz/manage.py spark request_troi_playlists --slug weekly-exploration >> /logs/troi_spark.log

## Trigger an incremental dump everyday, near noon, far away from whole dump times, again do not block for the lock.
0 0 * * * root flock -x -n /var/lock/lb-dumps.lock /code/listenbrainz/admin/create-dumps.sh incremental >> /logs/dumps.log 2>&1
## Around 1 hour later, trigger an incremental import into the spark cluster, blocking for the lock in case the dump was not complete
0 1 * * * root flock -x /var/lock/lb-dumps.lock /usr/local/bin/python /code/listenbrainz/manage.py spark request_import_incremental >> /logs/dumps.log 2>&1

# After the daily dumping is done, make sure everything turned out ok, otherwise mail the observability list.
0 2 * * * root flock -x /var/lock/lb-dumps.lock /usr/local/bin/python /code/listenbrainz/manage.py dump check_dump_ages >> /logs/dumps.log 2>&1

# batch up all the spark requests, spaced by 1 minute in order to ensure the correct order
# Request all statistics
0 2 * * * root /usr/local/bin/python /code/listenbrainz/manage.py spark cron_request_all_stats >> /logs/stats.log 2>&1
# Request recommendations after dump and mapping has been imported into the spark cluster
1 2 * * * root /usr/local/bin/python /code/listenbrainz/manage.py spark cron_request_recommendations >> /logs/stats.log 2>&1
# Request missing MB data each month after a new dump has been imported to spark cluster
2 2 * * 1 root /usr/local/bin/python /code/listenbrainz/manage.py spark request_missing_mb_data >> /logs/stats.log 2>&1
# Calculate user similarity
3 2 * * * root /usr/local/bin/python /code/listenbrainz/manage.py spark cron_request_similar_users >> /logs/stats.log 2>&1

# Dump user feedback before we generate recommendations
15 2 * * * root flock -x -n /var/lock/lb-dumps.lock /code/listenbrainz/admin/create-dumps.sh feedback >> /logs/dumps.log 2>&1

# Request user fresh releases daily
0 3 * * * root /usr/local/bin/python /code/listenbrainz/manage.py spark request_fresh_releases --threshold 10 >> /logs/fresh_releases.log 2>&1

## Trigger a full dump on 1st and 15th of every month, in the middle of the night, do not block to wait for lock.
0 4 1,15 * * root flock -x -n /var/lock/lb-dumps.lock /code/listenbrainz/admin/create-dumps.sh full >> /logs/dumps.log 2>&1
## Around 24 hours later, trigger a full import into the spark cluster, and this time wait for the lock, in case the dump hasn't finished.
0 4 2,16 * * root flock -x /var/lock/lb-dumps.lock /usr/local/bin/python /code/listenbrainz/manage.py spark request_import_full >> /logs/dumps.log 2>&1

# run job to update msids with mapped mbids daily
0 6 * * * root /usr/local/bin/python /code/listenbrainz/manage.py update-msid-tables >> /logs/msid-updater.log 2>&1

# run daily cron job to refresh top msid-mbid mappings
0 7 * * * root /usr/local/bin/python /code/listenbrainz/manage.py refresh-top-manual-mappings >> /logs/top_manual_mappings.log 2>&1

## Trigger a canonical dump on 3rd and 17th of every month do not block to wait for lock.
# The canonical tables are re-generated every day at 4am, so do this later in order to get today's data
0 8 3,17 * * root flock -x -n /var/lock/lb-dumps.lock /code/listenbrainz/admin/create-dumps.sh mbcanonical >> /logs/dumps.log 2>&1

# run weekly cron job to remove expired do not recommends
0 8 * * 0 root /usr/local/bin/python /code/listenbrainz/manage.py clear-expired-do-not-recommends >> /logs/do_not_recommend.log 2>&1

# run weekly cron job to update similarity datasets
0 9 * * 0 root /usr/local/bin/python /code/listenbrainz/manage.py spark cron_request_similarity_datasets >> /logs/similarity_datasets.log 2>&1

# run weekly cron job to update popularity datasets
0 10 * * 0 root /usr/local/bin/python /code/listenbrainz/manage.py spark request_popularity >> /logs/popularity_datasets.log 2>&1

# delete old and expired user data exports
0 11 * * * root /usr/local/bin/python /code/listenbrainz/manage.py delete-old-user-data-exports >> /logs/user_data_exports.log 2>&1
