Skip to content

Write cache files atomically #1544

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 22, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dhall/dhall.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ Library
aeson >= 1.0.0.0 && < 1.5 ,
aeson-pretty < 0.9 ,
ansi-terminal >= 0.6.3.1 && < 0.11,
atomic-write >= 0.2.0.7 && < 0.3 ,
bytestring < 0.11,
case-insensitive < 1.3 ,
cborg >= 0.2.0.0 && < 0.3 ,
Expand Down
21 changes: 11 additions & 10 deletions dhall/src/Dhall/Import.hs
Original file line number Diff line number Diff line change
Expand Up @@ -179,18 +179,18 @@ import Dhall.Import.Types
import Dhall.Parser (Parser(..), ParseError(..), Src(..), SourcedException(..))
import Lens.Family.State.Strict (zoom)

import qualified Codec.CBOR.Encoding as Encoding
import qualified Codec.CBOR.Write as Write
import qualified Codec.CBOR.Encoding as Encoding
import qualified Codec.CBOR.Write as Write
import qualified Codec.Serialise
import qualified Control.Monad.Trans.Maybe as Maybe
import qualified Control.Monad.Trans.State.Strict as State
import qualified Control.Monad.Trans.Maybe as Maybe
import qualified Control.Monad.Trans.State.Strict as State
import qualified Data.ByteString
import qualified Data.ByteString.Lazy
import qualified Data.CaseInsensitive
import qualified Data.Foldable
import qualified Data.List.NonEmpty as NonEmpty
import qualified Data.List.NonEmpty as NonEmpty
import qualified Data.Text.Encoding
import qualified Data.Text as Text
import qualified Data.Text as Text
import qualified Data.Text.IO
import qualified Dhall.Binary
import qualified Dhall.Core
Expand All @@ -199,11 +199,12 @@ import qualified Dhall.Map
import qualified Dhall.Parser
import qualified Dhall.Pretty.Internal
import qualified Dhall.TypeCheck
import qualified System.AtomicWrite.Writer.ByteString.Binary as AtomicWrite.Binary
import qualified System.Environment
import qualified System.Info
import qualified System.IO
import qualified System.Directory as Directory
import qualified System.FilePath as FilePath
import qualified System.Directory as Directory
import qualified System.FilePath as FilePath
import qualified Text.Megaparsec
import qualified Text.Parser.Combinators
import qualified Text.Parser.Token
Expand Down Expand Up @@ -554,7 +555,7 @@ writeToSemanticCache :: Dhall.Crypto.SHA256Digest -> Data.ByteString.ByteString
writeToSemanticCache hash bytes = do
_ <- Maybe.runMaybeT $ do
cacheFile <- getCacheFile "dhall" hash
liftIO (Data.ByteString.writeFile cacheFile bytes)
liftIO (AtomicWrite.Binary.atomicWriteFile cacheFile bytes)
return ()

-- Check the "semi-semantic" disk cache, otherwise typecheck and normalise from
Expand Down Expand Up @@ -669,7 +670,7 @@ writeToSemisemanticCache :: Dhall.Crypto.SHA256Digest -> Data.ByteString.ByteStr
writeToSemisemanticCache semisemanticHash bytes = do
_ <- Maybe.runMaybeT $ do
cacheFile <- getCacheFile "dhall-haskell" semisemanticHash
liftIO (Data.ByteString.writeFile cacheFile bytes)
liftIO (AtomicWrite.Binary.atomicWriteFile cacheFile bytes)
return ()

-- Fetch source code directly from disk/network
Expand Down
17 changes: 17 additions & 0 deletions nix/atomic-write.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{ mkDerivation, base, bytestring, directory, filepath, hspec
, stdenv, temporary, text, unix-compat
}:
mkDerivation {
pname = "atomic-write";
version = "0.2.0.7";
sha256 = "b5f5c77884bc0332306fab89acf1c8a8582d76eabaa303c91b1c4072621c960d";
libraryHaskellDepends = [
base bytestring directory filepath temporary text unix-compat
];
testHaskellDepends = [
base bytestring filepath hspec temporary text unix-compat
];
homepage = "https://github.com/stackbuilders/atomic-write";
description = "Atomically write to a file";
license = stdenv.lib.licenses.mit;
}
1 change: 1 addition & 0 deletions stack-lts-6.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ extra-deps:
- aeson-pretty-0.8.7
- ansi-terminal-0.9.1
- ansi-wl-pprint-0.6.8.2
- atomic-write-0.2.0.7@sha256:3b626dfbc288cd070f1ac31b1c15ddd49822a923778ffe21f92b2116ffc72dc3,4584
- attoparsec-0.13.2.2
- base-compat-0.10.5
- base-orphans-0.8.1
Expand Down
1 change: 1 addition & 0 deletions stack.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ extra-deps:
- lsp-test-0.6.1.0@sha256:df0fc403c03b6d036be13de3ff23d9951ae2506080135cd6862eded2c969a6da,3483
- aeson-yaml-1.0.4.0@sha256:72d91a4a2ade87b8a4bdf73937d2c62bd2c60053df1841f8bf1e6204387959b8,1975
- prettyprinter-1.5.1@sha256:fca87c3e2611d3499a0341a59857e9b424a23f31646e4737d535a18582284f96,5375
- atomic-write-0.2.0.7@sha256:3b626dfbc288cd070f1ac31b1c15ddd49822a923778ffe21f92b2116ffc72dc3,4584
nix:
packages:
- ncurses
Expand Down