feat: only update changed updates state (i.e. dont save pts if it hasnt changed)

This commit is contained in:
teidesu 2021-05-21 00:24:54 +03:00
parent 2660120e8f
commit c3fce178b6
3 changed files with 50 additions and 12 deletions

View file

@ -2981,6 +2981,10 @@ export class TelegramClient extends BaseTelegramClient {
protected _updLock: AsyncLock protected _updLock: AsyncLock
protected _pts: number protected _pts: number
protected _date: number protected _date: number
protected _seq: number
protected _oldPts: number
protected _oldDate: number
protected _oldSeq: number
protected _cpts: Record<number, number> protected _cpts: Record<number, number>
protected _cptsMod: Record<number, number> protected _cptsMod: Record<number, number>
constructor(opts: BaseTelegramClient.Options) { constructor(opts: BaseTelegramClient.Options) {

View file

@ -27,6 +27,12 @@ interface UpdatesState {
_date: number _date: number
_seq: number _seq: number
// old values of the updates statej (i.e. as in DB)
// used to avoid redundant storage calls
_oldPts: number
_oldDate: number
_oldSeq: number
_cpts: Record<number, number> _cpts: Record<number, number>
_cptsMod: Record<number, number> _cptsMod: Record<number, number>
} }
@ -70,11 +76,11 @@ export async function _fetchUpdatesState(this: TelegramClient): Promise<void> {
export async function _loadStorage(this: TelegramClient): Promise<void> { export async function _loadStorage(this: TelegramClient): Promise<void> {
// load updates state from the session // load updates state from the session
await this.storage.load?.() await this.storage.load?.()
const state = await this.storage.getCommonPts() const state = await this.storage.getUpdatesState()
if (state) { if (state) {
this._pts = state[0] this._pts = this._oldPts = state[0]
this._date = state[1] this._date = this._oldDate = state[1]
this._seq = state[2] this._seq = this._oldSeq = state[2]
} }
// if no state, don't bother initializing properties // if no state, don't bother initializing properties
// since that means that there is no authorization, // since that means that there is no authorization,
@ -96,7 +102,19 @@ export async function _saveStorage(this: TelegramClient): Promise<void> {
try { try {
// before any authorization pts will be undefined // before any authorization pts will be undefined
if (this._pts !== undefined) { if (this._pts !== undefined) {
await this.storage.setCommonPts([this._pts, this._date, this._seq]) // if old* value is not available, assume it has changed.
if (this._oldPts === undefined || this._oldPts !== this._pts)
await this.storage.setUpdatesPts(this._pts)
if (this._oldDate === undefined || this._oldDate !== this._date)
await this.storage.setUpdatesDate(this._date)
if (this._oldSeq === undefined || this._oldSeq !== this._seq)
await this.storage.setUpdatesSeq(this._seq)
// update old* values
this._oldPts = this._pts
this._oldDate = this._date
this._oldSeq = this._seq
await this.storage.setManyChannelPts(this._cptsMod) await this.storage.setManyChannelPts(this._cptsMod)
this._cptsMod = {} this._cptsMod = {}
} }
@ -426,7 +444,12 @@ export function _handleUpdate(
// https://t.me/tdlibchat/5843 // https://t.me/tdlibchat/5843
const nextLocalSeq = this._seq + 1 const nextLocalSeq = this._seq + 1
debug('received %s (seq_start=%d, seq_end=%d)', update._, seqStart, update.seq) debug(
'received %s (seq_start=%d, seq_end=%d)',
update._,
seqStart,
update.seq
)
if (nextLocalSeq > seqStart) if (nextLocalSeq > seqStart)
// "the updates were already applied, and must be ignored" // "the updates were already applied, and must be ignored"

View file

@ -103,17 +103,28 @@ export interface ITelegramStorage {
getPeerByPhone(phone: string): MaybeAsync<tl.TypeInputPeer | null> getPeerByPhone(phone: string): MaybeAsync<tl.TypeInputPeer | null>
/** /**
* Get common `pts`, `date` and `seq` values (if available) * Get updates state (if available), represented as a tuple
* containing: `pts, date, seq`
*/ */
getCommonPts(): MaybeAsync<[number, number, number] | null> getUpdatesState(): MaybeAsync<[number, number, number] | null>
/**
* Set common `pts` value
*/
setUpdatesPts(val: number): MaybeAsync<void>
/**
* Set updates `date` value
*/
setUpdatesDate(val: number): MaybeAsync<void>
/**
* Set updates `seq` value
*/
setUpdatesSeq(val: number): MaybeAsync<void>
/** /**
* Get channel `pts` value * Get channel `pts` value
*/ */
getChannelPts(entityId: number): MaybeAsync<number | null> getChannelPts(entityId: number): MaybeAsync<number | null>
/**
* Set common `pts`, `date` and `seq` values
*/
setCommonPts(val: [number, number, number]): MaybeAsync<void>
/** /**
* Set channels `pts` values in batch. * Set channels `pts` values in batch.
* Storage is supposed to replace stored channel `pts` values * Storage is supposed to replace stored channel `pts` values