mirror of https://github.com/procxx/kepka.git
				
				
				
			Use precise sync of the server unixtime.
This commit is contained in:
		
							parent
							
								
									297b5d6a76
								
							
						
					
					
						commit
						7883f97c94
					
				| 
						 | 
					@ -40,6 +40,7 @@ constexpr auto kTestModeDcIdShift = 10000;
 | 
				
			||||||
constexpr auto kCheckSentRequestsEach = 1 * crl::time(1000);
 | 
					constexpr auto kCheckSentRequestsEach = 1 * crl::time(1000);
 | 
				
			||||||
constexpr auto kKeyOldEnoughForDestroy = 60 * crl::time(1000);
 | 
					constexpr auto kKeyOldEnoughForDestroy = 60 * crl::time(1000);
 | 
				
			||||||
constexpr auto kSentContainerLives = 600 * crl::time(1000);
 | 
					constexpr auto kSentContainerLives = 600 * crl::time(1000);
 | 
				
			||||||
 | 
					constexpr auto kFastRequestDuration = crl::time(500);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// If we can't connect for this time we will ask _instance to update config.
 | 
					// If we can't connect for this time we will ask _instance to update config.
 | 
				
			||||||
constexpr auto kRequestConfigTimeout = 8 * crl::time(1000);
 | 
					constexpr auto kRequestConfigTimeout = 8 * crl::time(1000);
 | 
				
			||||||
| 
						 | 
					@ -57,6 +58,8 @@ constexpr auto kSendStateRequestWaiting = crl::time(1000);
 | 
				
			||||||
// How much time to wait for some more requests, when sending msg acks.
 | 
					// How much time to wait for some more requests, when sending msg acks.
 | 
				
			||||||
