Make MessageId layout private.
GitOrigin-RevId: a123b1bd7fe02110e699878c6c60dcc41b90c960
This commit is contained in:
parent
b4e45a2852
commit
9da6ecaf1f
@ -63,15 +63,14 @@ class MessageId {
|
|||||||
int64 id = 0;
|
int64 id = 0;
|
||||||
|
|
||||||
static constexpr int32 SERVER_ID_SHIFT = 20;
|
static constexpr int32 SERVER_ID_SHIFT = 20;
|
||||||
|
|
||||||
friend StringBuilder &operator<<(StringBuilder &string_builder, MessageId message_id);
|
|
||||||
|
|
||||||
public:
|
|
||||||
static constexpr int32 TYPE_MASK = (1 << 3) - 1;
|
static constexpr int32 TYPE_MASK = (1 << 3) - 1;
|
||||||
static constexpr int32 FULL_TYPE_MASK = (1 << SERVER_ID_SHIFT) - 1;
|
static constexpr int32 FULL_TYPE_MASK = (1 << SERVER_ID_SHIFT) - 1;
|
||||||
static constexpr int32 TYPE_YET_UNSENT = 1;
|
static constexpr int32 TYPE_YET_UNSENT = 1;
|
||||||
static constexpr int32 TYPE_LOCAL = 2;
|
static constexpr int32 TYPE_LOCAL = 2;
|
||||||
|
|
||||||
|
friend StringBuilder &operator<<(StringBuilder &string_builder, MessageId message_id);
|
||||||
|
|
||||||
|
public:
|
||||||
MessageId() = default;
|
MessageId() = default;
|
||||||
|
|
||||||
explicit MessageId(ServerMessageId server_message_id)
|
explicit MessageId(ServerMessageId server_message_id)
|
||||||
@ -152,6 +151,21 @@ class MessageId {
|
|||||||
return MessageId((id + FULL_TYPE_MASK) & ~FULL_TYPE_MASK);
|
return MessageId((id + FULL_TYPE_MASK) & ~FULL_TYPE_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MessageId get_next_message_id(MessageType type) const {
|
||||||
|
switch (type) {
|
||||||
|
case MessageType::Server:
|
||||||
|
return get_next_server_message_id();
|
||||||
|
case MessageType::Local:
|
||||||
|
return MessageId(((id + TYPE_MASK + 1 - TYPE_LOCAL) & ~TYPE_MASK) + TYPE_LOCAL);
|
||||||
|
case MessageType::YetUnsent:
|
||||||
|
return MessageId(((id + TYPE_MASK + 1 - TYPE_YET_UNSENT) & ~TYPE_MASK) + TYPE_YET_UNSENT);
|
||||||
|
case MessageType::None:
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
|
return MessageId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool operator==(const MessageId &other) const {
|
bool operator==(const MessageId &other) const {
|
||||||
return id == other.id;
|
return id == other.id;
|
||||||
}
|
}
|
||||||
|
@ -21853,23 +21853,22 @@ void MessagesManager::on_send_message_fail(int64 random_id, Status error) {
|
|||||||
fail_send_message(full_message_id, error_code, error_message);
|
fail_send_message(full_message_id, error_code, error_message);
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageId MessagesManager::get_next_message_id(Dialog *d, int32 type) {
|
MessageId MessagesManager::get_next_message_id(Dialog *d, MessageType type) {
|
||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
int64 last =
|
int64 last =
|
||||||
std::max({d->last_message_id.get(), d->last_new_message_id.get(), d->last_database_message_id.get(),
|
std::max({d->last_message_id.get(), d->last_new_message_id.get(), d->last_database_message_id.get(),
|
||||||
d->last_assigned_message_id.get(), d->last_clear_history_message_id.get(),
|
d->last_assigned_message_id.get(), d->last_clear_history_message_id.get(),
|
||||||
d->deleted_last_message_id.get(), d->max_unavailable_message_id.get(), d->max_added_message_id.get()});
|
d->deleted_last_message_id.get(), d->max_unavailable_message_id.get(), d->max_added_message_id.get()});
|
||||||
if (last < d->last_read_inbox_message_id.get() &&
|
if (last < d->last_read_inbox_message_id.get() &&
|
||||||
d->last_read_inbox_message_id.get() <= (d->last_new_message_id.get() | MessageId::FULL_TYPE_MASK)) {
|
d->last_read_inbox_message_id.get() < d->last_new_message_id.get_next_server_message_id().get()) {
|
||||||
last = d->last_read_inbox_message_id.get();
|
last = d->last_read_inbox_message_id.get();
|
||||||
}
|
}
|
||||||
if (last < d->last_read_outbox_message_id.get() &&
|
if (last < d->last_read_outbox_message_id.get() &&
|
||||||
d->last_read_outbox_message_id.get() <= (d->last_new_message_id.get() | MessageId::FULL_TYPE_MASK)) {
|
d->last_read_outbox_message_id.get() < d->last_new_message_id.get_next_server_message_id().get()) {
|
||||||
last = d->last_read_outbox_message_id.get();
|
last = d->last_read_outbox_message_id.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
int64 base = (last + MessageId::TYPE_MASK + 1) & ~MessageId::TYPE_MASK;
|
d->last_assigned_message_id = MessageId(last).get_next_message_id(type);
|
||||||
d->last_assigned_message_id = MessageId(base + type);
|
|
||||||
if (d->last_assigned_message_id.get() > MessageId::max().get()) {
|
if (d->last_assigned_message_id.get() > MessageId::max().get()) {
|
||||||
LOG(FATAL) << "Force restart because of message_id overflow: " << d->last_assigned_message_id;
|
LOG(FATAL) << "Force restart because of message_id overflow: " << d->last_assigned_message_id;
|
||||||
}
|
}
|
||||||
@ -21878,11 +21877,11 @@ MessageId MessagesManager::get_next_message_id(Dialog *d, int32 type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MessageId MessagesManager::get_next_yet_unsent_message_id(Dialog *d) {
|
MessageId MessagesManager::get_next_yet_unsent_message_id(Dialog *d) {
|
||||||
return get_next_message_id(d, MessageId::TYPE_YET_UNSENT);
|
return get_next_message_id(d, MessageType::YetUnsent);
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageId MessagesManager::get_next_local_message_id(Dialog *d) {
|
MessageId MessagesManager::get_next_local_message_id(Dialog *d) {
|
||||||
return get_next_message_id(d, MessageId::TYPE_LOCAL);
|
return get_next_message_id(d, MessageType::Local);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesManager::fail_send_message(FullMessageId full_message_id, int error_code, const string &error_message) {
|
void MessagesManager::fail_send_message(FullMessageId full_message_id, int error_code, const string &error_message) {
|
||||||
@ -21907,10 +21906,12 @@ void MessagesManager::fail_send_message(FullMessageId full_message_id, int error
|
|||||||
// dump_debug_message_op(d, 5);
|
// dump_debug_message_op(d, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto new_message_id = MessageId(old_message_id.get() - MessageId::TYPE_YET_UNSENT + MessageId::TYPE_LOCAL);
|
auto new_message_id = old_message_id.get_next_message_id(MessageType::Local); // trying to not change message place
|
||||||
if (get_message_force(d, new_message_id, "fail_send_message") != nullptr ||
|
if (get_message_force(d, new_message_id, "fail_send_message") != nullptr ||
|
||||||
d->deleted_message_ids.count(new_message_id) || new_message_id.get() <= d->last_clear_history_message_id.get()) {
|
d->deleted_message_ids.count(new_message_id) || new_message_id.get() <= d->last_clear_history_message_id.get()) {
|
||||||
new_message_id = get_next_local_message_id(d);
|
new_message_id = get_next_local_message_id(d);
|
||||||
|
} else if (new_message_id.get() > d->last_assigned_message_id.get()) {
|
||||||
|
d->last_assigned_message_id = new_message_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
message->message_id = new_message_id;
|
message->message_id = new_message_id;
|
||||||
|
@ -2237,7 +2237,7 @@ class MessagesManager : public Actor {
|
|||||||
|
|
||||||
Dialog *get_service_notifications_dialog();
|
Dialog *get_service_notifications_dialog();
|
||||||
|
|
||||||
static MessageId get_next_message_id(Dialog *d, int32 type);
|
static MessageId get_next_message_id(Dialog *d, MessageType type);
|
||||||
|
|
||||||
static MessageId get_next_local_message_id(Dialog *d);
|
static MessageId get_next_local_message_id(Dialog *d);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user