CartoDB-SQL-API/batch
Daniel García Aubert 36d5dc1719 Queue seeker refactor:
- Extract from job subcriber everything related to queue dicovering
 - Job Queue is responsible of queue dicovering and exposes functions to scan user queues.
 - Batch creates an interval to consume queues
 - Now Batch.start() does:
  * Finds existing queues from metadata, adding to queue index the ones that are not indexed yet
  * Binds callback to process jobs for every queue found.
  * Inits queue consumer interval
  * Subscribes to PUB/SUB channel
2017-04-03 19:26:21 +02:00
..
leader Make leader locker to emit on renewal errors 2016-10-18 20:34:22 +02:00
maintenance Re-use redis pool as much as possible 2016-10-17 15:02:34 +02:00
models Include query status in log entries 2016-11-30 16:07:14 +01:00
pubsub Queue seeker refactor: 2017-04-03 19:26:21 +02:00
scheduler Re-insert into the tree if there was a user in done state that gets a new task 2016-10-21 11:42:27 +02:00
util Moved forever module 2016-05-18 11:55:58 +02:00
batch-logger.js Logger set to fatal on test environment 2016-10-12 01:40:35 +02:00
batch.js Queue seeker refactor: 2017-04-03 19:26:21 +02:00
index.js Queue seeker refactor: 2017-04-03 19:26:21 +02:00
job_backend.js Avoid to use scan command to search work in progress queues 2016-11-03 14:22:43 +01:00
job_canceller.js Fixes #293, set cancel status to a job that actually is no running but has running status. 2016-05-23 10:26:09 +02:00
job_queue.js Queue seeker refactor: 2017-04-03 19:26:21 +02:00
job_runner.js Cancel with user statement_timeout limit from redis 2016-10-21 14:35:24 +02:00
job_service.js Add clear work in progress job to service 2016-10-28 15:19:49 +02:00
job_status.js Allow users to set max statement_timeout for their queries 2016-10-10 12:01:36 +02:00
query_runner.js Timeout is passed into query runner 2016-10-10 12:00:54 +02:00
README.md Add some notes about redis data structures for batch queries 2016-10-17 16:00:30 +02:00
user_database_metadata_service.js Removed unused callback in before hook in test and added proper configuration from user database config 2016-01-14 14:08:34 +01:00

Batch Queries

This document describes features from Batch Queries, it also details some internals that might be useful for maintainers and developers.

Redis data structures

Jobs definition

Redis Hash: batch:jobs:{UUID}.

Redis DB: 5.

It stores the job definition, the user, and some metadata like the final status, the failure reason, and so.

Job queues

Redis List: batch:queue:{username}.

Redis DB: 5.

It stores a pending list of jobs per user. It points to a job definition with the {UUID}.

Job notifications

Redis Pub/Sub channel: batch:users.

Redis DB: 0.

In order to notify new jobs, it uses a Pub/Sub channel were the username for the queued job is published.

Job types

Format for the currently supported query types, and what they are missing in terms of features.

Simple

{
    "query": "update ..."
}

Does not support main fallback queries. Ideally it should support something like:

{
    "query": "update ...",
    "onsuccess": "select 'general success fallback'",
    "onerror": "select 'general error fallback'"
}

Multiple

{
    "query": [
        "update ...",
        "select ... into ..."
    ]
}

Does not support main fallback queries. Ideally it should support something like:

{
    "query": [
        "update ...",
        "select ... into ..."
    ],
    "onsuccess": "select 'general success fallback'",
    "onerror": "select 'general error fallback'"
}

Fallback

{
    "query": {
        "query": [
            {
                "query": "select 1",
                "onsuccess": "select 'success fallback query 1'",
                "onerror": "select 'error fallback query 1'"
            },
            {
                "query": "select 2",
                "onerror": "select 'error fallback query 2'"
            }
        ],
        "onsuccess": "select 'general success fallback'",
        "onerror": "select 'general error fallback'"
    }
}

It's weird to have two nested query attributes. Also, it's not possible to mix plain with fallback ones. Ideally it should support something like:

{
    "query": [
        {
            "query": "select 1",
            "onsuccess": "select 'success fallback query 1'",
            "onerror": "select 'error fallback query 1'"
        },
        "select 2"
    ],
    "onsuccess": "select 'general success fallback'",
    "onerror": "select 'general error fallback'"
    }
}

Where you don't need a nested query attribute, it's just an array as in Multiple job type, and you can mix objects and plain queries.