Skip to content

Commit 3cd439f

Browse files
Add lock to .daml folder for package db (#21180) (#21277)
* Add lock to .daml folder for package db * Fix import * Move sdk version check/cache hit into the lock
1 parent 55ef166 commit 3cd439f

File tree

7 files changed

+89
-62
lines changed

7 files changed

+89
-62
lines changed

sdk/compiler/damlc/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ da_haskell_library(
185185
"either",
186186
"extra",
187187
"file-embed",
188+
"filelock",
188189
"filepath",
189190
"ghcide",
190191
"ghc-lib",

sdk/compiler/damlc/lib/DA/Cli/Damlc.hs

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ import DA.Cli.Damlc.Command.MultiIde (runMultiIde)
6464
import DA.Cli.Damlc.Command.UpgradeCheck (runUpgradeCheck)
6565
import qualified DA.Daml.Dar.Reader as InspectDar
6666
import qualified DA.Cli.Damlc.Command.Damldoc as Damldoc
67-
import DA.Cli.Damlc.Packaging (createProjectPackageDb, mbErr)
68-
import DA.Cli.Damlc.DependencyDb (installDependencies)
67+
import DA.Cli.Damlc.Packaging (setupPackageDb, setupPackageDbFromPackageConfig, mbErr)
6968
import DA.Cli.Damlc.Test (CoveragePaths(..),
7069
LoadCoverageOnly(..),
7170
RunAllTests(..),
@@ -825,22 +824,8 @@ installDepsAndInitPackageDb opts (InitPkgDb shouldInit) =
825824
isProject <- withPackageConfig defaultProjectPath (const $ pure True) `catch` (\(_ :: ConfigError) -> pure False)
826825
when isProject $ do
827826
projRoot <- getCurrentDirectory
828-
withPackageConfig defaultProjectPath $ \PackageConfigFields {..} -> do
829-
damlAssistantIsSet <- damlAssistantIsSet
830-
releaseVersion <- if damlAssistantIsSet
831-
then do
832-
damlPath <- getDamlPath
833-
damlEnv <- getDamlEnv damlPath (LookForProjectPath False)
834-
wrapErr "installing dependencies and initializing package database" $
835-
resolveReleaseVersionUnsafe (envUseCache damlEnv) pSdkVersion
836-
else pure (unsafeResolveReleaseVersion pSdkVersion)
837-
installDependencies
838-
(toNormalizedFilePath' projRoot)
839-
opts
840-
releaseVersion
841-
pDependencies
842-
pDataDependencies
843-
createProjectPackageDb (toNormalizedFilePath' projRoot) opts pModulePrefixes
827+
withPackageConfig defaultProjectPath $
828+
setupPackageDbFromPackageConfig (toNormalizedFilePath' projRoot) opts
844829

845830
getMultiPackagePath :: MultiPackageLocation -> Maybe FilePath -> IO (Maybe ProjectPath)
846831
getMultiPackagePath multiPackageLocation searchPath =
@@ -1425,8 +1410,7 @@ execDocTest opts scriptDar (ImportSource importSource) files =
14251410
wrapErr "running doc test" $
14261411
resolveReleaseVersionUnsafe (envUseCache damlEnv) SdkVersion.Class.unresolvedBuiltinSdkVersion
14271412
else pure (unsafeResolveReleaseVersion SdkVersion.Class.unresolvedBuiltinSdkVersion)
1428-
installDependencies "." opts releaseVersion [scriptDar] []
1429-
createProjectPackageDb "." opts mempty
1413+
setupPackageDb "." opts releaseVersion [scriptDar] [] mempty
14301414

14311415
opts <- pure opts
14321416
{ optPackageDbs = projectPackageDatabase : optPackageDbs opts

sdk/compiler/damlc/lib/DA/Cli/Damlc/DependencyDb.hs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module DA.Cli.Damlc.DependencyDb
88
, mainMarker
99
, depMarker
1010
, dataDepMarker
11+
, packageDbLockPath
1112
) where
1213

1314
import qualified "zip-archive" Codec.Archive.Zip as ZipArchive
@@ -93,8 +94,11 @@ dependenciesDir opts projRoot =
9394
fromNormalizedFilePath projRoot </> projectDependenciesDatabase </>
9495
lfVersionString (optDamlLfVersion opts)
9596

96-
lockFile :: FilePath
97-
lockFile = "daml.lock"
97+
packageDbLockPath :: NormalizedFilePath -> FilePath
98+
packageDbLockPath projRoot = fromNormalizedFilePath projRoot </> damlArtifactDir </> "setup-package-db.lock"
99+
100+
remotePackagesLockFile :: FilePath
101+
remotePackagesLockFile = "daml.lock"
98102

99103
fingerprintFile :: FilePath
100104
fingerprintFile = "fingerprint.json"
@@ -338,11 +342,11 @@ resolvePkgs projRoot opts pkgs
338342
| FullPkgName {pkgName, pkgVersion} <- missing
339343
]
340344
Right result -> do
341-
writeLockFile lockFile result
345+
writeLockFile remotePackagesLockFile result
342346
pure result
343347
where
344348
depsDir = dependenciesDir opts projRoot
345-
lockFp = fromNormalizedFilePath projRoot </> lockFile
349+
lockFp = fromNormalizedFilePath projRoot </> remotePackagesLockFile
346350

347351
writeLockFile :: FilePath -> M.Map FullPkgName LF.PackageId -> IO ()
348352
writeLockFile lockFp resolvedPkgs = do

sdk/compiler/damlc/lib/DA/Cli/Damlc/Packaging.hs

Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
module DA.Cli.Damlc.Packaging
77
( createProjectPackageDb
8+
, setupPackageDb
9+
, setupPackageDbFromPackageConfig
810
, mbErr
911
, getUnitId
1012

@@ -43,27 +45,35 @@ import qualified Module as GHC
4345
import qualified "ghc-lib-parser" Packages as GHC
4446
import System.Directory.Extra (copyFile, createDirectoryIfMissing, listFilesRecursive, removePathForcibly)
4547
import System.Exit
48+
import System.FileLock
4649
import System.FilePath
4750
import System.IO.Extra (hFlush, hPutStrLn, stderr, writeFileUTF8)
4851
import System.Info.Extra
4952
import System.Process (callProcess)
5053
import "ghc-lib-parser" UniqSet
5154

5255
import DA.Bazel.Runfiles
56+
import DA.Cli.Damlc.DependencyDb
57+
import DA.Daml.Assistant.Env (getDamlEnv, getDamlPath, envUseCache)
58+
import DA.Daml.Assistant.Types (LookForProjectPath (..))
59+
import DA.Daml.Assistant.Util (wrapErr)
60+
import DA.Daml.Assistant.Version (resolveReleaseVersionUnsafe)
5361
import DA.Daml.Compiler.Dar
5462
import DA.Daml.Compiler.DataDependencies as DataDeps
5563
import DA.Daml.Compiler.DecodeDar (DecodedDalf(..), decodeDalf)
5664
import DA.Daml.Compiler.Output
57-
import qualified DA.Daml.LF.Ast as LF
5865
import DA.Daml.LF.Ast.Optics (packageRefs)
59-
import qualified DA.Daml.LFConversion.MetadataEncoding as LFC
6066
import DA.Daml.Options.Packaging.Metadata
6167
import DA.Daml.Options.Types
62-
import DA.Cli.Damlc.DependencyDb
63-
import qualified DA.Pretty
64-
import qualified DA.Service.Logger as Logger
68+
import DA.Daml.Package.Config (PackageConfigFields (..))
69+
import DA.Daml.Project.Consts (damlAssistantIsSet)
70+
import DA.Daml.Project.Types (ReleaseVersion, unsafeResolveReleaseVersion)
6571
import Development.IDE.Core.IdeState.Daml
6672
import Development.IDE.Core.RuleTypes.Daml
73+
import qualified DA.Daml.LF.Ast as LF
74+
import qualified DA.Daml.LFConversion.MetadataEncoding as LFC
75+
import qualified DA.Pretty
76+
import qualified DA.Service.Logger as Logger
6777
import SdkVersion.Class (SdkVersioned, damlStdlib)
6878

6979
-- | Create the project package database containing the given dar packages.
@@ -945,3 +955,58 @@ prefixModules prefixes dalfs = do
945955
( prefix
946956
, NM.names . LF.packageModules . LF.extPackagePkg $ LF.dalfPackagePkg pkg
947957
)
958+
959+
unsafeSetupPackageDb
960+
:: SdkVersioned
961+
=> NormalizedFilePath
962+
-> Options
963+
-> ReleaseVersion
964+
-> [String] -- Package dependencies. Can be base-packages, sdk-packages or filepath.
965+
-> [FilePath] -- Data Dependencies. Can be filepath to dars/dalfs.
966+
-> MS.Map UnitId GHC.ModuleName
967+
-> IO ()
968+
unsafeSetupPackageDb projRoot opts releaseVersion pDependencies pDataDependencies pModulePrefixes = do
969+
installDependencies
970+
projRoot
971+
opts
972+
releaseVersion
973+
pDependencies
974+
pDataDependencies
975+
createProjectPackageDb projRoot opts pModulePrefixes
976+
977+
withPkgDbLock :: NormalizedFilePath -> IO a -> IO a
978+
withPkgDbLock projRoot act = do
979+
let packageDbLockFile = packageDbLockPath projRoot
980+
createDirectoryIfMissing True $ takeDirectory packageDbLockFile
981+
withFileLock packageDbLockFile Exclusive $ const act
982+
983+
-- Installs dependencies and creates package Db ready to be used
984+
setupPackageDb
985+
:: SdkVersioned
986+
=> NormalizedFilePath
987+
-> Options
988+
-> ReleaseVersion
989+
-> [String] -- Package dependencies. Can be base-packages, sdk-packages or filepath.
990+
-> [FilePath] -- Data Dependencies. Can be filepath to dars/dalfs.
991+
-> MS.Map UnitId GHC.ModuleName
992+
-> IO ()
993+
setupPackageDb projRoot opts releaseVersion pDependencies pDataDependencies pModulePrefixes =
994+
withPkgDbLock projRoot $ unsafeSetupPackageDb projRoot opts releaseVersion pDependencies pDataDependencies pModulePrefixes
995+
996+
setupPackageDbFromPackageConfig
997+
:: SdkVersioned
998+
=> NormalizedFilePath
999+
-> Options
1000+
-> PackageConfigFields
1001+
-> IO ()
1002+
setupPackageDbFromPackageConfig projRoot opts PackageConfigFields {..} =
1003+
withPkgDbLock projRoot $ do
1004+
damlAssistantIsSet <- damlAssistantIsSet
1005+
releaseVersion <- if damlAssistantIsSet
1006+
then do
1007+
damlPath <- getDamlPath
1008+
damlEnv <- getDamlEnv damlPath (LookForProjectPath False)
1009+
wrapErr "installing dependencies and initializing package database" $
1010+
resolveReleaseVersionUnsafe (envUseCache damlEnv) pSdkVersion
1011+
else pure (unsafeResolveReleaseVersion pSdkVersion)
1012+
unsafeSetupPackageDb projRoot opts releaseVersion pDependencies pDataDependencies pModulePrefixes

sdk/compiler/damlc/tests/src/DA/Test/DamlcIntegration.hs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,7 @@ import Test.Tasty.Options
9494
import Test.Tasty.Providers
9595
import Test.Tasty.Runners (Result(..))
9696

97-
import DA.Cli.Damlc.DependencyDb (installDependencies)
98-
import DA.Cli.Damlc.Packaging (createProjectPackageDb)
97+
import DA.Cli.Damlc.Packaging (setupPackageDb)
9998
import Module (stringToUnitId)
10099
import SdkVersion (SdkVersioned, withSdkVersions, sdkVersion, sdkPackageVersion)
101100

@@ -152,15 +151,12 @@ withVersionedDamlScriptDep packageFlagName darPath mLfVer extraPackages cont = d
152151

153152
extraDars <- traverse (\(darName, _, _) -> locateRunfiles $ mainWorkspace </> "compiler" </> "damlc" </> "tests" </> darName <> ".dar") extraPackages
154153

155-
installDependencies
154+
setupPackageDb
156155
projDir
157156
(defaultOptions mLfVer)
158157
(unsafeResolveReleaseVersion (either throw id (parseUnresolvedVersion (T.pack sdkVersion))))
159158
["daml-prim", "daml-stdlib", scriptDar]
160159
extraDars
161-
createProjectPackageDb
162-
projDir
163-
(defaultOptions mLfVer)
164160
mempty
165161

166162
cont (dir </> projectPackageDatabase, packageFlags)

sdk/compiler/damlc/tests/src/DA/Test/ScriptService.hs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import Control.Exception
99
import Control.Monad
1010
import DA.Bazel.Runfiles
1111
import DA.Cli.Damlc.Packaging
12-
import DA.Cli.Damlc.DependencyDb
1312
import qualified DA.Daml.LF.Ast.Version as LF
1413
import DA.Daml.LF.PrettyScript (prettyScriptError, prettyScriptResult)
1514
import qualified DA.Daml.LF.ScriptServiceClient as SS
@@ -97,19 +96,8 @@ withScriptService lfVersion action =
9796
"- daml-stdlib",
9897
"- " <> show scriptDar
9998
]
100-
withPackageConfig (ProjectPath ".") $ \PackageConfigFields {..} -> do
101-
let projDir = toNormalizedFilePath' dir
102-
installDependencies
103-
projDir
104-
(options lfVersion)
105-
(unsafeResolveReleaseVersion pSdkVersion)
106-
pDependencies
107-
pDataDependencies
108-
createProjectPackageDb
109-
projDir
110-
(options lfVersion)
111-
pModulePrefixes
112-
99+
withPackageConfig (ProjectPath ".") $
100+
setupPackageDbFromPackageConfig (toNormalizedFilePath' dir) $ options lfVersion
113101
logger <- Logger.newStderrLogger Logger.Debug "script-service"
114102

115103
-- Spinning up the script service is expensive so we do it once at the beginning.

sdk/compiler/damlc/tests/src/DA/Test/ScriptService_1_15.hs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import Control.Exception
99
import Control.Monad
1010
import DA.Bazel.Runfiles
1111
import DA.Cli.Damlc.Packaging
12-
import DA.Cli.Damlc.DependencyDb
1312
import qualified DA.Daml.LF.Ast.Version as LF
1413
import DA.Daml.LF.PrettyScenario (prettyScenarioError, prettyScenarioResult)
1514
import qualified DA.Daml.LF.ScriptServiceClient as SS
@@ -65,18 +64,8 @@ main = withSdkVersions $ do
6564
"- daml-stdlib",
6665
"- " <> show scriptDar
6766
]
68-
withPackageConfig (ProjectPath ".") $ \PackageConfigFields {..} -> do
69-
let projDir = toNormalizedFilePath' dir
70-
installDependencies
71-
projDir
72-
options
73-
(unsafeResolveReleaseVersion pSdkVersion)
74-
pDependencies
75-
pDataDependencies
76-
createProjectPackageDb
77-
projDir
78-
options
79-
pModulePrefixes
67+
withPackageConfig (ProjectPath ".") $
68+
setupPackageDbFromPackageConfig (toNormalizedFilePath' dir) options
8069

8170
logger <- Logger.newStderrLogger Logger.Debug "script-service"
8271

0 commit comments

Comments
 (0)