diff --git a/src/Grace.Actors/Branch.Actor.fs b/src/Grace.Actors/Branch.Actor.fs index ca88238..de15a67 100644 --- a/src/Grace.Actors/Branch.Actor.fs +++ b/src/Grace.Actors/Branch.Actor.fs @@ -374,6 +374,8 @@ module Branch = /// Receives a Grace reminder. member this.ReceiveReminderAsync(reminder: ReminderDto) : Task> = + this.correlationId <- reminder.CorrelationId + task { match reminder.ReminderType with | ReminderTypes.PhysicalDeletion -> diff --git a/src/Grace.Actors/Diff.Actor.fs b/src/Grace.Actors/Diff.Actor.fs index bdc4813..521fb98 100644 --- a/src/Grace.Actors/Diff.Actor.fs +++ b/src/Grace.Actors/Diff.Actor.fs @@ -230,6 +230,8 @@ module Diff = /// Receives a Grace reminder. member this.ReceiveReminderAsync(reminder: ReminderDto) : Task> = task { + this.correlationId <- reminder.CorrelationId + match reminder.ReminderType with | ReminderTypes.DeleteCachedState -> // Get values from state. diff --git a/src/Grace.Actors/DirectoryAppearance.Actor.fs b/src/Grace.Actors/DirectoryAppearance.Actor.fs index 004992d..c8a5acf 100644 --- a/src/Grace.Actors/DirectoryAppearance.Actor.fs +++ b/src/Grace.Actors/DirectoryAppearance.Actor.fs @@ -73,6 +73,7 @@ module DirectoryAppearance = /// Receives a Grace reminder. member this.ReceiveReminderAsync(reminder: ReminderDto) : Task> = + this.correlationId <- reminder.CorrelationId logToConsole $"Received a reminder: {reminder}." Ok() |> returnTask diff --git a/src/Grace.Actors/DirectoryVersion.Actor.fs b/src/Grace.Actors/DirectoryVersion.Actor.fs index 2cd0f49..3a507f4 100644 --- a/src/Grace.Actors/DirectoryVersion.Actor.fs +++ b/src/Grace.Actors/DirectoryVersion.Actor.fs @@ -177,36 +177,39 @@ module DirectoryVersion = /// Receives a Grace reminder. member this.ReceiveReminderAsync(reminder: ReminderDto) : Task> = task { + this.correlationId <- reminder.CorrelationId + match reminder.ReminderType with | ReminderTypes.DeleteCachedState -> // Get values from state. - let (deleteReason, correlationId) = deserialize reminder.State - - this.correlationId <- correlationId - - // Delete saved state for this actor. - let! deleted = Storage.DeleteState stateManager directoryVersionCacheStateName - - if deleted then - log.LogInformation( - "{CurrentInstant}: Node: {HostName}; CorrelationId: {correlationId}; Deleted cache for directory version; RepositoryId: {RepositoryId}; DirectoryVersionId: {DirectoryVersionId}; deleteReason: {deleteReason}.", - getCurrentInstantExtended (), - getMachineName, - correlationId, - directoryVersionDto.DirectoryVersion.RepositoryId, - directoryVersionDto.DirectoryVersion.DirectoryVersionId, - deleteReason - ) - else - log.LogWarning( - "{CurrentInstant}: Node: {HostName}; CorrelationId: {correlationId}; Failed to delete cache for directory version (it may have already been deleted); RepositoryId: {RepositoryId}; DirectoryVersionId: {DirectoryVersionId}; deleteReason: {deleteReason}.", - getCurrentInstantExtended (), - getMachineName, - correlationId, - directoryVersionDto.DirectoryVersion.RepositoryId, - directoryVersionDto.DirectoryVersion.DirectoryVersionId, - deleteReason - ) + if not <| String.IsNullOrEmpty reminder.State then + let (deleteReason, correlationId) = deserialize reminder.State + + this.correlationId <- correlationId + + // Delete saved state for this actor. + let! deleted = Storage.DeleteState stateManager directoryVersionCacheStateName + + if deleted then + log.LogInformation( + "{CurrentInstant}: Node: {HostName}; CorrelationId: {correlationId}; Deleted cache for directory version; RepositoryId: {RepositoryId}; DirectoryVersionId: {DirectoryVersionId}; deleteReason: {deleteReason}.", + getCurrentInstantExtended (), + getMachineName, + correlationId, + directoryVersionDto.DirectoryVersion.RepositoryId, + directoryVersionDto.DirectoryVersion.DirectoryVersionId, + deleteReason + ) + else + log.LogWarning( + "{CurrentInstant}: Node: {HostName}; CorrelationId: {correlationId}; Failed to delete cache for directory version (it may have already been deleted); RepositoryId: {RepositoryId}; DirectoryVersionId: {DirectoryVersionId}; deleteReason: {deleteReason}.", + getCurrentInstantExtended (), + getMachineName, + correlationId, + directoryVersionDto.DirectoryVersion.RepositoryId, + directoryVersionDto.DirectoryVersion.DirectoryVersionId, + deleteReason + ) // Mark the actor as disposed, in case someone tries to use it before Dapr GC's it. isDisposed <- true @@ -375,12 +378,21 @@ module DirectoryVersion = (fun directoryId ct -> ValueTask( task { - let subdirectoryActor = DirectoryVersion.CreateActorProxy directoryId correlationId - - let! subdirectoryContents = subdirectoryActor.GetRecursiveDirectoryVersions forceRegenerate correlationId - - for directoryVersion in subdirectoryContents do - subdirectoryVersions.Enqueue(directoryVersion) + try + let subdirectoryActor = DirectoryVersion.CreateActorProxy directoryId correlationId + + let! subdirectoryContents = subdirectoryActor.GetRecursiveDirectoryVersions forceRegenerate correlationId + + for directoryVersion in subdirectoryContents do + subdirectoryVersions.Enqueue(directoryVersion) + with ex -> + log.LogError( + "{CurrentInstant}: Error in {methodName}; DirectoryId: {directoryId}; Exception: {exception}", + getCurrentInstantExtended (), + "GetRecursiveDirectoryVersions", + directoryId, + ExceptionResponse.Create ex + ) } )) ) @@ -389,7 +401,6 @@ module DirectoryVersion = subdirectoryVersions.ToArray() |> Array.sortBy (fun directoryVersion -> directoryVersion.RelativePath) - logToConsole $"In DirectoryVersionActor.GetDirectoryVersionsRecursive({this.Id}); Storing subdirectoryVersion list." do! Storage.SaveState stateManager directoryVersionCacheStateName subdirectoryVersionsList this.correlationId log.LogDebug("In DirectoryVersionActor.GetDirectoryVersionsRecursive({id}); Storing subdirectoryVersion list.", this.Id) @@ -506,20 +517,3 @@ module DirectoryVersion = else return directoryVersionDto.RecursiveSize } - - interface IRemindable with - member this.ReceiveReminderAsync(reminderName, state, dueTime, period) = - match reminderName with - | ReminderType.DeleteCachedState -> - task { - try - let deleteReason = fromByteArray state - this.correlationId <- this.correlationId - with ex -> - () - - let! deleteSucceeded = Storage.DeleteState stateManager directoryVersionCacheStateName - () - } - :> Task - | _ -> Task.CompletedTask diff --git a/src/Grace.Actors/FileAppearance.Actor.fs b/src/Grace.Actors/FileAppearance.Actor.fs index 9d26121..60d9da3 100644 --- a/src/Grace.Actors/FileAppearance.Actor.fs +++ b/src/Grace.Actors/FileAppearance.Actor.fs @@ -45,6 +45,8 @@ module FileAppearance = let dtoStateName = StateName.FileAppearance let mutable dto = FileAppearanceDto() + member val private correlationId: CorrelationId = String.Empty with get, set + override this.OnActivateAsync() = stateManager <- this.StateManager @@ -71,6 +73,7 @@ module FileAppearance = /// Receives a Grace reminder. member this.ReceiveReminderAsync(reminder: ReminderDto) : Task> = + this.correlationId <- reminder.CorrelationId logToConsole $"Received a reminder: {reminder}." Ok() |> returnTask diff --git a/src/Grace.Actors/Organization.Actor.fs b/src/Grace.Actors/Organization.Actor.fs index 016dc14..98ff8db 100644 --- a/src/Grace.Actors/Organization.Actor.fs +++ b/src/Grace.Actors/Organization.Actor.fs @@ -279,6 +279,8 @@ module Organization = /// Receives a Grace reminder. member this.ReceiveReminderAsync(reminder: ReminderDto) : Task> = task { + this.correlationId <- reminder.CorrelationId + match reminder.ReminderType with | ReminderTypes.PhysicalDeletion -> // Get values from state. diff --git a/src/Grace.Actors/Owner.Actor.fs b/src/Grace.Actors/Owner.Actor.fs index e662af8..09ead2d 100644 --- a/src/Grace.Actors/Owner.Actor.fs +++ b/src/Grace.Actors/Owner.Actor.fs @@ -282,6 +282,8 @@ module Owner = /// Receives a Grace reminder. member this.ReceiveReminderAsync(reminder: ReminderDto) : Task> = task { + this.correlationId <- reminder.CorrelationId + match reminder.ReminderType with | ReminderTypes.PhysicalDeletion -> // Get values from state. diff --git a/src/Grace.Actors/Reference.Actor.fs b/src/Grace.Actors/Reference.Actor.fs index 340e78e..cbf16d6 100644 --- a/src/Grace.Actors/Reference.Actor.fs +++ b/src/Grace.Actors/Reference.Actor.fs @@ -179,6 +179,8 @@ module Reference = /// Receives a Grace reminder. member this.ReceiveReminderAsync(reminder: ReminderDto) : Task> = task { + this.correlationId <- reminder.CorrelationId + match reminder.ReminderType with | ReminderTypes.PhysicalDeletion -> // Get values from state. diff --git a/src/Grace.Actors/Services.Actor.fs b/src/Grace.Actors/Services.Actor.fs index 04a73b0..d90e62e 100644 --- a/src/Grace.Actors/Services.Actor.fs +++ b/src/Grace.Actors/Services.Actor.fs @@ -1300,10 +1300,11 @@ module Services = | Reference.ReferenceEventType.Created refDto -> refDto | _ -> ReferenceDto.Default - Activity.Current - .SetTag("indexMetrics", $"{indexMetrics.Remove(indexMetrics.Length - 2, 2)}") - .SetTag("requestCharge", $"{requestCharge.Remove(requestCharge.Length - 2, 2)}") - |> ignore + if (indexMetrics.Length >= 2) && (requestCharge.Length >= 2) then + Activity.Current + .SetTag("indexMetrics", $"{indexMetrics.Remove(indexMetrics.Length - 2, 2)}") + .SetTag("requestCharge", $"{requestCharge.Remove(requestCharge.Length - 2, 2)}") + |> ignore if referenceDto.ReferenceId <> ReferenceDto.Default.ReferenceId then return Some referenceDto diff --git a/src/Grace.CLI/Command/Branch.CLI.fs b/src/Grace.CLI/Command/Branch.CLI.fs index dd3635d..625f4b8 100644 --- a/src/Grace.CLI/Command/Branch.CLI.fs +++ b/src/Grace.CLI/Command/Branch.CLI.fs @@ -921,7 +921,7 @@ module Branch = saveParameters.CorrelationId <- getCorrelationId parseResult - let! uploadDirectoryVersions = Directory.SaveDirectoryVersions saveParameters + let! uploadDirectoryVersions = DirectoryVersion.SaveDirectoryVersions saveParameters lastDirectoryVersionUpload <- getCurrentInstant () @@ -1007,7 +1007,7 @@ module Branch = saveParameters.DirectoryVersions <- newDirectoryVersions.Select(fun dv -> dv.ToDirectoryVersion).ToList() - let! uploadDirectoryVersions = Directory.SaveDirectoryVersions saveParameters + let! uploadDirectoryVersions = DirectoryVersion.SaveDirectoryVersions saveParameters let rootDirectoryVersion = getRootDirectoryVersion previousGraceStatus let sdkParameters = @@ -2031,9 +2031,9 @@ module Branch = saveParameters.DirectoryVersions <- newDirectoryVersions.Select(fun dv -> dv.ToDirectoryVersion).ToList() - let! uploadDirectoryVersions = Directory.SaveDirectoryVersions saveParameters + let! uploadDirectoryVersions = DirectoryVersion.SaveDirectoryVersions saveParameters - match! Directory.SaveDirectoryVersions saveParameters with + match! DirectoryVersion.SaveDirectoryVersions saveParameters with | Ok returnValue -> t |> setProgressTaskValue showOutput 100.0 @@ -2247,7 +2247,7 @@ module Branch = CorrelationId = parameters.CorrelationId ) - match! Directory.GetByDirectoryIds getByDirectoryIdParameters with + match! DirectoryVersion.GetByDirectoryIds getByDirectoryIdParameters with | Ok returnValue -> //logToAnsiConsole Colors.Verbose $"Succeeded calling Directory.GetByDirectoryIds." // Create a new version of GraceStatus that includes the new DirectoryVersions. @@ -2570,9 +2570,9 @@ module Branch = ) // Get the directory versions for the parent promotion that we're rebasing on, and the latest reference. - let! d1 = Directory.GetDirectoryVersionsRecursive(getParentLatestPromotionDirectoryParameters) + let! d1 = DirectoryVersion.GetDirectoryVersionsRecursive(getParentLatestPromotionDirectoryParameters) - let! d2 = Directory.GetDirectoryVersionsRecursive(getLatestReferenceDirectoryParameters) + let! d2 = DirectoryVersion.GetDirectoryVersionsRecursive(getLatestReferenceDirectoryParameters) let createFileVersionLookupDictionary (directoryVersions: IEnumerable) = let lookup = Dictionary(StringComparer.OrdinalIgnoreCase) @@ -2682,7 +2682,7 @@ module Branch = saveParameters.DirectoryVersions <- newDirectoryVersions.Select(fun dv -> dv.ToDirectoryVersion).ToList() - match! Directory.SaveDirectoryVersions saveParameters with + match! DirectoryVersion.SaveDirectoryVersions saveParameters with | Ok returnValue -> return Ok() | Error error -> return Error error else diff --git a/src/Grace.CLI/Command/Diff.CLI.fs b/src/Grace.CLI/Command/Diff.CLI.fs index 7c56968..b786c49 100644 --- a/src/Grace.CLI/Command/Diff.CLI.fs +++ b/src/Grace.CLI/Command/Diff.CLI.fs @@ -412,7 +412,7 @@ module Diff = saveDirectoryVersionsParameters.DirectoryVersions <- newDirectoryVersions.Select(fun dv -> dv.ToDirectoryVersion).ToList() - match! Directory.SaveDirectoryVersions saveDirectoryVersionsParameters with + match! DirectoryVersion.SaveDirectoryVersions saveDirectoryVersionsParameters with | Ok returnValue -> () | Error error -> logToAnsiConsole Colors.Error $"Failed to upload new directory versions. {error}" }) @@ -701,7 +701,7 @@ module Diff = saveDirectoryVersionsParameters.DirectoryVersions <- newDirectoryVersions.Select(fun dv -> dv.ToDirectoryVersion).ToList() - match! Directory.SaveDirectoryVersions saveDirectoryVersionsParameters with + match! DirectoryVersion.SaveDirectoryVersions saveDirectoryVersionsParameters with | Ok returnValue -> () | Error error -> logToAnsiConsole Colors.Error $"Failed to upload new directory versions. {error}" }) diff --git a/src/Grace.CLI/Command/Maintenance.CLI.fs b/src/Grace.CLI/Command/Maintenance.CLI.fs index 50abe65..39fe6ed 100644 --- a/src/Grace.CLI/Command/Maintenance.CLI.fs +++ b/src/Grace.CLI/Command/Maintenance.CLI.fs @@ -149,7 +149,7 @@ module Maintenance = // Read the existing Grace status file. t0.Increment(0.0) - //let! previousGraceStatus = readGraceStatusFile () + let! previousGraceStatus = readGraceStatusFile () let! graceStatus = readGraceStatusFile () t0.Increment(100.0) @@ -159,8 +159,8 @@ module Maintenance = if parseResult |> verbose then logToAnsiConsole Colors.Verbose "Computing new Grace index file." - //let! graceStatus = createNewGraceStatusFile previousGraceStatus parseResult - //let graceStatus = previousGraceStatus + let! graceStatus = createNewGraceStatusFile previousGraceStatus parseResult + let graceStatus = previousGraceStatus if parseResult |> verbose then logToAnsiConsole Colors.Verbose "Done computing new Grace index file." @@ -370,7 +370,7 @@ module Maintenance = CorrelationId = getCorrelationId parseResult ) - match! Directory.SaveDirectoryVersions saveDirectoryVersionsParameters with + match! DirectoryVersion.SaveDirectoryVersions saveDirectoryVersionsParameters with | Ok result -> succeeded.Enqueue(result) | Error error -> errors.Enqueue(error) @@ -583,12 +583,6 @@ module Maintenance = fileVersions.TryAdd(fileVersion.RelativePath, fileVersion) |> ignore) ) - // New F# 8.0 way to do this. - //graceStatus.Index.Values |> Seq.toArray |> Array.Parallel.iter (fun ldv -> - // for fileVersion in ldv.Files do - // fileVersions.TryAdd(fileVersion.RelativePath, fileVersion) |> ignore - //) - let incrementAmount = 100.0 / double fileVersions.Count // Loop through the files, and copy them to the object cache if they don't already exist. @@ -770,7 +764,7 @@ module Maintenance = CorrelationId = getCorrelationId parseResult ) - match! Directory.SaveDirectoryVersions saveDirectoryVersionsParameters with + match! DirectoryVersion.SaveDirectoryVersions saveDirectoryVersionsParameters with | Ok result -> succeeded.Enqueue(result) | Error error -> errors.Enqueue(error) @@ -1051,7 +1045,7 @@ module Maintenance = if i = 0 then AnsiConsole.MarkupLine( - $"[{Colors.Important}]Last Write Time SHA-256 Size Path{additionalSpaces}[/][{Colors.Deemphasized}] (DirectoryVersionId)[/]" + $"[{Colors.Important}]Last Write Time (UTC) SHA-256 Size Path{additionalSpaces}[/][{Colors.Deemphasized}] (DirectoryVersionId)[/]" ) AnsiConsole.MarkupLine( diff --git a/src/Grace.CLI/Command/Owner.CLI.fs b/src/Grace.CLI/Command/Owner.CLI.fs index 00ee8bb..0ff22fe 100644 --- a/src/Grace.CLI/Command/Owner.CLI.fs +++ b/src/Grace.CLI/Command/Owner.CLI.fs @@ -132,8 +132,7 @@ module Owner = && not <| isNull (parseResult.CommandResult.FindResultFor(Options.ownerName)) && not <| parseResult.CommandResult.FindResultFor(Options.ownerName).IsImplicit then - //parameters.OwnerId <- String.Empty - () + parameters.OwnerId <- String.Empty parameters diff --git a/src/Grace.CLI/Command/Reference.CLI.fs b/src/Grace.CLI/Command/Reference.CLI.fs index 20afdb6..fd3d4f8 100644 --- a/src/Grace.CLI/Command/Reference.CLI.fs +++ b/src/Grace.CLI/Command/Reference.CLI.fs @@ -755,7 +755,7 @@ module Reference = saveParameters.CorrelationId <- getCorrelationId parseResult - let! uploadDirectoryVersions = Directory.SaveDirectoryVersions saveParameters + let! uploadDirectoryVersions = DirectoryVersion.SaveDirectoryVersions saveParameters lastDirectoryVersionUpload <- getCurrentInstant () @@ -841,7 +841,7 @@ module Reference = saveParameters.DirectoryVersions <- newDirectoryVersions.Select(fun dv -> dv.ToDirectoryVersion).ToList() - let! uploadDirectoryVersions = Directory.SaveDirectoryVersions saveParameters + let! uploadDirectoryVersions = DirectoryVersion.SaveDirectoryVersions saveParameters let rootDirectoryVersion = getRootDirectoryVersion previousGraceStatus let sdkParameters = diff --git a/src/Grace.CLI/Command/Repository.CLI.fs b/src/Grace.CLI/Command/Repository.CLI.fs index 331438c..f777504 100644 --- a/src/Grace.CLI/Command/Repository.CLI.fs +++ b/src/Grace.CLI/Command/Repository.CLI.fs @@ -710,7 +710,7 @@ module Repository = param.CorrelationId <- getCorrelationId parseResult - let! sdvResult = Directory.SaveDirectoryVersions param + let! sdvResult = DirectoryVersion.SaveDirectoryVersions param match sdvResult with | Ok result -> succeeded.Enqueue(result) diff --git a/src/Grace.CLI/Command/Services.CLI.fs b/src/Grace.CLI/Command/Services.CLI.fs index ec44b70..8166d07 100644 --- a/src/Grace.CLI/Command/Services.CLI.fs +++ b/src/Grace.CLI/Command/Services.CLI.fs @@ -130,10 +130,18 @@ module Services = normalizeFilePath (directoryInfoToCheck.FullName + "/") if FileSystemName.MatchesSimpleExpression(expression, normalizedDirectoryPath, ignoreCase) then - //AnsiConsole.MarkupLine($"{GetCurrentInstantString()} [{Colors.Deleted}]normalizedDirectoryPath: {normalizedDirectoryPath}; expression: {expression}; matches: true. Should ignore.[/]") + //if normalizedDirectoryPath.Contains(".git") then + //AnsiConsole.MarkupLine( + // $"{getCurrentInstantExtended ()} [{Colors.Deleted}]In checkIgnoreLineAgainstDirectory(): normalizedDirectoryPath: {normalizedDirectoryPath}; expression: {expression}; matches: true. Should ignore.[/]" + //) + true else - //AnsiConsole.MarkupLine($"{GetCurrentInstantString()} [{Colors.Added}]normalizedDirectoryPath: {normalizedDirectoryPath}; expression: {expression}; matches: false. Should not ignore.[/]") + //if normalizedDirectoryPath.Contains(".git") then + //AnsiConsole.MarkupLine( + // $"{getCurrentInstantExtended ()} [{Colors.Added}]In checkIgnoreLineAgainstDirectory(): normalizedDirectoryPath: {normalizedDirectoryPath}; expression: {expression}; matches: false. Should not ignore.[/]" + //) + false /// Returns true if filePath should be ignored by Grace, otherwise returns false. @@ -165,7 +173,9 @@ module Services = |> Array.exists (fun graceIgnoreLine -> checkIgnoreLineAgainstFile filePath graceIgnoreLine) || Current().GraceFileIgnoreEntries // the file name matches a file ignore line |> Array.exists (fun graceIgnoreLine -> checkIgnoreLineAgainstFile filePath graceIgnoreLine) - //logToConsole $"In shouldIgnoreFile: filePath: {filePath}; shouldIgnore: {shouldIgnoreThisFile}" + + + //logToAnsiConsole Colors.Verbose $"In shouldIgnoreFile: filePath: {filePath}; shouldIgnore: {shouldIgnoreThisFile}" shouldIgnoreCache.TryAdd(filePath, shouldIgnoreThisFile) |> ignore shouldIgnoreThisFile @@ -187,7 +197,7 @@ module Services = |> Array.exists (fun graceIgnoreLine -> checkIgnoreLineAgainstDirectory directoryInfo graceIgnoreLine)) shouldIgnoreCache.TryAdd(directoryPath, shouldIgnoreDirectory) |> ignore - //logToConsole $"Should {if shouldIgnoreDirectory then String.Empty else notString}ignore directory {directoryPath}." + //logToAnsiConsole Colors.Verbose $"In shouldIgnoreDirectory: directoryPath: {directoryPath}; shouldIgnore: {shouldIgnoreDirectory}" shouldIgnoreDirectory /// Returns true if directoryPath should not be ignored by Grace, otherwise returns false. @@ -211,7 +221,7 @@ module Services = (Sha256Hash shaValue) isBinary fileInfo.Length - (getCurrentInstant ()) + (Instant.FromDateTimeUtc(fileInfo.LastWriteTimeUtc)) true fileInfo.LastWriteTimeUtc ) @@ -363,7 +373,10 @@ module Services = match fileSystemEntryType with | FileSystemEntryType.Directory -> // If it's a directory, just add it to the differences list. - //logToAnsiConsole Colors.Verbose $"scanForDifferences: Difference in directory: {relativePath}; lastWriteTimeUtc: {lastWriteTimeUtc}; knownLastWriteTimeUtc: {knownLastWriteTimeUtc}." + logToAnsiConsole + Colors.Verbose + $"scanForDifferences: Difference in directory: {relativePath}; lastWriteTimeUtc: {lastWriteTimeUtc}; knownLastWriteTimeUtc: {knownLastWriteTimeUtc}." + differences.Push(FileSystemDifference.Create Change fileSystemEntryType relativePath) | FileSystemEntryType.File -> // If this is a file, then check that the contents have actually changed. @@ -480,9 +493,10 @@ module Services = Interlocked.Increment(&newDirectoryVersionCount) |> ignore - logToAnsiConsole - Colors.Important - $"****Created new DirectoryVersion: RelativePath: {normalizeFilePath subdirectoryRelativePath}; existing SHA256Hash: {existingSubdirectoryVersion.Sha256Hash}; new SHA256Hash: {sha256Hash}." + if parseResult |> isOutputFormat "Verbose" then + logToAnsiConsole + Colors.Important + $"Created new DirectoryVersion: RelativePath: {normalizeFilePath subdirectoryRelativePath}; existing SHA256Hash: {existingSubdirectoryVersion.Sha256Hash}; new SHA256Hash: {sha256Hash}." directories.Enqueue(subdirectoryVersion) else @@ -516,10 +530,10 @@ module Services = let sha256Hash = computeSha256ForDirectory relativeDirectoryPath directories files - //if relativeDirectoryPath = Constants.RootDirectoryPath then - logToAnsiConsole - Colors.Verbose - $"In collectDirectoriesAndFiles: newDirectoryVersionCount: {newDirectoryVersionCount}; existingDirectoryVersionCount: {existingDirectoryVersionCount}." + if parseResult |> isOutputFormat "Verbose" then + logToAnsiConsole + Colors.Verbose + $"In collectDirectoriesAndFiles: newDirectoryVersionCount: {newDirectoryVersionCount}; existingDirectoryVersionCount: {existingDirectoryVersionCount}." return (directories, files, sha256Hash) } @@ -869,8 +883,13 @@ module Services = let directoryVersion = // Check if we've already modified this DirectoryVersion, if so, use that one. // Otherwise, take the not-yet-modified one from newGraceIndex. - let changedDirectoryVersion = - changedDirectoryVersions.Values.FirstOrDefault((fun dv -> dv.RelativePath = relativeDirectoryPath), LocalDirectoryVersion.Default) + //let changedDirectoryVersion = + // changedDirectoryVersions.Values.FirstOrDefault((fun dv -> dv.RelativePath = relativeDirectoryPath), LocalDirectoryVersion.Default) + + let mutable changedDirectoryVersion = LocalDirectoryVersion.Default + + changedDirectoryVersions.TryGetValue(relativeDirectoryPath, &changedDirectoryVersion) + |> ignore if changedDirectoryVersion.DirectoryVersionId <> Guid.Empty then changedDirectoryVersion @@ -1058,7 +1077,7 @@ module Services = let parameters = SaveDirectoryVersionsParameters(CorrelationId = correlationId, DirectoryVersions = directoryVersions) - Directory.SaveDirectoryVersions parameters + DirectoryVersion.SaveDirectoryVersions parameters //let updateObjectCacheFromWorkingDirectory (graceIndex: GraceIndex) = // task { @@ -1230,7 +1249,7 @@ module Services = let updateWorkingDirectory (previousGraceStatus: GraceStatus) (updatedGraceStatus: GraceStatus) - (newDirectoryVersions: List) + (newDirectoryVersions: IEnumerable) (correlationId: CorrelationId) = task { @@ -1261,11 +1280,11 @@ module Services = () | Error error -> - AnsiConsole.MarkupLine( - $"[{Colors.Error}]An error occurred while downloading a file from the object storage provider. CorrelationId: {correlationId}.[/]" - ) + logToAnsiConsole + Colors.Error + $"An error occurred while downloading a file from the object storage provider. CorrelationId: {correlationId}." - AnsiConsole.MarkupLine($"[{Colors.Error}]{error}[/]") + logToAnsiConsole Colors.Error $"{error}" if existingFileOnDisk.Exists then // Need to compare existing file to new version from the object cache. diff --git a/src/Grace.CLI/Properties/launchSettings.json b/src/Grace.CLI/Properties/launchSettings.json index 004cff2..f6d7d92 100644 --- a/src/Grace.CLI/Properties/launchSettings.json +++ b/src/Grace.CLI/Properties/launchSettings.json @@ -51,7 +51,7 @@ "grace maint update-index": { "commandName": "Project", "commandLineArgs": "maint update-index", - "workingDirectory": "D:\\Source\\gracedemo\\Chris" + "workingDirectory": "D:\\Source\\gracedemo\\Scott" }, "grace repo set-checkpointdays": { "commandName": "Project", @@ -96,7 +96,7 @@ "grace watch - Chris": { "commandName": "Project", "commandLineArgs": "watch", - "workingDirectory": "D:\\Source\\GraceDemo\\Chris" + "workingDirectory": "D:\\Source\\GraceDemo\\Scott" }, "grace switch -c Mika": { "commandName": "Project", diff --git a/src/Grace.SDK/Common.SDK.fs b/src/Grace.SDK/Common.SDK.fs index 4850119..1104d5f 100644 --- a/src/Grace.SDK/Common.SDK.fs +++ b/src/Grace.SDK/Common.SDK.fs @@ -41,8 +41,9 @@ module Common = ) #endif - // This construct is equivalent to using IHttpClientFactory in the ASP.NET Dependency Injection container, for code (like this) that isn't using GenericHost. - // See https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-9.0#alternatives-to-ihttpclientfactory for more information. + /// This construct is equivalent to using IHttpClientFactory in the ASP.NET Dependency Injection container, for code (like this) that isn't using GenericHost. + /// + /// See https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-9.0#alternatives-to-ihttpclientfactory for more information. let private socketsHttpHandler = new SocketsHttpHandler( AllowAutoRedirect = true, // We expect to use Traffic Manager or equivalents, so there will be redirects. @@ -77,6 +78,7 @@ module Common = #endif httpClient + /// Checks to make sure the .NET MemoryCache is initialized. If not, it will create one. let checkMemoryCache () = if isNull memoryCache then let memoryCacheOptions = diff --git a/src/Grace.SDK/Directory.SDK.fs b/src/Grace.SDK/DirectoryVersion.SDK.fs similarity index 61% rename from src/Grace.SDK/Directory.SDK.fs rename to src/Grace.SDK/DirectoryVersion.SDK.fs index 0ed1dfd..42759f5 100644 --- a/src/Grace.SDK/Directory.SDK.fs +++ b/src/Grace.SDK/DirectoryVersion.SDK.fs @@ -1,40 +1,43 @@ -namespace Grace.SDK +namespace Grace.SDK open Grace.SDK.Common open Grace.Shared.Dto open Grace.Shared.Parameters.Directory -open Grace.Shared.Types +open Grace.Shared open System open System.Collections.Generic open System.Threading.Tasks -type Directory() = +type DirectoryVersion() = /// Retrieves a DirectoryVersion instance. static member public Get(parameters: GetParameters) = - postServer (parameters |> ensureCorrelationIdIsSet, $"directory/{nameof (Directory.Get)}") + postServer (parameters |> ensureCorrelationIdIsSet, $"directory/{nameof (DirectoryVersion.Get)}") /// Retrieves a DirectoryVersion instance. static member public GetByDirectoryIds(parameters: GetByDirectoryIdsParameters) = - postServer> ( + postServer> ( parameters |> ensureCorrelationIdIsSet, - $"directory/{nameof (Directory.GetByDirectoryIds)}" + $"directory/{nameof (DirectoryVersion.GetByDirectoryIds)}" ) /// Retrieves a DirectoryVersion instance. static member public GetBySha256Hash(parameters: GetBySha256HashParameters) = - postServer (parameters |> ensureCorrelationIdIsSet, $"directory/{nameof (Directory.GetBySha256Hash)}") + postServer (parameters |> ensureCorrelationIdIsSet, $"directory/{nameof (DirectoryVersion.GetBySha256Hash)}") /// Saves a list of DirectoryVersion instances to the server. static member public Create(parameters: CreateParameters) = - postServer (parameters |> ensureCorrelationIdIsSet, $"directory/{nameof (Directory.Create)}") + postServer (parameters |> ensureCorrelationIdIsSet, $"directory/{nameof (DirectoryVersion.Create)}") /// Saves a list of DirectoryVersion instances to the server. static member public SaveDirectoryVersions(parameters: SaveDirectoryVersionsParameters) = - postServer (parameters |> ensureCorrelationIdIsSet, $"directory/{nameof (Directory.SaveDirectoryVersions)}") + postServer ( + parameters |> ensureCorrelationIdIsSet, + $"directory/{nameof (DirectoryVersion.SaveDirectoryVersions)}" + ) /// Retrieves the recursive set of DirectoryVersions from a specific DirectoryVersion. static member public GetDirectoryVersionsRecursive(parameters: GetParameters) = - postServer> ( + postServer> ( parameters |> ensureCorrelationIdIsSet, - $"directory/{nameof (Directory.GetDirectoryVersionsRecursive)}" + $"directory/{nameof (DirectoryVersion.GetDirectoryVersionsRecursive)}" ) diff --git a/src/Grace.SDK/Grace.SDK.fsproj b/src/Grace.SDK/Grace.SDK.fsproj index 902600f..11ad75b 100644 --- a/src/Grace.SDK/Grace.SDK.fsproj +++ b/src/Grace.SDK/Grace.SDK.fsproj @@ -22,7 +22,7 @@ - + diff --git a/src/Grace.SDK/Storage.SDK.fs b/src/Grace.SDK/Storage.SDK.fs index cde1ac6..f359674 100644 --- a/src/Grace.SDK/Storage.SDK.fs +++ b/src/Grace.SDK/Storage.SDK.fs @@ -241,7 +241,7 @@ module Storage = return response.GetRawResponse().Status } - logToConsole $"In SaveFileToObjectStorageWithMetadata: {fileVersion.RelativePath}; upload status: {status}." + //logToConsole $"In SaveFileToObjectStorageWithMetadata: {fileVersion.RelativePath}; upload status: {status}." if status = int HttpStatusCode.Created then let returnValue = GraceReturnValue.Create "File successfully saved to object storage." correlationId diff --git a/src/Grace.Server/DirectoryVersion.Server.fs b/src/Grace.Server/DirectoryVersion.Server.fs index bdfa779..1606b24 100644 --- a/src/Grace.Server/DirectoryVersion.Server.fs +++ b/src/Grace.Server/DirectoryVersion.Server.fs @@ -28,6 +28,7 @@ open System.Text open System.Text.Json open System.Threading.Tasks open Giraffe.ViewEngine.HtmlElements +open System.IO module DirectoryVersion = @@ -178,7 +179,7 @@ module DirectoryVersion = task { let! directoryVersions = actorProxy.GetRecursiveDirectoryVersions false (getCorrelationId context) - return directoryVersions + return directoryVersions :> IEnumerable } let! parameters = context |> parse @@ -206,7 +207,7 @@ module DirectoryVersion = let! directoryVersion = actorProxy.Get(getCorrelationId context) directoryVersions.Add(directoryVersion) - return directoryVersions + return directoryVersions :> IEnumerable } let! parameters = context |> parse diff --git a/src/Grace.Server/Program.Server.fs b/src/Grace.Server/Program.Server.fs index 3f22662..df7f082 100644 --- a/src/Grace.Server/Program.Server.fs +++ b/src/Grace.Server/Program.Server.fs @@ -34,8 +34,8 @@ module Program = .UseStartup() .UseKestrel(fun kestrelServerOptions -> kestrelServerOptions.Listen(IPAddress.Any, graceAppPort) - kestrelServerOptions.Limits.MaxConcurrentConnections <- 1000 - kestrelServerOptions.Limits.MaxConcurrentUpgradedConnections <- 1000 + //kestrelServerOptions.Limits.MaxConcurrentConnections <- 1000 + //kestrelServerOptions.Limits.MaxConcurrentUpgradedConnections <- 1000 //kestrelServerOptions.Listen(IPAddress.Any, 5001, (fun listenOptions -> listenOptions.UseHttps("/etc/certificates/gracedevcert.pfx", "GraceDevCert") |> ignore)) kestrelServerOptions.ConfigureEndpointDefaults(fun listenOptions -> listenOptions.Protocols <- HttpProtocols.Http1AndHttp2) diff --git a/src/Grace.Shared/Client/Configuration.Shared.fs b/src/Grace.Shared/Client/Configuration.Shared.fs index 978534b..97a981b 100644 --- a/src/Grace.Shared/Client/Configuration.Shared.fs +++ b/src/Grace.Shared/Client/Configuration.Shared.fs @@ -182,10 +182,6 @@ module Configuration = match (parseConfigurationFile graceConfigurationFilePath) with | Ok graceConfigurationFromFile -> - let graceIgnoreFullPath = (Path.Combine(graceConfigurationDirectory, Constants.GraceIgnoreFileName)) - - let graceIgnoreEntries = getGraceIgnoreEntries graceIgnoreFullPath - graceConfiguration <- graceConfigurationFromFile graceConfiguration.RootDirectory <- Path.GetFullPath(Path.Combine(graceConfigurationDirectory, "..")) @@ -203,6 +199,11 @@ module Configuration = graceConfiguration.ConfigurationDirectory <- FileInfo(graceConfigurationFilePath).DirectoryName //graceConfiguration.ActivitySource <- new ActivitySource("Grace", "0.1") + + let graceIgnoreFullPath = (Path.Combine(graceConfiguration.RootDirectory, Constants.GraceIgnoreFileName)) + + let graceIgnoreEntries = getGraceIgnoreEntries graceIgnoreFullPath + graceConfiguration.GraceIgnoreEntries <- graceIgnoreEntries graceConfiguration.GraceFileIgnoreEntries <- diff --git a/src/Grace.Shared/Constants.Shared.fs b/src/Grace.Shared/Constants.Shared.fs index 028ac25..0eb287b 100644 --- a/src/Grace.Shared/Constants.Shared.fs +++ b/src/Grace.Shared/Constants.Shared.fs @@ -124,7 +124,7 @@ module Constants = let GraceDirectoryVersionCacheName = "directoryVersions" /// The name of the file that holds the file specifications to ignore. - let GraceIgnoreFileName = "graceignore.txt" + let GraceIgnoreFileName = ".graceignore" /// The name of the file that holds the current local index for Grace. let GraceStatusFileName = "gracestatus.msgpack" diff --git a/src/Grace.Shared/Utilities.Shared.fs b/src/Grace.Shared/Utilities.Shared.fs index a2d9a54..2d739d5 100644 --- a/src/Grace.Shared/Utilities.Shared.fs +++ b/src/Grace.Shared/Utilities.Shared.fs @@ -227,7 +227,6 @@ module Utilities = let normalizedTimeSpan = TimeSpan.FromMinutes(1.0) let normalizeFilePath (filePath: string) = - logToConsole $"In normalizeFilePath: filePath: {filePath}; isNull memoryCache: {isNull memoryCache}." let mutable result = String.Empty if not <| memoryCache.TryGetValue(filePath, &result) then