annotate NewTests/Concurrency/test_concurrency.py @ 597:0cbefe7369ee

concurrency: test changes
author Alain Mazy <am@osimis.io>
date Fri, 22 Dec 2023 17:42:35 +0100
parents b1e1c7149a37
children b9ae7c59fee9
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
597
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
7 from orthanc_api_client import OrthancApiClient, generate_test_dicom_file, ChangeType
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
8 from orthanc_tools import OrthancTestDbPopulator
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
9
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)):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
39 if i % workers_count == worker_id:
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
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
46 class TestConcurrency(OrthancTestCase):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
47
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
48 @classmethod
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
49 def terminate(cls):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
50
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
51 if Helpers.is_docker():
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
52 subprocess.run(["docker", "rm", "-f", "pg-server"])
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
53 else:
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
54 cls.pg_service_process.terminate()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
55
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
56
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
57 @classmethod
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
58 def prepare(cls):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
59 test_name = "Concurrency"
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
60 cls._storage_name = "concurrency"
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
61
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
62 print(f'-------------- preparing {test_name} tests')
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
63
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
64 cls.clear_storage(storage_name=cls._storage_name)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
65
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
66 pg_hostname = "localhost"
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
67 if Helpers.is_docker():
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
68 pg_hostname = "pg-server"
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
69 cls.create_docker_network("concurrency")
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 config = {
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
72 "PostgreSQL" : {
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
73 "EnableStorage": False,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
74 "EnableIndex": True,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
75 "Host": pg_hostname,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
76 "Port": 5432,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
77 "Database": "postgres",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
78 "Username": "postgres",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
79 "Password": "postgres",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
80 "IndexConnectionsCount": 10,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
81 "MaximumConnectionRetries" : 2000,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
82 "ConnectionRetryInterval" : 5,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
83 "TransactionMode": "READ COMMITTED",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
84 #"TransactionMode": "SERIALIZABLE",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
85 "EnableVerboseLogs": True
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
86 },
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
87 "AuthenticationEnabled": False,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
88 "OverwriteInstances": True,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
89 "JobsEngineThreadsCount" : {
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
90 "ResourceModification": 8
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
91 },
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
92 }
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
93
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
94 config_path = cls.generate_configuration(
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
95 config_name=f"{test_name}",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
96 storage_name=cls._storage_name,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
97 config=config,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
98 plugins=Helpers.plugins
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
99 )
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
100
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
101 # launch the docker PG server
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
102 print('--------------- launching PostgreSQL server ------------------')
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
103
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
104 cls.pg_service_process = subprocess.Popen([
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
105 "docker", "run", "--rm",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
106 "-p", "5432:5432",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
107 "--network", "concurrency",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
108 "--name", "pg-server",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
109 "--env", "POSTGRES_HOST_AUTH_METHOD=trust",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
110 "postgres:15"])
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
111 time.sleep(5)
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 if Helpers.break_before_preparation:
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
114 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
115 input("Press Enter to continue")
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
116 else:
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
117 cls.launch_orthanc_under_tests(
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
118 config_name=f"{test_name}",
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
119 storage_name=cls._storage_name,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
120 config=config,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
121 plugins=Helpers.plugins,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
122 docker_network="concurrency"
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
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
125 cls.o = OrthancApiClient(cls.o._root_url)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
126 cls.o.wait_started()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
127 cls.o.delete_all_content()
597
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
128
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
129 def check_is_empty(self):
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
130 self.assertEqual(0, len(self.o.studies.get_all_ids()))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
131 self.assertEqual(0, len(self.o.series.get_all_ids()))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
132 self.assertEqual(0, len(self.o.instances.get_all_ids()))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
133
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
134 stats = self.o.get_json("/statistics")
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
135 self.assertEqual(0, stats.get("CountPatients"))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
136 self.assertEqual(0, stats.get("CountStudies"))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
137 self.assertEqual(0, stats.get("CountSeries"))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
138 self.assertEqual(0, stats.get("CountInstances"))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
139 self.assertEqual(0, int(stats.get("TotalDiskSize")))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
140 # time.sleep(10000)
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
141 self.assertTrue(self.is_storage_empty(self._storage_name))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
142
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
143 # all changes shall have been deleted as well
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
144 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
145 self.assertTrue(done)
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
146 self.assertEqual(0, len(changes))
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
147
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
148
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
149 def execute_workers(self, worker_func, worker_args, workers_count):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
150 workers = []
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
151 for i in range(0, workers_count):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
152 t = threading.Thread(target=worker_func, args=worker_args + (i, ))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
153 workers.append(t)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
154 t.start()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
155
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
156 for t in workers:
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
157 t.join()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
158
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
159 def test_concurrent_uploads_same_study(self):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
160 self.o.delete_all_content()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
161 self.clear_storage(storage_name=self._storage_name)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
162
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
163 start_time = time.time()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
164 workers_count = 20
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
165 repeat_count = 1
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
166
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
167 # massively reupload the same study multiple times with OverwriteInstances set to true
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
168 # Make sure the studies, series and instances are created only once
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
169 self.execute_workers(
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
170 worker_func=worker_upload_folder,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
171 worker_args=(self.o._root_url, here / "../../Database/Knee", repeat_count,),
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
172 workers_count=workers_count)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
173
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
174 elapsed = time.time() - start_time
593
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
175 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
176
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
177 self.assertTrue(self.o.is_alive())
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
178
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
179 self.assertEqual(1, len(self.o.studies.get_all_ids()))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
180 self.assertEqual(2, len(self.o.series.get_all_ids()))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
181 self.assertEqual(50, len(self.o.instances.get_all_ids()))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
182
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
183 stats = self.o.get_json("/statistics")
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
184 self.assertEqual(1, stats.get("CountPatients"))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
185 self.assertEqual(1, stats.get("CountStudies"))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
186 self.assertEqual(2, stats.get("CountSeries"))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
187 self.assertEqual(50, stats.get("CountInstances"))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
188 self.assertEqual(4118738, int(stats.get("TotalDiskSize")))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
189
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
190 self.o.instances.delete(orthanc_ids=self.o.instances.get_all_ids())
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
191
597
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
192 self.check_is_empty()
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
193
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
194 def test_concurrent_anonymize_same_study(self):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
195 self.o.delete_all_content()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
196 self.clear_storage(storage_name=self._storage_name)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
197
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
198 self.o.upload_folder(here / "../../Database/Knee")
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
199 study_id = self.o.studies.get_all_ids()[0]
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
200
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
201 start_time = time.time()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
202 workers_count = 4
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
203 repeat_count = 10
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
204
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
205 # massively anonymize the same study. This generates new studies and is a
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
206 # good way to simulate ingestion of new studies
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
207 self.execute_workers(
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
208 worker_func=worker_anonymize_study,
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
209 worker_args=(self.o._root_url, study_id, repeat_count,),
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
210 workers_count=workers_count)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
211
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
212 elapsed = time.time() - start_time
593
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
213 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
214
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
215 self.assertTrue(self.o.is_alive())
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 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
218 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
219 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
220
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
221 stats = self.o.get_json("/statistics")
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
222 self.assertEqual(1 + workers_count * repeat_count, stats.get("CountPatients"))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
223 self.assertEqual(1 + workers_count * repeat_count, stats.get("CountStudies"))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
224 self.assertEqual(2 * (1 + workers_count * repeat_count), stats.get("CountSeries"))
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
225 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
226 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
227 self.assertTrue(done)
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
228
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
229 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
230 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
231 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
232 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
233
593
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
234 start_time = time.time()
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
235
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
236 self.o.instances.delete(orthanc_ids=self.o.instances.get_all_ids())
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
237
593
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
238 elapsed = time.time() - start_time
f4f0e2d24a51 more pg-transactions tests
Alain Mazy <am@osimis.io>
parents: 592
diff changeset
239 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
240
597
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
241 self.check_is_empty()
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
242
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 def test_upload_delete_same_study_from_multiple_threads(self):
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
245 self.o.delete_all_content()
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
246 self.clear_storage(storage_name=self._storage_name)
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
247
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
248 start_time = time.time()
596
b1e1c7149a37 new PG upgrades tests
Alain Mazy <am@osimis.io>
parents: 594
diff changeset
249 overall_repeat = 10
594
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
250
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
251 for i in range(0, 10):
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
252 workers_count = 5
596
b1e1c7149a37 new PG upgrades tests
Alain Mazy <am@osimis.io>
parents: 594
diff changeset
253 repeat_count = 3
594
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
254
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
255 # 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
256 # 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
257 self.execute_workers(
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
258 worker_func=worker_upload_delete_study_part,
27be80b4b1a9 fix test
Alain Mazy <am@osimis.io>
parents: 593
diff changeset
259 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
260 workers_count=workers_count)
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
261
597
0cbefe7369ee concurrency: test changes
Alain Mazy <am@osimis.io>
parents: 596
diff changeset
262 self.check_is_empty()
592
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
263
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
264 elapsed = time.time() - start_time
596
b1e1c7149a37 new PG upgrades tests
Alain Mazy <am@osimis.io>
parents: 594
diff changeset
265 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
266
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
267
6753d96dd71f new concurrency tests
Alain Mazy <am@osimis.io>
parents:
diff changeset
268 # transfers + dicomweb