Improving types around the writethrough cache, exposing the proper typing from the database and removing a log statement which is useless, errors are correctly propogated if they matter (and handled above this level with proper context) or in the 99% scenario it is not a real error (such as try once locks already being held) and a log is just spammy.

This commit is contained in:
mike12345567 2023-12-13 15:08:23 +00:00
parent fac6646ed8
commit c4af5214ef
4 changed files with 13 additions and 13 deletions

View File

@ -1,15 +1,16 @@
import { DBTestConfiguration } from "../../../tests/extra" import { DBTestConfiguration } from "../../../tests/extra"
import { import { structures } from "../../../tests"
structures,
expectFunctionWasCalledTimesWith,
mocks,
} from "../../../tests"
import { Writethrough } from "../writethrough" import { Writethrough } from "../writethrough"
import { getDB } from "../../db" import { getDB } from "../../db"
import { Document } from "@budibase/types"
import tk from "timekeeper" import tk from "timekeeper"
tk.freeze(Date.now()) tk.freeze(Date.now())
interface ValueDoc extends Document {
value: any
}
const DELAY = 5000 const DELAY = 5000
describe("writethrough", () => { describe("writethrough", () => {
@ -117,7 +118,7 @@ describe("writethrough", () => {
describe("get", () => { describe("get", () => {
it("should be able to retrieve", async () => { it("should be able to retrieve", async () => {
await config.doInTenant(async () => { await config.doInTenant(async () => {
const response = await writethrough.get(docId) const response = await writethrough.get<ValueDoc>(docId)
expect(response.value).toBe(4) expect(response.value).toBe(4)
}) })
}) })

View File

@ -84,16 +84,16 @@ async function put(
return { ok: true, id: output._id, rev: output._rev } return { ok: true, id: output._id, rev: output._rev }
} }
async function get(db: Database, id: string): Promise<any> { async function get<T extends Document>(db: Database, id: string): Promise<T> {
const cache = await getCache() const cache = await getCache()
const cacheKey = makeCacheKey(db, id) const cacheKey = makeCacheKey(db, id)
let cacheItem: CacheItem = await cache.get(cacheKey) let cacheItem: CacheItem = await cache.get(cacheKey)
if (!cacheItem) { if (!cacheItem) {
const doc = await db.get(id) const doc = await db.get<T>(id)
cacheItem = makeCacheItem(doc) cacheItem = makeCacheItem(doc)
await cache.store(cacheKey, cacheItem) await cache.store(cacheKey, cacheItem)
} }
return cacheItem.doc return cacheItem.doc as T
} }
async function remove(db: Database, docOrId: any, rev?: any): Promise<void> { async function remove(db: Database, docOrId: any, rev?: any): Promise<void> {
@ -123,8 +123,8 @@ export class Writethrough {
return put(this.db, doc, writeRateMs) return put(this.db, doc, writeRateMs)
} }
async get(id: string) { async get<T extends Document>(id: string) {
return get(this.db, id) return get<T>(this.db, id)
} }
async remove(docOrId: any, rev?: any) { async remove(docOrId: any, rev?: any) {

View File

@ -137,7 +137,6 @@ export async function doWithLock<T>(
const result = await task() const result = await task()
return { executed: true, result } return { executed: true, result }
} catch (e: any) { } catch (e: any) {
logWarn(`lock type: ${opts.type} error`, e)
// lock limit exceeded // lock limit exceeded
if (e.name === "LockError") { if (e.name === "LockError") {
if (opts.type === LockType.TRY_ONCE) { if (opts.type === LockType.TRY_ONCE) {

@ -1 +1 @@
Subproject commit 056c2093dbc93d9a10ea9f5050c84a84edd8100c Subproject commit 3b89670d8817eee95a1ce53a35b95307ee3b8e76