constexpr auto kAckSendWaiting = 10 * crl::time(1000);
 | 
					constexpr auto kAckSendWaiting = 10 * crl::time(1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					auto SyncTimeRequestDuration = kFastRequestDuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace details;
 | 
					using namespace details;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[nodiscard]] QString LogIdsVector(const QVector<MTPlong> &ids) {
 | 
					[[nodiscard]] QString LogIdsVector(const QVector<MTPlong> &ids) {
 | 
				
			||||||
| 
						 | 
					@ -1467,8 +1470,12 @@ SessionPrivate::HandleResult SessionPrivate::handleOneReceived(
 | 
				
			||||||
			return badTime ? HandleResult::Ignored : HandleResult::Success;
 | 
								return badTime ? HandleResult::Ignored : HandleResult::Success;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (badTime && !requestsFixTimeSalt(ids, serverTime, serverSalt)) {
 | 
							if (badTime) {
 | 
				
			||||||
			return HandleResult::Ignored;
 | 
								if (!requestsFixTimeSalt(ids, serverTime, serverSalt)) {
 | 
				
			||||||
 | 
									return HandleResult::Ignored;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								correctUnixtimeByFastRequest(ids, serverTime);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		requestsAcked(ids);
 | 
							requestsAcked(ids);
 | 
				
			||||||
	} return HandleResult::Success;
 | 
						} return HandleResult::Success;
 | 
				
			||||||
| 
						 | 
					@ -1520,7 +1527,8 @@ SessionPrivate::HandleResult SessionPrivate::handleOneReceived(
 | 
				
			||||||
				if (serverSalt) {
 | 
									if (serverSalt) {
 | 
				
			||||||
					_sessionSalt = serverSalt;
 | 
										_sessionSalt = serverSalt;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				base::unixtime::update(serverTime, true);
 | 
					
 | 
				
			||||||
 | 
									correctUnixtimeWithBadLocal(serverTime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				DEBUG_LOG(("Message Info: unixtime updated, now %1, resending in container...").arg(serverTime));
 | 
									DEBUG_LOG(("Message Info: unixtime updated, now %1, resending in container...").arg(serverTime));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1530,7 +1538,7 @@ SessionPrivate::HandleResult SessionPrivate::handleOneReceived(
 | 
				
			||||||
					if (serverSalt) {
 | 
										if (serverSalt) {
 | 
				
			||||||
						_sessionSalt = serverSalt;
 | 
											_sessionSalt = serverSalt;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					base::unixtime::update(serverTime, true);
 | 
										correctUnixtimeWithBadLocal(serverTime);
 | 
				
			||||||
					badTime = false;
 | 
										badTime = false;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				LOG(("Message Info: bad message notification received, msgId %1, error_code %2").arg(data.vbad_msg_id().v).arg(errorCode));
 | 
									LOG(("Message Info: bad message notification received, msgId %1, error_code %2").arg(data.vbad_msg_id().v).arg(errorCode));
 | 
				
			||||||
| 
						 | 
					@ -1580,7 +1588,7 @@ SessionPrivate::HandleResult SessionPrivate::handleOneReceived(
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		_sessionSalt = data.vnew_server_salt().v;
 | 
							_sessionSalt = data.vnew_server_salt().v;
 | 
				
			||||||
		base::unixtime::update(serverTime);
 | 
							correctUnixtimeWithBadLocal(serverTime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (setState(ConnectedState, ConnectingState)) {
 | 
							if (setState(ConnectedState, ConnectingState)) {
 | 
				
			||||||
			resendAll();
 | 
								resendAll();
 | 
				
			||||||
| 
						 | 
					@ -1612,7 +1620,7 @@ SessionPrivate::HandleResult SessionPrivate::handleOneReceived(
 | 
				
			||||||
			if (serverSalt) {
 | 
								if (serverSalt) {
 | 
				
			||||||
				_sessionSalt = serverSalt; // requestsFixTimeSalt with no lookup
 | 
									_sessionSalt = serverSalt; // requestsFixTimeSalt with no lookup
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			base::unixtime::update(serverTime, true);
 | 
								correctUnixtimeWithBadLocal(serverTime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			DEBUG_LOG(("Message Info: unixtime updated from mtpc_msgs_state_info, now %1").arg(serverTime));
 | 
								DEBUG_LOG(("Message Info: unixtime updated from mtpc_msgs_state_info, now %1").arg(serverTime));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1956,20 +1964,48 @@ mtpBuffer SessionPrivate::ungzip(const mtpPrime *from, const mtpPrime *end) cons
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool SessionPrivate::requestsFixTimeSalt(const QVector<MTPlong> &ids, int32 serverTime, uint64 serverSalt) {
 | 
					bool SessionPrivate::requestsFixTimeSalt(const QVector<MTPlong> &ids, int32 serverTime, uint64 serverSalt) {
 | 
				
			||||||
	uint32 idsCount = ids.size();
 | 
						for (const auto &id : ids) {
 | 
				
			||||||
 | 
							if (wasSent(id.v)) {
 | 
				
			||||||
	for (uint32 i = 0; i < idsCount; ++i) {
 | 
								// Found such msg_id in recent acked or in recent sent requests.
 | 
				
			||||||
		if (wasSent(ids[i].v)) {// found such msg_id in recent acked requests or in recent sent requests
 | 
					 | 
				
			||||||
			if (serverSalt) {
 | 
								if (serverSalt) {
 | 
				
			||||||
				_sessionSalt = serverSalt;
 | 
									_sessionSalt = serverSalt;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			base::unixtime::update(serverTime, true);
 | 
								correctUnixtimeWithBadLocal(serverTime);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SessionPrivate::correctUnixtimeByFastRequest(
 | 
				
			||||||
 | 
							const QVector<MTPlong> &ids,
 | 
				
			||||||
 | 
							TimeId serverTime) {
 | 
				
			||||||
 | 
						const auto now = crl::now();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						QReadLocker locker(_sessionData->haveSentMutex());
 | 
				
			||||||
 | 
						const auto &haveSent = _sessionData->haveSentMap();
 | 
				
			||||||
 | 
						for (const auto &id : ids) {
 | 
				
			||||||
 | 
							const auto i = haveSent.find(id.v);
 | 
				
			||||||
 | 
							if (i == haveSent.end()) {
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							const auto duration = (now - i->second->lastSentTime);
 | 
				
			||||||
 | 
							if (duration < 0 || duration > SyncTimeRequestDuration) {
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							locker.unlock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							SyncTimeRequestDuration = duration;
 | 
				
			||||||
 | 
							base::unixtime::update(serverTime, true);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SessionPrivate::correctUnixtimeWithBadLocal(TimeId serverTime) {
 | 
				
			||||||
 | 
						SyncTimeRequestDuration = kFastRequestDuration;
 | 
				
			||||||
 | 
						base::unixtime::update(serverTime, true);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SessionPrivate::requestsAcked(const QVector<MTPlong> &ids, bool byResponse) {
 | 
					void SessionPrivate::requestsAcked(const QVector<MTPlong> &ids, bool byResponse) {
 | 
				
			||||||
	uint32 idsCount = ids.size();
 | 
						uint32 idsCount = ids.size();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -139,6 +139,12 @@ private:
 | 
				
			||||||
	// if badTime received - search for ids in sessionData->haveSent and sessionData->wereAcked and sync time/salt, return true if found
 | 
						// if badTime received - search for ids in sessionData->haveSent and sessionData->wereAcked and sync time/salt, return true if found
 | 
				
			||||||
	bool requestsFixTimeSalt(const QVector<MTPlong> &ids, int32 serverTime, uint64 serverSalt);
 | 
						bool requestsFixTimeSalt(const QVector<MTPlong> &ids, int32 serverTime, uint64 serverSalt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// if we had a confirmed fast request use its unixtime as a correct one.
 | 
				
			||||||
 | 
						void correctUnixtimeByFastRequest(
 | 
				
			||||||
 | 
							const QVector<MTPlong> &ids,
 | 
				
			||||||
 | 
							TimeId serverTime);
 | 
				
			||||||
 | 
						void correctUnixtimeWithBadLocal(TimeId serverTime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// remove msgs with such ids from sessionData->haveSent, add to sessionData->wereAcked
 | 
						// remove msgs with such ids from sessionData->haveSent, add to sessionData->wereAcked
 | 
				
			||||||
	void requestsAcked(const QVector<MTPlong> &ids, bool byResponse = false);
 | 
						void requestsAcked(const QVector<MTPlong> &ids, bool byResponse = false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
Subproject commit 9e01ede6661e2a74697283c7836d4fae433f50ce
 | 
					Subproject commit b376282b656b13c54cd892e3c2742bb26acf42fe
 | 
				
			||||||
		Loading…
	
		Reference in New Issue