mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
(core) Add caching for measuring data size in DocStorage, when data isn't changing
Summary: getDataSize() call can be expensive and involve lots of disk reading. We can avoid doing it repeatedly when the document isn't actually changing. Test Plan: Should have no change in behavior except for timings. Reviewers: georgegevoian Reviewed By: georgegevoian Differential Revision: https://phab.getgrist.com/D3605
This commit is contained in:
parent
2997434815
commit
af77824618
@ -645,6 +645,8 @@ export class DocStorage implements ISQLiteDB, OnDemandStorage {
|
|||||||
// tables (obtained from auto-generated schema.js).
|
// tables (obtained from auto-generated schema.js).
|
||||||
private _docSchema: {[tableId: string]: {[colId: string]: string}};
|
private _docSchema: {[tableId: string]: {[colId: string]: string}};
|
||||||
|
|
||||||
|
private _cachedDataSize: number|null = null;
|
||||||
|
|
||||||
public constructor(public storageManager: IDocStorageManager, public docName: string) {
|
public constructor(public storageManager: IDocStorageManager, public docName: string) {
|
||||||
this.docPath = this.storageManager.getPath(docName);
|
this.docPath = this.storageManager.getPath(docName);
|
||||||
this._db = null;
|
this._db = null;
|
||||||
@ -1518,7 +1520,20 @@ export class DocStorage implements ISQLiteDB, OnDemandStorage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the total size of data in the user + meta tables of the SQLite doc (excluding gristsys
|
||||||
|
* tables). Uses cached results if possible. Any change to data invalidates the cache, via
|
||||||
|
* _markAsChanged().
|
||||||
|
*/
|
||||||
public async getDataSize(): Promise<number> {
|
public async getDataSize(): Promise<number> {
|
||||||
|
return this._cachedDataSize ?? (this._cachedDataSize = await this.getDataSizeUncached());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Measure and return the total size of data in the user + meta tables of the SQLite doc
|
||||||
|
* (excluding gristsys tables). Note that this operation involves reading the entire database.
|
||||||
|
*/
|
||||||
|
public async getDataSizeUncached(): Promise<number> {
|
||||||
const result = await this.get(`
|
const result = await this.get(`
|
||||||
SELECT SUM(pgsize - unused) AS totalSize
|
SELECT SUM(pgsize - unused) AS totalSize
|
||||||
FROM dbstat
|
FROM dbstat
|
||||||
@ -1534,6 +1549,7 @@ export class DocStorage implements ISQLiteDB, OnDemandStorage {
|
|||||||
try {
|
try {
|
||||||
return await promise;
|
return await promise;
|
||||||
} finally {
|
} finally {
|
||||||
|
this._cachedDataSize = null;
|
||||||
this.storageManager.markAsChanged(this.docName);
|
this.storageManager.markAsChanged(this.docName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user