packages feed

glean-0.1.0.0: glean/hs/Glean/Backend/Retry.hs

{-
  Copyright (c) Meta Platforms, Inc. and affiliates.
  All rights reserved.

  This source code is licensed under the BSD-style license found in the
  LICENSE file in the root directory of this source tree.
-}

module Glean.Backend.Retry
  ( RetryWritesBackend(..)
  , backendRetryWrites
  , RetryReadsBackend(..)
  , backendRetryReads
  ) where

import Glean.Backend.Types
import Glean.Util.RetryChannelException
import Glean.Util.Some

data RetryWritesBackend = RetryWritesBackend RetryPolicy (Some Backend)

-- | Make a 'Backend' that will retry all write-related operations
-- according to the given 'RetryPolicy'
backendRetryWrites :: Backend b => b -> RetryPolicy -> RetryWritesBackend
backendRetryWrites backend policy = RetryWritesBackend policy (Some backend)

instance Backend RetryWritesBackend where
  queryFact (RetryWritesBackend _ backend) = queryFact backend
  factIdRange (RetryWritesBackend _ backend) = factIdRange backend
  getSchemaInfo (RetryWritesBackend _ backend) = getSchemaInfo backend
  validateSchema (RetryWritesBackend _ backend) = validateSchema backend
  predicateStats (RetryWritesBackend _ backend) = predicateStats backend
  listDatabases (RetryWritesBackend _ backend) = listDatabases backend
  getDatabase (RetryWritesBackend _ backend) = getDatabase backend
  userQueryFacts (RetryWritesBackend _ backend) = userQueryFacts backend
  userQuery (RetryWritesBackend _ backend) = userQuery backend
  userQueryBatch (RetryWritesBackend _ backend) = userQueryBatch backend
  deriveStored (RetryWritesBackend _ backend) = deriveStored backend

  kickOffDatabase (RetryWritesBackend policy backend) kickOff =
    retryChannelExceptions policy $ kickOffDatabase backend kickOff
  finishDatabase (RetryWritesBackend policy backend) repo =
    retryChannelExceptions policy $ finishDatabase backend repo
  finalizeDatabase (RetryWritesBackend policy backend) repo =
    retryChannelExceptions policy $ finalizeDatabase backend repo
  updateProperties (RetryWritesBackend policy backend) repo props vals =
    retryChannelExceptions policy $ updateProperties backend repo props vals
  completePredicates_ (RetryWritesBackend policy backend) repo preds =
    retryChannelExceptions policy $ completePredicates_ backend repo preds

  restoreDatabase (RetryWritesBackend _ backend) = restoreDatabase backend
  deleteDatabase (RetryWritesBackend _ backend) = deleteDatabase backend

  enqueueBatch (RetryWritesBackend policy backend) batch =
    retryChannelExceptions policy $ enqueueBatch backend batch
  enqueueJsonBatch (RetryWritesBackend policy backend) repo batch =
    retryChannelExceptions policy $ enqueueJsonBatch backend repo batch
  enqueueBatchDescriptor (RetryWritesBackend policy backend)
    repo batch waitPolicy =
      retryChannelExceptions policy
        $ enqueueBatchDescriptor backend repo batch waitPolicy
  pollBatch (RetryWritesBackend policy backend) handle =
    retryChannelExceptions policy $ pollBatch backend handle

  displayBackend (RetryWritesBackend _ backend) = displayBackend backend
  hasDatabase (RetryWritesBackend _ backend) = hasDatabase backend
  schemaId (RetryWritesBackend _ backend) = schemaId backend
  usingShards (RetryWritesBackend _ backend) = usingShards backend
  initGlobalState (RetryWritesBackend _ backend) = initGlobalState backend

data RetryReadsBackend = RetryReadsBackend RetryPolicy (Some Backend)

-- | Make a 'Backend' that will retry all read-related operations
-- according to the given 'RetryPolicy'
backendRetryReads :: Backend b => b -> RetryPolicy -> RetryReadsBackend
backendRetryReads backend policy = RetryReadsBackend policy (Some backend)

instance Backend RetryReadsBackend where
  queryFact (RetryReadsBackend policy backend) repo id =
    retryChannelExceptions policy $ queryFact backend repo id
  factIdRange (RetryReadsBackend policy backend) repo =
    retryChannelExceptions policy $ factIdRange backend repo
  getSchemaInfo (RetryReadsBackend policy backend) repo opts =
    retryChannelExceptions policy $ getSchemaInfo backend repo opts
  validateSchema (RetryReadsBackend policy backend) req =
    retryChannelExceptions policy $ validateSchema backend req
  predicateStats (RetryReadsBackend policy backend) repo opts =
    retryChannelExceptions policy $ predicateStats backend repo opts
  listDatabases (RetryReadsBackend policy backend) req =
    retryChannelExceptions policy $ listDatabases backend req
  getDatabase (RetryReadsBackend policy backend) repo =
    retryChannelExceptions policy $ getDatabase backend repo
  userQueryFacts (RetryReadsBackend policy backend) repo req =
    retryChannelExceptions policy $ userQueryFacts backend repo req
  userQuery (RetryReadsBackend policy backend) repo req =
    retryChannelExceptions policy $ userQuery backend repo req
  userQueryBatch (RetryReadsBackend policy backend) repo req =
    retryChannelExceptions policy $ userQueryBatch backend repo req
  deriveStored (RetryReadsBackend _ backend) = deriveStored backend

  kickOffDatabase (RetryReadsBackend _ backend) = kickOffDatabase backend
  finishDatabase (RetryReadsBackend _ backend) = finishDatabase backend
  finalizeDatabase (RetryReadsBackend _ backend) = finalizeDatabase backend
  updateProperties (RetryReadsBackend _ backend) = updateProperties backend
  completePredicates_ (RetryReadsBackend _ backend) =
    completePredicates_ backend

  restoreDatabase (RetryReadsBackend _ backend) = restoreDatabase backend
  deleteDatabase (RetryReadsBackend _ backend) = deleteDatabase backend

  enqueueBatch (RetryReadsBackend _ backend) = enqueueBatch backend
  enqueueJsonBatch (RetryReadsBackend _ backend) = enqueueJsonBatch backend
  enqueueBatchDescriptor (RetryReadsBackend _ backend) =
    enqueueBatchDescriptor backend
  pollBatch (RetryReadsBackend _ backend) = pollBatch backend

  displayBackend (RetryReadsBackend _ backend) = displayBackend backend
  hasDatabase (RetryReadsBackend _ backend) = hasDatabase backend
  schemaId (RetryReadsBackend _ backend) = schemaId backend
  usingShards (RetryReadsBackend _ backend) = usingShards backend
  initGlobalState (RetryReadsBackend _ backend) = initGlobalState backend