# HG changeset patch # User Alain Mazy # Date 1727791310 -7200 # Node ID ca5622c27d6c3ecde445c4392f57554660e72862 # Parent 42a7fbf1335901c3ddc3f9c643374acd662a5611# Parent 7c2b4fa94633d29d8666a65d694076492e6b2357 merged find-refactoring -> attach-custom-data diff -r 42a7fbf13359 -r ca5622c27d6c OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp --- a/OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp Wed Sep 25 16:36:43 2024 +0200 +++ b/OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp Tue Oct 01 16:01:50 2024 +0200 @@ -1042,7 +1042,7 @@ } }; - if (GetDatabaseCapabilities().HasUpdateAndGetStatistics()) + if (GetDatabaseCapabilities().HasUpdateAndGetStatistics() && !IsReadOnly()) { Operations operations; Apply(operations); @@ -2825,8 +2825,8 @@ } - bool StatelessDatabaseOperations::ReadWriteTransaction::HasReachedMaxStorageSize(uint64_t maximumStorageSize, - uint64_t addedInstanceSize) + bool StatelessDatabaseOperations::ReadOnlyTransaction::HasReachedMaxStorageSize(uint64_t maximumStorageSize, + uint64_t addedInstanceSize) { if (maximumStorageSize != 0) { @@ -2847,8 +2847,8 @@ return false; } - bool StatelessDatabaseOperations::ReadWriteTransaction::HasReachedMaxPatientCount(unsigned int maximumPatientCount, - const std::string& patientId) + bool StatelessDatabaseOperations::ReadOnlyTransaction::HasReachedMaxPatientCount(unsigned int maximumPatientCount, + const std::string& patientId) { if (maximumPatientCount != 0) { diff -r 42a7fbf13359 -r ca5622c27d6c OrthancServer/Sources/Database/StatelessDatabaseOperations.h --- a/OrthancServer/Sources/Database/StatelessDatabaseOperations.h Wed Sep 25 16:36:43 2024 +0200 +++ b/OrthancServer/Sources/Database/StatelessDatabaseOperations.h Tue Oct 01 16:01:50 2024 +0200 @@ -401,6 +401,12 @@ transaction_.ListAllLabels(target); } + bool HasReachedMaxStorageSize(uint64_t maximumStorageSize, + uint64_t addedInstanceSize); + + bool HasReachedMaxPatientCount(unsigned int maximumPatientCount, + const std::string& patientId); + void ExecuteFind(FindResponse& response, const FindRequest& request, const IDatabaseWrapper::Capabilities& capabilities) @@ -541,12 +547,6 @@ uint64_t addedInstanceSize, const std::string& newPatientId); - bool HasReachedMaxStorageSize(uint64_t maximumStorageSize, - uint64_t addedInstanceSize); - - bool HasReachedMaxPatientCount(unsigned int maximumPatientCount, - const std::string& patientId); - bool IsRecyclingNeeded(uint64_t maximumStorageSize, unsigned int maximumPatients, uint64_t addedInstanceSize, @@ -608,6 +608,11 @@ uint64_t maximumStorageSize, unsigned int maximumPatientCount); + bool IsReadOnly() + { + return readOnly_; + } + public: explicit StatelessDatabaseOperations(IDatabaseWrapper& database, bool readOnly); diff -r 42a7fbf13359 -r ca5622c27d6c OrthancServer/Sources/OrthancRestApi/OrthancRestApi.cpp --- a/OrthancServer/Sources/OrthancRestApi/OrthancRestApi.cpp Wed Sep 25 16:36:43 2024 +0200 +++ b/OrthancServer/Sources/OrthancRestApi/OrthancRestApi.cpp Tue Oct 01 16:01:50 2024 +0200 @@ -270,7 +270,16 @@ RegisterAnonymizeModify(); RegisterArchive(); - Register("/instances", UploadDicomFile); + if (!context_.IsReadOnly()) + { + Register("/instances", UploadDicomFile); + } + else + { + LOG(WARNING) << "READ-ONLY SYSTEM: deactivating POST /instances route"; + } + + // Auto-generated directories Register("/tools", RestApi::AutoListChildren); diff -r 42a7fbf13359 -r ca5622c27d6c OrthancServer/Sources/OrthancRestApi/OrthancRestResources.cpp --- a/OrthancServer/Sources/OrthancRestApi/OrthancRestResources.cpp Wed Sep 25 16:36:43 2024 +0200 +++ b/OrthancServer/Sources/OrthancRestApi/OrthancRestResources.cpp Tue Oct 01 16:01:50 2024 +0200 @@ -4382,7 +4382,7 @@ } else { - LOG(WARNING) << "READ-ONLY SYSTEM: DELETE routes are not available"; + LOG(WARNING) << "READ-ONLY SYSTEM: deactivating DELETE routes"; } Register("/instances/{id}", GetSingleResource); @@ -4439,7 +4439,7 @@ } else { - LOG(WARNING) << "READ-ONLY SYSTEM: PUT /patients/{id}/protected route is not available"; + LOG(WARNING) << "READ-ONLY SYSTEM: deactivating PUT /patients/{id}/protected route"; } diff -r 42a7fbf13359 -r ca5622c27d6c OrthancServer/Sources/ServerContext.cpp --- a/OrthancServer/Sources/ServerContext.cpp Wed Sep 25 16:36:43 2024 +0200 +++ b/OrthancServer/Sources/ServerContext.cpp Tue Oct 01 16:01:50 2024 +0200 @@ -406,7 +406,14 @@ new SharedArchive(lock.GetConfiguration().GetUnsignedIntegerParameter("MediaArchiveSize", 1))); defaultLocalAet_ = lock.GetConfiguration().GetOrthancAET(); jobsEngine_.SetWorkersCount(lock.GetConfiguration().GetUnsignedIntegerParameter("ConcurrentJobs", 2)); + saveJobs_ = lock.GetConfiguration().GetBooleanParameter("SaveJobs", true); + if (readOnly_ && saveJobs_) + { + LOG(WARNING) << "READ-ONLY SYSTEM: SaveJobs = true is incompatible with a ReadOnly system, ignoring this configuration"; + saveJobs_ = false; + } + metricsRegistry_->SetEnabled(lock.GetConfiguration().GetBooleanParameter("MetricsEnabled", true)); // New configuration options in Orthanc 1.5.1 diff -r 42a7fbf13359 -r ca5622c27d6c OrthancServer/Sources/ServerIndex.cpp --- a/OrthancServer/Sources/ServerIndex.cpp Wed Sep 25 16:36:43 2024 +0200 +++ b/OrthancServer/Sources/ServerIndex.cpp Tue Oct 01 16:01:50 2024 +0200 @@ -278,7 +278,7 @@ { Logging::SetCurrentThreadName("DB-STATS"); - static const unsigned int SLEEP_SECONDS = 60; + static const unsigned int SLEEP_SECONDS = 10; if (threadSleepGranularityMilliseconds > 1000) { @@ -359,7 +359,8 @@ done_(false), maximumStorageMode_(MaxStorageMode_Recycle), maximumStorageSize_(0), - maximumPatients_(0) + maximumPatients_(0), + readOnly_(readOnly) { SetTransactionContextFactory(new TransactionContextFactory(context)); diff -r 42a7fbf13359 -r ca5622c27d6c OrthancServer/Sources/ServerIndex.h --- a/OrthancServer/Sources/ServerIndex.h Wed Sep 25 16:36:43 2024 +0200 +++ b/OrthancServer/Sources/ServerIndex.h Tue Oct 01 16:01:50 2024 +0200 @@ -50,6 +50,7 @@ MaxStorageMode maximumStorageMode_; uint64_t maximumStorageSize_; unsigned int maximumPatients_; + bool readOnly_; static void FlushThread(ServerIndex* that, unsigned int threadSleep); diff -r 42a7fbf13359 -r ca5622c27d6c OrthancServer/Sources/main.cpp --- a/OrthancServer/Sources/main.cpp Wed Sep 25 16:36:43 2024 +0200 +++ b/OrthancServer/Sources/main.cpp Tue Oct 01 16:01:50 2024 +0200 @@ -1570,12 +1570,7 @@ if (context.IsReadOnly()) { - LOG(WARNING) << "READ-ONLY SYSTEM: ignoring these configurations: StorageCompression, StoreMD5ForAttachments, OverwriteInstances, MaximumPatientCount, MaximumStorageSize, MaximumStorageMode"; - - if (context.IsSaveJobs()) - { - throw OrthancException(ErrorCode_IncompatibleConfigurations, "\"SaveJobs\" can not be true when \"ReadOnly\" is true"); - } + LOG(WARNING) << "READ-ONLY SYSTEM: ignoring these configurations: StorageCompression, StoreMD5ForAttachments, OverwriteInstances, MaximumPatientCount, MaximumStorageSize, MaximumStorageMode, SaveJobs"; } else {