{-# LANGUAGE DataKinds #-} module TahoeLAFS.Storage.Backend ( Backend (..), ImmutableShareAlreadyWritten (ImmutableShareAlreadyWritten), writeMutableShare, ) where import Control.Exception ( Exception, throw, ) import Data.Map.Strict ( fromList, ) import qualified Data.Set as Set import Network.HTTP.Types ( ByteRanges, ) import TahoeLAFS.Storage.API ( AllocateBuckets, AllocationResult, CBOR, CBORSet (..), CorruptionDetails, LeaseSecret, Offset, QueryRange, ReadResult, ReadTestWriteResult (..), ReadTestWriteVectors (..), ShareData, ShareNumber, Size, SlotSecrets, StorageIndex, TestWriteVectors (..), Version, WriteVector (..), ) data ImmutableShareAlreadyWritten = ImmutableShareAlreadyWritten deriving (Show) instance Exception ImmutableShareAlreadyWritten class Backend b where version :: b -> IO Version -- | Update the lease expiration time on the shares associated with the -- given storage index. renewLease :: b -> StorageIndex -> [LeaseSecret] -> IO () createImmutableStorageIndex :: b -> StorageIndex -> AllocateBuckets -> IO AllocationResult -- May throw ImmutableShareAlreadyWritten writeImmutableShare :: b -> StorageIndex -> ShareNumber -> ShareData -> Maybe ByteRanges -> IO () adviseCorruptImmutableShare :: b -> StorageIndex -> ShareNumber -> CorruptionDetails -> IO () getImmutableShareNumbers :: b -> StorageIndex -> IO (CBORSet ShareNumber) readImmutableShare :: b -> StorageIndex -> ShareNumber -> QueryRange -> IO ShareData createMutableStorageIndex :: b -> StorageIndex -> AllocateBuckets -> IO AllocationResult readvAndTestvAndWritev :: b -> StorageIndex -> ReadTestWriteVectors -> IO ReadTestWriteResult readMutableShare :: b -> StorageIndex -> ShareNumber -> QueryRange -> IO ShareData getMutableShareNumbers :: b -> StorageIndex -> IO (CBORSet ShareNumber) adviseCorruptMutableShare :: b -> StorageIndex -> ShareNumber -> CorruptionDetails -> IO () writeMutableShare :: Backend b => b -> SlotSecrets -> StorageIndex -> ShareNumber -> ShareData -> Maybe ByteRanges -> IO () writeMutableShare b secrets storageIndex shareNumber shareData Nothing = do let testWriteVectors = fromList [ ( shareNumber , TestWriteVectors { test = [] , write = [ WriteVector { writeOffset = 0 , shareData = shareData } ] } ) ] let vectors = ReadTestWriteVectors { secrets = secrets , testWriteVectors = testWriteVectors , readVector = mempty } result <- readvAndTestvAndWritev b storageIndex vectors if success result then return () else throw WriteRefused writeMutableShare _ _ _ _ _ _ = error "writeMutableShare got bad input" data WriteRefused = WriteRefused deriving (Show, Eq) instance Exception WriteRefused