replicator-queue.h revision 99a9e14caaf54d884dac6a520111cfc8849d8323
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen#ifndef REPLICATOR_QUEUE_H
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen#define REPLICATOR_QUEUE_H
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen#include "priorityq.h"
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen#include "replication-common.h"
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenstruct replicator_user {
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen struct priorityq_item item;
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen char *username;
99a9e14caaf54d884dac6a520111cfc8849d8323Timo Sirainen /* dsync state for incremental syncing */
593bf2d333dc67e9d9e6552273332157793731c0Timo Sirainen char *state;
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen /* last time this user's state was updated */
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen time_t last_update;
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen /* last_fast_run is always >= last_full_run. */
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen time_t last_fast_sync, last_full_sync;
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
593bf2d333dc67e9d9e6552273332157793731c0Timo Sirainen enum replication_priority priority;
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen /* User isn't currently in replication queue */
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen unsigned int popped:1;
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen /* Last replication sync failed */
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen unsigned int last_sync_failed:1;
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen};
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainentypedef void replicator_sync_callback_t(bool success, void *context);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenstruct replicator_queue *replicator_queue_init(unsigned int full_sync_interval);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenvoid replicator_queue_deinit(struct replicator_queue **queue);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen/* Call the specified callback when data is added/removed/moved in queue
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen via _add(), _add_sync() or _remove() functions (not push/pop). */
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenvoid replicator_queue_set_change_callback(struct replicator_queue *queue,
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen void (*callback)(void *context),
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen void *context);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen/* Add a user to queue and return it. If the user already exists, it's updated
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen only if the new priority is higher. */
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenstruct replicator_user *
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenreplicator_queue_add(struct replicator_queue *queue, const char *username,
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen enum replication_priority priority);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenvoid replicator_queue_add_sync(struct replicator_queue *queue,
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen const char *username,
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen replicator_sync_callback_t *callback,
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen void *context);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen/* Remove user from replication queue and free it. */
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenvoid replicator_queue_remove(struct replicator_queue *queue,
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen struct replicator_user **user);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen/* Return the next user from replication queue, and remove it from the queue.
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen If there's nothing to be replicated currently, returns NULL and sets
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen next_secs_r to when there should be more work to do. */
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenstruct replicator_user *
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenreplicator_queue_pop(struct replicator_queue *queue,
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen unsigned int *next_secs_r);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen/* Add user back to queue. */
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenvoid replicator_queue_push(struct replicator_queue *queue,
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen struct replicator_user *user);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenint replicator_queue_import(struct replicator_queue *queue, const char *path);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainenint replicator_queue_export(struct replicator_queue *queue, const char *path);
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen
99a9e14caaf54d884dac6a520111cfc8849d8323Timo Sirainen/* Returns an (unsorted) array of all users in the queue. */
99a9e14caaf54d884dac6a520111cfc8849d8323Timo Sirainenstruct replicator_user *const *
99a9e14caaf54d884dac6a520111cfc8849d8323Timo Sirainenreplicator_queue_get_users(struct replicator_queue *queue,
99a9e14caaf54d884dac6a520111cfc8849d8323Timo Sirainen unsigned int *count_r);
99a9e14caaf54d884dac6a520111cfc8849d8323Timo Sirainen
447e086422f1ab7cc16833583ed70a4af7a84bc5Timo Sirainen#endif