Use send_closure_later in timeout_callback just in case.

GitOrigin-RevId: ee1cee46052af875886477583cfc859503e73bcc
This commit is contained in:
levlam 2019-08-29 03:16:49 +03:00
parent cea15d975a
commit b9ee9d0cf0
2 changed files with 68 additions and 33 deletions

View File

@ -4294,11 +4294,8 @@ void MessagesManager::on_channel_get_difference_timeout_callback(void *messages_
}
auto messages_manager = static_cast<MessagesManager *>(messages_manager_ptr);
DialogId dialog_id(dialog_id_int);
CHECK(dialog_id.get_type() == DialogType::Channel);
auto d = messages_manager->get_dialog(dialog_id);
CHECK(d != nullptr);
messages_manager->get_channel_difference(dialog_id, d->pts, true, "on_channel_get_difference_timeout_callback");
send_closure_later(messages_manager->actor_id(messages_manager), &MessagesManager::on_channel_get_difference_timeout,
DialogId(dialog_id_int));
}
void MessagesManager::on_pending_message_views_timeout_callback(void *messages_manager_ptr, int64 dialog_id_int) {
@ -4307,28 +4304,8 @@ void MessagesManager::on_pending_message_views_timeout_callback(void *messages_m
}
auto messages_manager = static_cast<MessagesManager *>(messages_manager_ptr);
DialogId dialog_id(dialog_id_int);
auto d = messages_manager->get_dialog(dialog_id);
CHECK(d != nullptr);
CHECK(!d->pending_viewed_message_ids.empty());
const size_t MAX_MESSAGE_VIEWS = 100; // server side limit
vector<MessageId> message_ids;
message_ids.reserve(min(d->pending_viewed_message_ids.size(), MAX_MESSAGE_VIEWS));
for (auto message_id : d->pending_viewed_message_ids) {
message_ids.push_back(message_id);
if (message_ids.size() >= MAX_MESSAGE_VIEWS) {
messages_manager->td_->create_handler<GetMessagesViewsQuery>()->send(dialog_id, std::move(message_ids),
d->increment_view_counter);
message_ids.clear();
}
}
if (!message_ids.empty()) {
messages_manager->td_->create_handler<GetMessagesViewsQuery>()->send(dialog_id, std::move(message_ids),
d->increment_view_counter);
}
d->pending_viewed_message_ids.clear();
d->increment_view_counter = false;
send_closure_later(messages_manager->actor_id(messages_manager), &MessagesManager::on_pending_message_views_timeout,
DialogId(dialog_id_int));
}
void MessagesManager::on_pending_draft_message_timeout_callback(void *messages_manager_ptr, int64 dialog_id_int) {
@ -4337,8 +4314,8 @@ void MessagesManager::on_pending_draft_message_timeout_callback(void *messages_m
}
auto messages_manager = static_cast<MessagesManager *>(messages_manager_ptr);
DialogId dialog_id(dialog_id_int);
messages_manager->save_dialog_draft_message_on_server(dialog_id);
send_closure_later(messages_manager->actor_id(messages_manager),
&MessagesManager::save_dialog_draft_message_on_server, DialogId(dialog_id_int));
}
void MessagesManager::on_pending_read_history_timeout_callback(void *messages_manager_ptr, int64 dialog_id_int) {
@ -4347,14 +4324,15 @@ void MessagesManager::on_pending_read_history_timeout_callback(void *messages_ma
}
auto messages_manager = static_cast<MessagesManager *>(messages_manager_ptr);
DialogId dialog_id(dialog_id_int);
messages_manager->read_history_on_server_impl(dialog_id, MessageId());
send_closure_later(messages_manager->actor_id(messages_manager), &MessagesManager::read_history_on_server_impl,
DialogId(dialog_id_int), MessageId());
}
void MessagesManager::on_pending_updated_dialog_timeout_callback(void *messages_manager_ptr, int64 dialog_id_int) {
auto messages_manager = static_cast<MessagesManager *>(messages_manager_ptr);
// TODO it is unsafe to save dialog to database before binlog is flushed
messages_manager->save_dialog_to_database(DialogId(dialog_id_int));
send_closure_later(messages_manager->actor_id(messages_manager), &MessagesManager::save_dialog_to_database,
DialogId(dialog_id_int));
}
void MessagesManager::on_pending_unload_dialog_timeout_callback(void *messages_manager_ptr, int64 dialog_id_int) {
@ -4363,7 +4341,8 @@ void MessagesManager::on_pending_unload_dialog_timeout_callback(void *messages_m
}
auto messages_manager = static_cast<MessagesManager *>(messages_manager_ptr);
messages_manager->unload_dialog(DialogId(dialog_id_int));
send_closure_later(messages_manager->actor_id(messages_manager), &MessagesManager::unload_dialog,
DialogId(dialog_id_int));
}
void MessagesManager::on_dialog_unmute_timeout_callback(void *messages_manager_ptr, int64 dialog_id_int) {
@ -4426,6 +4405,10 @@ BufferSlice MessagesManager::get_dialog_database_value(const Dialog *d) {
}
void MessagesManager::save_dialog_to_database(DialogId dialog_id) {
if (G()->close_flag()) {
return;
}
CHECK(G()->parameters().use_message_db);
auto d = get_dialog(dialog_id);
CHECK(d != nullptr);
@ -5201,6 +5184,31 @@ void MessagesManager::on_update_message_views(FullMessageId full_message_id, int
}
}
void MessagesManager::on_pending_message_views_timeout(DialogId dialog_id) {
if (G()->close_flag()) {
return;
}
auto d = get_dialog(dialog_id);
CHECK(d != nullptr);
const size_t MAX_MESSAGE_VIEWS = 100; // server side limit
vector<MessageId> message_ids;
message_ids.reserve(min(d->pending_viewed_message_ids.size(), MAX_MESSAGE_VIEWS));
for (auto message_id : d->pending_viewed_message_ids) {
message_ids.push_back(message_id);
if (message_ids.size() >= MAX_MESSAGE_VIEWS) {
td_->create_handler<GetMessagesViewsQuery>()->send(dialog_id, std::move(message_ids), d->increment_view_counter);
message_ids.clear();
}
}
if (!message_ids.empty()) {
td_->create_handler<GetMessagesViewsQuery>()->send(dialog_id, std::move(message_ids), d->increment_view_counter);
}
d->pending_viewed_message_ids.clear();
d->increment_view_counter = false;
}
bool MessagesManager::update_message_views(DialogId dialog_id, Message *m, int32 views) {
CHECK(m != nullptr);
if (views > m->views) {
@ -8033,6 +8041,10 @@ int32 MessagesManager::get_unload_dialog_delay() const {
}
void MessagesManager::unload_dialog(DialogId dialog_id) {
if (G()->close_flag()) {
return;
}
Dialog *d = get_dialog(dialog_id);
CHECK(d != nullptr);
@ -12743,6 +12755,10 @@ Status MessagesManager::set_dialog_draft_message(DialogId dialog_id,
}
void MessagesManager::save_dialog_draft_message_on_server(DialogId dialog_id) {
if (G()->close_flag()) {
return;
}
auto d = get_dialog(dialog_id);
CHECK(d != nullptr);
@ -14256,6 +14272,10 @@ void MessagesManager::read_history_on_server(Dialog *d, MessageId max_message_id
}
void MessagesManager::read_history_on_server_impl(DialogId dialog_id, MessageId max_message_id) {
if (G()->close_flag()) {
return;
}
Dialog *d = get_dialog(dialog_id);
CHECK(d != nullptr);
@ -25601,6 +25621,17 @@ bool MessagesManager::running_get_channel_difference(DialogId dialog_id) const {
return active_get_channel_differencies_.count(dialog_id) > 0;
}
void MessagesManager::on_channel_get_difference_timeout(DialogId dialog_id) {
if (G()->close_flag()) {
return;
}
CHECK(dialog_id.get_type() == DialogType::Channel);
auto d = get_dialog(dialog_id);
CHECK(d != nullptr);
get_channel_difference(dialog_id, d->pts, true, "on_channel_get_difference_timeout");
}
class MessagesManager::GetChannelDifferenceLogEvent {
public:
ChannelId channel_id;

View File

@ -1493,6 +1493,8 @@ class MessagesManager : public Actor {
void find_unloadable_messages(const Dialog *d, int32 unload_before_date, const unique_ptr<Message> &m,
vector<MessageId> &message_ids, int32 &left_to_unload) const;
void on_pending_message_views_timeout(DialogId dialog_id);
bool update_message_views(DialogId dialog_id, Message *m, int32 views);
bool update_message_contains_unread_mention(Dialog *d, Message *m, bool contains_unread_mention, const char *source);
@ -2041,6 +2043,8 @@ class MessagesManager : public Actor {
bool running_get_channel_difference(DialogId dialog_id) const;
void on_channel_get_difference_timeout(DialogId dialog_id);
void get_channel_difference(DialogId dialog_id, int32 pts, bool force, const char *source);
void do_get_channel_difference(DialogId dialog_id, int32 pts, bool force,