annotate NewTests/Concurrency/test_concurrency.py @ 624:543e372d2265

added a PG max storage test
author Alain Mazy <am@osimis.io>
date Wed, 14 Feb 2024 11:25:40 +0100
parents 9f867dc595e2
children ed0a51317c0b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
1 import unittest
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
2 import time
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
3 import os
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
4 import threading
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
5 from helpers import OrthancTestCase, Helpers
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
6
598
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
7 from orthanc_api_client import OrthancApiClient, ChangeType
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
8 from orthanc_api_client import helpers as OrthancHelpers
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
9
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
10 import pathlib
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
11 import subprocess
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
12 import glob
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
13 here = pathlib.Path(__file__).parent.resolve()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
14
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
15
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
16 def worker_upload_folder(orthanc_root_url: str, folder: str, repeat: int, worker_id: int):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
17 o = OrthancApiClient(orthanc_root_url)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
18 for i in range(0, repeat):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
19 o.upload_folder(folder, ignore_errors=True)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
20
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
21 def worker_anonymize_study(orthanc_root_url: str, study_id: str, repeat: int, worker_id: int):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
22 o = OrthancApiClient(orthanc_root_url)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
23
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
24 for i in range(0, repeat):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
25 o.studies.anonymize(orthanc_id=study_id, delete_original=False)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
26
597
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
27 def count_changes(changes, type: ChangeType):
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
28 return len([c.change_type for c in changes if c.change_type==type])
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
29
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
30 def worker_upload_delete_study_part(orthanc_root_url: str, folder: str, repeat: int, workers_count: int, worker_id: int):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
31 o = OrthancApiClient(orthanc_root_url)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
32
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
33 all_files = glob.glob(os.path.join(folder, '*.dcm'))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
34
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
35 for i in range(0, repeat):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
36 instances_ids = []
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
37
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
38 for i in range(0, len(all_files)):
598
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
39 if i % workers_count == worker_id: # each thread takes a part
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
40 instances_ids.extend(o.upload_file(all_files[i]))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
41
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
42 for instance_id in instances_ids:
594
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
43 o.instances.delete(orthanc_id=instance_id, ignore_errors=True)
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
44
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
45
598
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
46 def worker_upload_delete_test_dicoms(orthanc_root_url: str, files_count: int, worker_id: int):
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
47 o = OrthancApiClient(orthanc_root_url)
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
48
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
49 instances_ids = []
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
50 counter = 0
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
51
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
52 for i in range(0, files_count):
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
53 counter += 1
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
54 dicom_file = OrthancHelpers.generate_test_dicom_file(width=4, height=4,
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
55 tags = {
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
56 "PatientID" : f"{worker_id}",
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
57 "StudyInstanceUID" : f"{worker_id}",
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
58 "SeriesInstanceUID" : f"{worker_id}.{counter%10}"
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
59 })
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
60 instances_ids.extend(o.upload(dicom_file))
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
61
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
62 study_id = o.instances.get_parent_study_id(instances_ids[0])
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
63 o.studies.delete(orthanc_id=study_id)
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
64
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
65
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
66 class TestConcurrency(OrthancTestCase):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
67
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
68 @classmethod
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
69 def terminate(cls):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
70
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
71 if Helpers.is_docker():
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
72 subprocess.run(["docker", "rm", "-f", "pg-server"])
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
73 else:
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
74 cls.pg_service_process.terminate()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
75
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
76
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
77 @classmethod
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
78 def prepare(cls):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
79 test_name = "Concurrency"
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
80 cls._storage_name = "concurrency"
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
81
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
82 print(f'-------------- preparing {test_name} tests')
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
83
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
84 cls.clear_storage(storage_name=cls._storage_name)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
85
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
86 pg_hostname = "localhost"
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
87 if Helpers.is_docker():
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
88 pg_hostname = "pg-server"
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
89 cls.create_docker_network("concurrency")
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
90
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
91 config = {
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
92 "PostgreSQL" : {
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
93 "EnableStorage": False,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
94 "EnableIndex": True,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
95 "Host": pg_hostname,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
96 "Port": 5432,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
97 "Database": "postgres",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
98 "Username": "postgres",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
99 "Password": "postgres",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
100 "IndexConnectionsCount": 10,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
101 "MaximumConnectionRetries" : 2000,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
102 "ConnectionRetryInterval" : 5,
617
Alain Mazy <am@osimis.io>
parents: 598
diff changeset
103 "TransactionMode": "ReadCommitted",
Alain Mazy <am@osimis.io>
parents: 598
diff changeset
104 #"TransactionMode": "Serializable",
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
105 "EnableVerboseLogs": True
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
106 },
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
107 "AuthenticationEnabled": False,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
108 "OverwriteInstances": True,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
109 "JobsEngineThreadsCount" : {
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
110 "ResourceModification": 8
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
111 },
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
112 }
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
113
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
114 config_path = cls.generate_configuration(
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
115 config_name=f"{test_name}",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
116 storage_name=cls._storage_name,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
117 config=config,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
118 plugins=Helpers.plugins
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
119 )
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
120
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
121 # launch the docker PG server
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
122 print('--------------- launching PostgreSQL server ------------------')
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
123
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
124 cls.pg_service_process = subprocess.Popen([
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
125 "docker", "run", "--rm",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
126 "-p", "5432:5432",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
127 "--network", "concurrency",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
128 "--name", "pg-server",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
129 "--env", "POSTGRES_HOST_AUTH_METHOD=trust",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
130 "postgres:15"])
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
131 time.sleep(5)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
132
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
133 if Helpers.break_before_preparation:
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
134 print(f"++++ It is now time to start your Orthanc under tests with configuration file '{config_path}' +++++")
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
135 input("Press Enter to continue")
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
136 else:
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
137 cls.launch_orthanc_under_tests(
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
138 config_name=f"{test_name}",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
139 storage_name=cls._storage_name,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
140 config=config,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
141 plugins=Helpers.plugins,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
142 docker_network="concurrency"
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
143 )
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
144
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
145 cls.o = OrthancApiClient(cls.o._root_url)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
146 cls.o.wait_started()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
147 cls.o.delete_all_content()
597
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
148
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
149 def check_is_empty(self):
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
150 self.assertEqual(0, len(self.o.studies.get_all_ids()))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
151 self.assertEqual(0, len(self.o.series.get_all_ids()))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
152 self.assertEqual(0, len(self.o.instances.get_all_ids()))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
153
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
154 stats = self.o.get_json("/statistics")
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
155 self.assertEqual(0, stats.get("CountPatients"))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
156 self.assertEqual(0, stats.get("CountStudies"))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
157 self.assertEqual(0, stats.get("CountSeries"))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
158 self.assertEqual(0, stats.get("CountInstances"))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
159 self.assertEqual(0, int(stats.get("TotalDiskSize")))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
160 # time.sleep(10000)
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
161 self.assertTrue(self.is_storage_empty(self._storage_name))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
162
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
163 # all changes shall have been deleted as well
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
164 changes, last_change, done = self.o.get_changes(since=0, limit=100000)
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
165 self.assertTrue(done)
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
166 self.assertEqual(0, len(changes))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
167
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
168
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
169 def execute_workers(self, worker_func, worker_args, workers_count):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
170 workers = []
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
171 for i in range(0, workers_count):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
172 t = threading.Thread(target=worker_func, args=worker_args + (i, ))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
173 workers.append(t)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
174 t.start()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
175
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
176 for t in workers:
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
177 t.join()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
178
621
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
179 # TODO: reactivate once 1.12.4 is released. It needs this fix: https://orthanc.uclouvain.be/hg/orthanc/rev/acdb8d78bf99
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
180 # def test_concurrent_uploads_same_study(self):
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
181 # if self.o.is_orthanc_version_at_least(1, 12, 4):
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
182
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
183 # self.o.delete_all_content()
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
184 # self.clear_storage(storage_name=self._storage_name)
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
185
621
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
186 # start_time = time.time()
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
187 # workers_count = 20
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
188 # repeat_count = 10
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
189
621
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
190 # # massively reupload the same study multiple times with OverwriteInstances set to true
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
191 # # Make sure the studies, series and instances are created only once
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
192 # self.execute_workers(
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
193 # worker_func=worker_upload_folder,
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
194 # worker_args=(self.o._root_url, here / "../../Database/Knee", repeat_count,),
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
195 # workers_count=workers_count)
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
196
621
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
197 # elapsed = time.time() - start_time
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
198 # print(f"TIMING test_concurrent_uploads_same_study with {workers_count} workers and {repeat_count}x repeat: {elapsed:.3f} s")
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
199
621
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
200 # self.assertTrue(self.o.is_alive())
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
201
621
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
202 # self.assertEqual(1, len(self.o.studies.get_all_ids()))
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
203 # self.assertEqual(2, len(self.o.series.get_all_ids()))
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
204 # self.assertEqual(50, len(self.o.instances.get_all_ids()))
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
205
621
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
206 # stats = self.o.get_json("/statistics")
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
207 # self.assertEqual(1, stats.get("CountPatients"))
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
208 # self.assertEqual(1, stats.get("CountStudies"))
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
209 # self.assertEqual(2, stats.get("CountSeries"))
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
210 # self.assertEqual(50, stats.get("CountInstances"))
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
211 # self.assertEqual(4118738, int(stats.get("TotalDiskSize")))
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
212
621
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
213 # self.o.instances.delete(orthanc_ids=self.o.instances.get_all_ids())
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
214
621
9f867dc595e2 fix concurrency tests
Alain Mazy <am@osimis.io>
parents: 617
diff changeset
215 # self.check_is_empty()
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
216
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
217 def test_concurrent_anonymize_same_study(self):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
218 self.o.delete_all_content()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
219 self.clear_storage(storage_name=self._storage_name)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
220
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
221 self.o.upload_folder(here / "../../Database/Knee")
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
222 study_id = self.o.studies.get_all_ids()[0]
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
223
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
224 start_time = time.time()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
225 workers_count = 4
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
226 repeat_count = 10
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
227
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
228 # massively anonymize the same study. This generates new studies and is a
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
229 # good way to simulate ingestion of new studies
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
230 self.execute_workers(
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
231 worker_func=worker_anonymize_study,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
232 worker_args=(self.o._root_url, study_id, repeat_count,),
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
233 workers_count=workers_count)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
234
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
235 elapsed = time.time() - start_time
593
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
236 print(f"TIMING test_concurrent_anonymize_same_study with {workers_count} workers and {repeat_count}x repeat: {elapsed:.3f} s")
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
237
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
238 self.assertTrue(self.o.is_alive())
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
239
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
240 self.assertEqual(1 + workers_count * repeat_count, len(self.o.studies.get_all_ids()))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
241 self.assertEqual(2 * (1 + workers_count * repeat_count), len(self.o.series.get_all_ids()))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
242 self.assertEqual(50 * (1 + workers_count * repeat_count), len(self.o.instances.get_all_ids()))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
243
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
244 stats = self.o.get_json("/statistics")
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
245 self.assertEqual(1 + workers_count * repeat_count, stats.get("CountPatients"))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
246 self.assertEqual(1 + workers_count * repeat_count, stats.get("CountStudies"))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
247 self.assertEqual(2 * (1 + workers_count * repeat_count), stats.get("CountSeries"))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
248 self.assertEqual(50 * (1 + workers_count * repeat_count), stats.get("CountInstances"))
597
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
249 changes, last_change, done = self.o.get_changes(since=0, limit=100000)
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
250 self.assertTrue(done)
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
251
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
252 self.assertEqual(1 + workers_count * repeat_count, count_changes(changes, ChangeType.NEW_PATIENT))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
253 self.assertEqual(1 + workers_count * repeat_count, count_changes(changes, ChangeType.NEW_STUDY))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
254 self.assertEqual(2 * (1 + workers_count * repeat_count), count_changes(changes, ChangeType.NEW_SERIES))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
255 self.assertEqual(50 * (1 + workers_count * repeat_count), count_changes(changes, ChangeType.NEW_INSTANCE))
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
256
593
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
257 start_time = time.time()
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
258
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
259 self.o.instances.delete(orthanc_ids=self.o.instances.get_all_ids())
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
260
593
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
261 elapsed = time.time() - start_time
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
262 print(f"TIMING test_concurrent_anonymize_same_study deletion took: {elapsed:.3f} s")
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
263
597
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
264 self.check_is_empty()
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
265
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
266
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
267 def test_upload_delete_same_study_from_multiple_threads(self):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
268 self.o.delete_all_content()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
269 self.clear_storage(storage_name=self._storage_name)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
270
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
271 start_time = time.time()
596
b1e1c7149a37 new PG upgrades tests
Alain Mazy <am@osimis.io>
parents: 594
diff changeset
272 overall_repeat = 10
594
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
273
598
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
274 for i in range(0, overall_repeat):
594
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
275 workers_count = 5
596
b1e1c7149a37 new PG upgrades tests
Alain Mazy <am@osimis.io>
parents: 594
diff changeset
276 repeat_count = 3
594
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
277
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
278 # massively upload and delete the same study. Each worker is writing a part of the instances and deleting them.
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
279 # We are trying to have multiple workers deleting the last instance of a study at the same time.
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
280 self.execute_workers(
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
281 worker_func=worker_upload_delete_study_part,
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
282 worker_args=(self.o._root_url, here / "../../Database/Knee/T1", repeat_count, workers_count, ),
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
283 workers_count=workers_count)
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
284
597
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
285 self.check_is_empty()
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
286
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
287 elapsed = time.time() - start_time
596
b1e1c7149a37 new PG upgrades tests
Alain Mazy <am@osimis.io>
parents: 594
diff changeset
288 print(f"TIMING test_upload_delete_same_study_from_multiple_threads with {workers_count} workers and {repeat_count}x repeat ({overall_repeat}x): {elapsed:.3f} s")
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
289
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
290
598
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
291 def test_upload_multiple_studies_from_multiple_threads(self):
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
292 self.o.delete_all_content()
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
293 self.clear_storage(storage_name=self._storage_name)
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
294
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
295 start_time = time.time()
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
296 overall_repeat = 3
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
297
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
298 for i in range(0, overall_repeat):
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
299 files_count = 25
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
300 workers_count = 10
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
301
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
302 # massively upload and delete all studies from the test detabase. Each worker is writing all instances from a folder and then deletes them.
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
303 # This test is only measuring performances.
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
304 self.execute_workers(
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
305 worker_func=worker_upload_delete_test_dicoms,
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
306 worker_args=(self.o._root_url, files_count, ),
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
307 workers_count=workers_count)
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
308
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
309 self.check_is_empty()
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
310
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
311 elapsed = time.time() - start_time
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
312 print(f"TIMING test_upload_multiple_studies_from_multiple_threads with {workers_count} workers and {files_count} files and repeat {overall_repeat}x: {elapsed:.3f} s")
b9ae7c59fee9 new concurrency test
Alain Mazy <am@osimis.io>
parents: 597
diff changeset
313
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
314 # transfers + dicomweb