changeset 7159:c5e867a181e9 default tip

fix storage commitment triggered by c-store
author Alain Mazy <am@orthanc.team>
date Fri, 25 Sep 2026 16:07:31 +0200
parents be63ecbe0bca
children
files OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.cpp OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.h OrthancServer/Sources/StorageCommitmentReports.cpp OrthancServer/Sources/StorageCommitmentReports.h
diffstat 5 files changed, 25 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp	Thu Sep 24 17:22:41 2026 +0200
+++ b/OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp	Fri Sep 25 16:07:31 2026 +0200
@@ -2395,7 +2395,7 @@
     }
     else
     {
-      std::list<std::string> sopClassUids, sopInstanceUids;
+      std::vector<std::string> sopClassUids, sopInstanceUids;
 
       if (json.isMember(ORTHANC_RESOURCES))
       {
@@ -2523,17 +2523,7 @@
         // Create a "pending" storage commitment report BEFORE the
         // actual SCU call in order to avoid race conditions
         std::unique_ptr<StorageCommitmentReports::Report> request(new StorageCommitmentReports::Report(remoteAet));
-
-        std::list<std::string>::const_iterator itInstanceUid = sopInstanceUids.begin();
-        std::list<std::string>::const_iterator itClassUid = sopClassUids.begin();
-
-        while (itInstanceUid != sopInstanceUids.end() && itClassUid != sopClassUids.end())
-        {
-          request->AddRequestedInstance(*itClassUid, *itInstanceUid);
-
-          ++itInstanceUid;
-          ++itClassUid;
-        }
+        request->AddRequestedInstances(sopClassUids, sopInstanceUids);
 
         context.GetStorageCommitmentReports().Store(
           transactionUid, request.release());
@@ -2543,7 +2533,7 @@
 
         std::vector<std::string> a(sopClassUids.begin(), sopClassUids.end());
         std::vector<std::string> b(sopInstanceUids.begin(), sopInstanceUids.end());
-        DicomAssociation::RequestStorageCommitment(parameters, transactionUid, a, b);
+        DicomAssociation::RequestStorageCommitment(parameters, transactionUid, sopClassUids, sopInstanceUids);
       }
 
       Json::Value result = Json::objectValue;
--- a/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.cpp	Thu Sep 24 17:22:41 2026 +0200
+++ b/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.cpp	Fri Sep 25 16:07:31 2026 +0200
@@ -91,13 +91,12 @@
 
         // Create a "pending" storage commitment report BEFORE the
         // actual SCU call in order to avoid race conditions
-        context_.GetStorageCommitmentReports().Store(
-          transactionUid_, new StorageCommitmentReports::Report(remoteAet));
+        std::unique_ptr<StorageCommitmentReports::Report> request(new StorageCommitmentReports::Report(remoteAet));
+        request->AddRequestedInstances(sopClassUids_, sopInstanceUids_);
+        
+        context_.GetStorageCommitmentReports().Store(transactionUid_, request.release());
 
-        std::vector<std::string> a(sopClassUids_.begin(), sopClassUids_.end());
-        std::vector<std::string> b(sopInstanceUids_.begin(), sopInstanceUids_.end());
-
-        DicomAssociation::RequestStorageCommitment(parameters_, transactionUid_, a, b);
+        DicomAssociation::RequestStorageCommitment(parameters_, transactionUid_, sopClassUids_, sopInstanceUids_);
       }
     }
 
--- a/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.h	Thu Sep 24 17:22:41 2026 +0200
+++ b/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.h	Fri Sep 25 16:07:31 2026 +0200
@@ -44,8 +44,8 @@
 
     // For storage commitment
     std::string             transactionUid_;
-    std::list<std::string>  sopInstanceUids_;
-    std::list<std::string>  sopClassUids_;
+    std::vector<std::string>  sopInstanceUids_;
+    std::vector<std::string>  sopClassUids_;
 
     void OpenConnection();
 
--- a/OrthancServer/Sources/StorageCommitmentReports.cpp	Thu Sep 24 17:22:41 2026 +0200
+++ b/OrthancServer/Sources/StorageCommitmentReports.cpp	Fri Sep 25 16:07:31 2026 +0200
@@ -41,15 +41,24 @@
     }
   }
 
-  void StorageCommitmentReports::Report::AddRequestedInstance(const std::string& sopClassUid,
-                                                              const std::string& sopInstanceUid)
+  void StorageCommitmentReports::Report::AddRequestedInstances(const std::vector<std::string>& sopClassesUids,
+                                                               const std::vector<std::string>& sopInstancesUids)
   {
     if (isComplete_)
     {
       throw OrthancException(ErrorCode_BadSequenceOfCalls);
     }
 
-    requetsedInstances_[sopInstanceUid] = sopClassUid;
+    if (sopClassesUids.size() != sopInstancesUids.size())
+    {
+      throw OrthancException(ErrorCode_InternalError, "SOPClassesUIDs & SOPInstancesUIDs size mismatch");
+    }
+
+    for (size_t i = 0; i < sopClassesUids.size(); ++i)
+    {
+      requetsedInstances_[sopInstancesUids[i]] = sopClassesUids[i];
+    }
+
   }
 
 
@@ -75,7 +84,7 @@
   {
     if (isComplete_)
     {
-      throw OrthancException(ErrorCode_BadSequenceOfCalls);
+      THROW_WITH_FILE_AND_LINE_INFO(ErrorCode_BadSequenceOfCalls);
     }
     else
     {
--- a/OrthancServer/Sources/StorageCommitmentReports.h	Thu Sep 24 17:22:41 2026 +0200
+++ b/OrthancServer/Sources/StorageCommitmentReports.h	Fri Sep 25 16:07:31 2026 +0200
@@ -78,8 +78,8 @@
 
       void MarkAsComplete();
 
-      void AddRequestedInstance(const std::string& sopClassUid,
-                                const std::string& sopInstanceUid);
+      void AddRequestedInstances(const std::vector<std::string>& sopClassesUids,
+                                 const std::vector<std::string>& sopInstancesUids);
 
       void AddSuccess(const std::string& sopClassUid,
                       const std::string& sopInstanceUid);