Store scheduled messages in a HashTable.
This commit is contained in:
parent
713b1f086e
commit
aa6e85404a
@ -6551,7 +6551,7 @@ tl_object_ptr<telegram_api::inputEncryptedChat> MessagesManager::get_input_encry
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool MessagesManager::have_dialog_scheduled_messages_in_memory(const Dialog *d) {
|
bool MessagesManager::have_dialog_scheduled_messages_in_memory(const Dialog *d) {
|
||||||
return d->scheduled_messages != nullptr && d->scheduled_messages->scheduled_messages_ != nullptr;
|
return d->scheduled_messages != nullptr && !d->scheduled_messages->scheduled_messages_.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MessagesManager::is_allowed_useless_update(const tl_object_ptr<telegram_api::Update> &update) {
|
bool MessagesManager::is_allowed_useless_update(const tl_object_ptr<telegram_api::Update> &update) {
|
||||||
@ -10587,8 +10587,9 @@ void MessagesManager::on_get_scheduled_server_messages(DialogId dialog_id, uint3
|
|||||||
|
|
||||||
vector<MessageId> old_message_ids;
|
vector<MessageId> old_message_ids;
|
||||||
if (d->scheduled_messages != nullptr) {
|
if (d->scheduled_messages != nullptr) {
|
||||||
find_old_messages(d->scheduled_messages->scheduled_messages_.get(),
|
for (const auto &it : d->scheduled_messages->scheduled_messages_) {
|
||||||
MessageId(ScheduledServerMessageId(), std::numeric_limits<int32>::max(), true), old_message_ids);
|
old_message_ids.push_back(it.first);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
FlatHashMap<ScheduledServerMessageId, MessageId, ScheduledServerMessageIdHash> old_server_message_ids;
|
FlatHashMap<ScheduledServerMessageId, MessageId, ScheduledServerMessageIdHash> old_server_message_ids;
|
||||||
for (auto &message_id : old_message_ids) {
|
for (auto &message_id : old_message_ids) {
|
||||||
@ -16669,8 +16670,8 @@ unique_ptr<MessagesManager::Message> MessagesManager::do_delete_scheduled_messag
|
|||||||
}
|
}
|
||||||
CHECK(d->scheduled_messages != nullptr);
|
CHECK(d->scheduled_messages != nullptr);
|
||||||
}
|
}
|
||||||
unique_ptr<Message> *v = treap_find_message(&d->scheduled_messages->scheduled_messages_, message_id);
|
auto it = d->scheduled_messages->scheduled_messages_.find(message_id);
|
||||||
if (*v == nullptr) {
|
if (it == d->scheduled_messages->scheduled_messages_.end()) {
|
||||||
LOG(INFO) << message_id << " is not found in " << d->dialog_id << " to be deleted from " << source;
|
LOG(INFO) << message_id << " is not found in " << d->dialog_id << " to be deleted from " << source;
|
||||||
auto message = get_message_force(d, message_id, "do_delete_scheduled_message");
|
auto message = get_message_force(d, message_id, "do_delete_scheduled_message");
|
||||||
if (message == nullptr) {
|
if (message == nullptr) {
|
||||||
@ -16681,11 +16682,11 @@ unique_ptr<MessagesManager::Message> MessagesManager::do_delete_scheduled_messag
|
|||||||
}
|
}
|
||||||
|
|
||||||
message_id = message->message_id;
|
message_id = message->message_id;
|
||||||
v = treap_find_message(&d->scheduled_messages->scheduled_messages_, message_id);
|
it = d->scheduled_messages->scheduled_messages_.find(message_id);
|
||||||
CHECK(*v != nullptr);
|
CHECK(it != d->scheduled_messages->scheduled_messages_.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
const Message *m = v->get();
|
const Message *m = it->second.get();
|
||||||
CHECK(m->message_id == message_id);
|
CHECK(m->message_id == message_id);
|
||||||
|
|
||||||
LOG(INFO) << "Deleting " << FullMessageId{d->dialog_id, message_id} << " from " << source;
|
LOG(INFO) << "Deleting " << FullMessageId{d->dialog_id, message_id} << " from " << source;
|
||||||
@ -16694,7 +16695,9 @@ unique_ptr<MessagesManager::Message> MessagesManager::do_delete_scheduled_messag
|
|||||||
|
|
||||||
remove_message_file_sources(d->dialog_id, m);
|
remove_message_file_sources(d->dialog_id, m);
|
||||||
|
|
||||||
auto result = treap_delete_message(v);
|
it = d->scheduled_messages->scheduled_messages_.find(message_id);
|
||||||
|
auto result = std::move(it->second);
|
||||||
|
d->scheduled_messages->scheduled_messages_.erase(it);
|
||||||
CHECK(m == result.get());
|
CHECK(m == result.get());
|
||||||
|
|
||||||
if (message_id.is_scheduled_server()) {
|
if (message_id.is_scheduled_server()) {
|
||||||
@ -23811,9 +23814,10 @@ vector<MessageId> MessagesManager::get_dialog_scheduled_messages(DialogId dialog
|
|||||||
|
|
||||||
vector<MessageId> message_ids;
|
vector<MessageId> message_ids;
|
||||||
if (d->scheduled_messages != nullptr) {
|
if (d->scheduled_messages != nullptr) {
|
||||||
find_old_messages(d->scheduled_messages->scheduled_messages_.get(),
|
for (const auto &it : d->scheduled_messages->scheduled_messages_) {
|
||||||
MessageId(ScheduledServerMessageId(), std::numeric_limits<int32>::max(), true), message_ids);
|
message_ids.push_back(it.first);
|
||||||
std::reverse(message_ids.begin(), message_ids.end());
|
};
|
||||||
|
std::sort(message_ids.begin(), message_ids.end(), std::greater<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (G()->use_message_database()) {
|
if (G()->use_message_database()) {
|
||||||
@ -31493,13 +31497,13 @@ MessageId MessagesManager::get_next_local_message_id(Dialog *d) {
|
|||||||
MessageId MessagesManager::get_next_yet_unsent_scheduled_message_id(Dialog *d, int32 date) {
|
MessageId MessagesManager::get_next_yet_unsent_scheduled_message_id(Dialog *d, int32 date) {
|
||||||
CHECK(date > 0);
|
CHECK(date > 0);
|
||||||
|
|
||||||
MessageId message_id(ScheduledServerMessageId(1), date);
|
|
||||||
|
|
||||||
auto *scheduled_messages = add_dialog_scheduled_messages(d);
|
auto *scheduled_messages = add_dialog_scheduled_messages(d);
|
||||||
auto it = MessagesConstScheduledIterator(d, MessageId(ScheduledServerMessageId(), date + 1, true));
|
MessageId message_id(ScheduledServerMessageId(1), date);
|
||||||
if (*it != nullptr && (*it)->message_id > message_id) {
|
for (const auto &it : d->scheduled_messages->scheduled_messages_) {
|
||||||
message_id = (*it)->message_id;
|
if (it.first.get_scheduled_message_date() == date && it.first > message_id) {
|
||||||
}
|
message_id = it.first;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
auto &last_assigned_message_id = scheduled_messages->last_assigned_scheduled_message_id_[date];
|
auto &last_assigned_message_id = scheduled_messages->last_assigned_scheduled_message_id_[date];
|
||||||
if (last_assigned_message_id != MessageId() && last_assigned_message_id > message_id) {
|
if (last_assigned_message_id != MessageId() && last_assigned_message_id > message_id) {
|
||||||
@ -32214,7 +32218,7 @@ void MessagesManager::set_dialog_has_scheduled_database_messages_impl(Dialog *d,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (d->has_scheduled_database_messages && have_dialog_scheduled_messages_in_memory(d) &&
|
if (d->has_scheduled_database_messages && have_dialog_scheduled_messages_in_memory(d) &&
|
||||||
!d->scheduled_messages->scheduled_messages_->message_id.is_yet_unsent()) {
|
!d->scheduled_messages->scheduled_messages_.begin()->first.is_yet_unsent()) {
|
||||||
// to prevent race between add_message_to_database and check of has_scheduled_database_messages
|
// to prevent race between add_message_to_database and check of has_scheduled_database_messages
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -34356,7 +34360,10 @@ const MessagesManager::Message *MessagesManager::get_message(const Dialog *d, Me
|
|||||||
CHECK(message_id.is_scheduled_server());
|
CHECK(message_id.is_scheduled_server());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result = treap_find_message(&d->scheduled_messages->scheduled_messages_, message_id)->get();
|
auto it = d->scheduled_messages->scheduled_messages_.find(message_id);
|
||||||
|
if (it != d->scheduled_messages->scheduled_messages_.end()) {
|
||||||
|
result = it->second.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (message_id.is_valid()) {
|
if (message_id.is_valid()) {
|
||||||
@ -35500,9 +35507,10 @@ MessagesManager::Message *MessagesManager::add_scheduled_message_to_dialog(Dialo
|
|||||||
CHECK(is_inserted);
|
CHECK(is_inserted);
|
||||||
}
|
}
|
||||||
|
|
||||||
Message *result_message = treap_insert_message(&scheduled_messages->scheduled_messages_, std::move(message));
|
auto result_message = message.get();
|
||||||
CHECK(result_message != nullptr);
|
auto is_inserted =
|
||||||
CHECK(have_dialog_scheduled_messages_in_memory(d));
|
scheduled_messages->scheduled_messages_.emplace(result_message->message_id, std::move(message)).second;
|
||||||
|
CHECK(is_inserted);
|
||||||
being_readded_message_id_ = FullMessageId();
|
being_readded_message_id_ = FullMessageId();
|
||||||
return result_message;
|
return result_message;
|
||||||
}
|
}
|
||||||
|
@ -1290,7 +1290,7 @@ class MessagesManager final : public Actor {
|
|||||||
|
|
||||||
FlatHashSet<ScheduledServerMessageId, ScheduledServerMessageIdHash> deleted_scheduled_server_message_ids_;
|
FlatHashSet<ScheduledServerMessageId, ScheduledServerMessageIdHash> deleted_scheduled_server_message_ids_;
|
||||||
|
|
||||||
unique_ptr<Message> scheduled_messages_;
|
FlatHashMap<MessageId, unique_ptr<Message>, MessageIdHash> scheduled_messages_;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NotificationInfo {
|
struct NotificationInfo {
|
||||||
@ -1704,19 +1704,6 @@ class MessagesManager final : public Actor {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class MessagesConstScheduledIterator final : public MessagesIteratorBase<true> {
|
|
||||||
public:
|
|
||||||
MessagesConstScheduledIterator() = default;
|
|
||||||
|
|
||||||
MessagesConstScheduledIterator(Dialog *d, MessageId message_id)
|
|
||||||
: MessagesIteratorBase(d->scheduled_messages->scheduled_messages_.get(), message_id) {
|
|
||||||
}
|
|
||||||
|
|
||||||
const Message *operator*() const {
|
|
||||||
return MessagesIteratorBase::operator*();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PendingSecretMessage {
|
struct PendingSecretMessage {
|
||||||
enum class Type : int32 { NewMessage, DeleteMessages, DeleteHistory };
|
enum class Type : int32 { NewMessage, DeleteMessages, DeleteHistory };
|
||||||
Type type = Type::NewMessage;
|
Type type = Type::NewMessage;
|
||||||
|
Loading…
Reference in New Issue
Block a user