|
|
@@ -8,11 +8,13 @@ import {
|
|
|
prefetchingEnabled,
|
|
|
prefetchLargeEnabled,
|
|
|
trackPdfDownloadEnabled,
|
|
|
- useClsiCache,
|
|
|
+ fallBackToClsiCache,
|
|
|
} from './pdf-caching-flags'
|
|
|
import { isNetworkError } from '@/utils/is-network-error'
|
|
|
import { debugConsole } from '@/utils/debugging'
|
|
|
import { PDFJS } from './pdf-js'
|
|
|
+import { sendMB } from '@/infrastructure/event-tracking'
|
|
|
+import getMeta from '@/utils/meta'
|
|
|
|
|
|
// 30 seconds: The shutdown grace period of a clsi pre-emp instance.
|
|
|
const STALE_OUTPUT_REQUEST_THRESHOLD_MS = 30 * 1000
|
|
|
@@ -22,6 +24,7 @@ export function generatePdfCachingTransportFactory() {
|
|
|
if (!enablePdfCaching && !trackPdfDownloadEnabled) {
|
|
|
return () => undefined
|
|
|
}
|
|
|
+ const projectId = getMeta('ol-project_id')
|
|
|
const usageScore = new Map()
|
|
|
const cachedUrls = new Map()
|
|
|
const metrics = Object.assign(getPdfCachingMetrics(), {
|
|
|
@@ -59,6 +62,7 @@ export function generatePdfCachingTransportFactory() {
|
|
|
this.handleFetchError = handleFetchError
|
|
|
this.abortController = abortController
|
|
|
this.startTime = performance.now()
|
|
|
+ this.sentEventFallbackToClsiCache = false
|
|
|
|
|
|
const params = new URL(url).searchParams
|
|
|
// drop no needed params
|
|
|
@@ -72,6 +76,7 @@ export function generatePdfCachingTransportFactory() {
|
|
|
}
|
|
|
|
|
|
requestDataRange(start, end) {
|
|
|
+ let recordFallbackToClsiCache = false
|
|
|
const abortSignal = this.abortController.signal
|
|
|
const getDebugInfo = () => ({
|
|
|
// Sentry does not serialize objects in twice nested objects.
|
|
|
@@ -115,7 +120,7 @@ export function generatePdfCachingTransportFactory() {
|
|
|
)
|
|
|
}
|
|
|
const canTryFromCache = err => {
|
|
|
- if (!useClsiCache) return false
|
|
|
+ if (!fallBackToClsiCache) return false
|
|
|
if (!is404(err)) return false
|
|
|
return !usesCache(OError.getFullInfo(err).url)
|
|
|
}
|
|
|
@@ -146,6 +151,7 @@ export function generatePdfCachingTransportFactory() {
|
|
|
this.pdfFile.ranges = this.pdfFile.ranges.filter(r =>
|
|
|
cachedUrls.has(r.hash)
|
|
|
)
|
|
|
+ recordFallbackToClsiCache = true
|
|
|
return blob
|
|
|
})
|
|
|
.catch(err => {
|
|
|
@@ -177,6 +183,9 @@ export function generatePdfCachingTransportFactory() {
|
|
|
abortSignal,
|
|
|
canTryFromCache,
|
|
|
fallbackToCacheURL: getOutputPDFURLFromCache(),
|
|
|
+ recordFallbackToClsiCache: () => {
|
|
|
+ recordFallbackToClsiCache = true
|
|
|
+ },
|
|
|
})
|
|
|
.catch(err => {
|
|
|
if (abortSignal.aborted) return
|
|
|
@@ -228,6 +237,14 @@ export function generatePdfCachingTransportFactory() {
|
|
|
})
|
|
|
.then(blob => {
|
|
|
if (abortSignal.aborted) return
|
|
|
+ if (recordFallbackToClsiCache && !this.sentEventFallbackToClsiCache) {
|
|
|
+ // Record once per PDF preview. Technically we should record once per 90min (output cache age), but keep it simple for now.
|
|
|
+ this.sentEventFallbackToClsiCache = true
|
|
|
+ sendMB('fallback-to-clsi-cache', {
|
|
|
+ projectId,
|
|
|
+ ageMS: Math.ceil(performance.now() - this.startTime),
|
|
|
+ })
|
|
|
+ }
|
|
|
this.onDataRange(start, blob)
|
|
|
})
|
|
|
.catch(err => {
|