2019-01-04 02:21:02 +01:00
|
|
|
// Matrix Construct
|
|
|
|
//
|
|
|
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
|
|
|
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
|
|
|
|
//
|
|
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
|
|
// copyright notice and this permission notice is present in all copies. The
|
|
|
|
// full license for this software is available in the LICENSE file.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
#define HAVE_IRCD_M_SYNC_H
|
|
|
|
|
|
|
|
namespace ircd
|
|
|
|
{
|
|
|
|
struct client;
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace ircd::m::sync
|
|
|
|
{
|
|
|
|
struct args;
|
|
|
|
struct stats;
|
|
|
|
struct data;
|
|
|
|
struct item;
|
2019-01-09 00:10:06 +01:00
|
|
|
using item_closure = std::function<void (item &)>;
|
|
|
|
using item_closure_bool = std::function<bool (item &)>;
|
|
|
|
|
|
|
|
string_view loghead(const data &);
|
|
|
|
|
|
|
|
bool apropos(const data &, const event::idx &);
|
|
|
|
bool apropos(const data &, const event::id &);
|
|
|
|
bool apropos(const data &, const event &);
|
|
|
|
|
|
|
|
bool for_each(const string_view &prefix, const item_closure_bool &);
|
|
|
|
bool for_each(const item_closure_bool &);
|
2019-01-04 02:21:02 +01:00
|
|
|
|
|
|
|
extern log::log log;
|
2019-01-09 00:10:06 +01:00
|
|
|
extern ctx::pool pool;
|
2019-02-22 20:13:55 +01:00
|
|
|
extern conf::item<bool> stats_info;
|
|
|
|
extern conf::item<bool> stats_debug;
|
2019-01-04 02:21:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
struct ircd::m::sync::item
|
|
|
|
:instance_multimap<std::string, item, std::less<>>
|
|
|
|
{
|
2019-01-10 22:19:07 +01:00
|
|
|
using handle = std::function<void (data &)>;
|
2019-01-04 02:21:02 +01:00
|
|
|
|
|
|
|
handle _polylog;
|
|
|
|
handle _linear;
|
|
|
|
|
|
|
|
public:
|
|
|
|
string_view name() const;
|
2019-01-09 00:10:06 +01:00
|
|
|
string_view member_name() const;
|
2019-01-04 02:21:02 +01:00
|
|
|
|
2019-01-10 22:19:07 +01:00
|
|
|
void poll(data &, const m::event &);
|
|
|
|
void linear(data &);
|
|
|
|
void polylog(data &);
|
2019-01-04 02:21:02 +01:00
|
|
|
|
|
|
|
item(std::string name,
|
|
|
|
handle polylog = {},
|
2019-01-04 23:47:01 +01:00
|
|
|
handle linear = {});
|
2019-01-04 02:21:02 +01:00
|
|
|
|
|
|
|
item(item &&) = delete;
|
|
|
|
item(const item &) = delete;
|
|
|
|
~item() noexcept;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ircd::m::sync::data
|
|
|
|
{
|
2019-01-10 22:19:07 +01:00
|
|
|
/// Range to synchronize. Starting index is inclusive, ending index is
|
|
|
|
/// exclusive. Generally the starting index is a since token, and ending
|
|
|
|
/// index is one beyond the vm::current_sequence and used for next_batch.
|
|
|
|
m::events::range range;
|
2019-01-04 02:21:02 +01:00
|
|
|
|
2019-01-10 22:19:07 +01:00
|
|
|
/// Statistics tracking. If null, stats won't be accumulated for the sync.
|
|
|
|
sync::stats *stats {nullptr};
|
|
|
|
|
|
|
|
/// The client. This may be null if sync is being called internally.
|
|
|
|
ircd::client *client {nullptr};
|
2019-01-04 02:21:02 +01:00
|
|
|
|
|
|
|
// User related
|
|
|
|
const m::user user;
|
|
|
|
const m::user::room user_room;
|
2019-01-09 00:10:06 +01:00
|
|
|
const m::room::state user_state;
|
2019-01-04 02:21:02 +01:00
|
|
|
const m::user::rooms user_rooms;
|
|
|
|
const std::string filter_buf;
|
|
|
|
const m::filter filter;
|
|
|
|
|
2019-01-10 22:19:07 +01:00
|
|
|
/// The json::stack master object
|
2019-01-04 02:21:02 +01:00
|
|
|
json::stack out;
|
2019-01-10 22:19:07 +01:00
|
|
|
bool committed {false};
|
2019-01-04 02:21:02 +01:00
|
|
|
bool commit();
|
|
|
|
|
|
|
|
// apropos contextual
|
|
|
|
const m::event *event {nullptr};
|
|
|
|
const m::room *room {nullptr};
|
|
|
|
string_view membership;
|
|
|
|
|
2019-01-10 22:19:07 +01:00
|
|
|
data(const m::user &user,
|
|
|
|
const m::events::range &range,
|
|
|
|
const mutable_buffer &,
|
|
|
|
json::stack::flush_callback,
|
|
|
|
const size_t &flush_hiwat = 64_KiB,
|
|
|
|
ircd::client *const &client = nullptr,
|
|
|
|
sync::stats *const &stats = nullptr,
|
|
|
|
const string_view &filter_id = {});
|
2019-01-04 02:21:02 +01:00
|
|
|
|
|
|
|
data(data &&) = delete;
|
|
|
|
data(const data &) = delete;
|
|
|
|
~data() noexcept;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ircd::m::sync::stats
|
|
|
|
{
|
|
|
|
ircd::timer timer;
|
|
|
|
size_t flush_bytes {0};
|
|
|
|
size_t flush_count {0};
|
|
|
|
};
|