annotate UnitTestsSources/MultiThreadingTests.cpp @ 2558:57f81b988713 jobs

cont
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 03 May 2018 15:24:33 +0200
parents b4516a6f214b
children 9b7680dee75d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
827
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
1 /**
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
1900
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1681
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
1288
6e7e5ed91c2d upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1009
diff changeset
4 * Department, University Hospital of Liege, Belgium
2447
878b59270859 upgrade to year 2018
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2382
diff changeset
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium
827
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
6 *
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
7 * This program is free software: you can redistribute it and/or
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
8 * modify it under the terms of the GNU General Public License as
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
9 * published by the Free Software Foundation, either version 3 of the
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
10 * License, or (at your option) any later version.
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
11 *
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
12 * In addition, as a special exception, the copyright holders of this
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
13 * program give permission to link the code of its release with the
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
15 * that use the same license as the "OpenSSL" library), and distribute
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
16 * the linked executables. You must obey the GNU General Public License
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
17 * in all respects for all of the code used other than "OpenSSL". If you
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
18 * modify file(s) with this exception, you may extend this exception to
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
19 * your version of the file(s), but you are not obligated to do so. If
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
20 * you do not wish to do so, delete this exception statement from your
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
21 * version. If you delete this exception statement from all source files
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
22 * in the program, then also delete it here.
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
23 *
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
24 * This program is distributed in the hope that it will be useful, but
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
25 * WITHOUT ANY WARRANTY; without even the implied warranty of
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
27 * General Public License for more details.
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
28 *
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
29 * You should have received a copy of the GNU General Public License
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
30 * along with this program. If not, see <http://www.gnu.org/licenses/>.
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
31 **/
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
32
3d6f9b7d0add precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 776
diff changeset
33
831
84513f2ee1f3 pch for unit tests and server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 827
diff changeset
34 #include "PrecompiledHeadersUnitTests.h"
723
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 #include "gtest/gtest.h"
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36
781
f0ac3a53ccf2 scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 779
diff changeset
37 #include "../OrthancServer/Scheduler/ServerScheduler.h"
723
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 #include "../Core/OrthancException.h"
2143
fd5875662670 creation of namespace SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2140
diff changeset
39 #include "../Core/SystemToolbox.h"
723
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 #include "../Core/Toolbox.h"
760
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
41 #include "../Core/MultiThreading/Locker.h"
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
42 #include "../Core/MultiThreading/Mutex.h"
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
43 #include "../Core/MultiThreading/ReaderWriterLock.h"
723
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 using namespace Orthanc;
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 namespace
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 {
1396
ac4efabeb80c Migration of the orthanc-client as a separate project
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1304
diff changeset
49 class DynamicInteger : public IDynamicObject
723
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 {
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 private:
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 int value_;
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 std::set<int>& target_;
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 public:
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 DynamicInteger(int value, std::set<int>& target) :
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 value_(value), target_(target)
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 {
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 }
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 int GetValue() const
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 {
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 return value_;
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 }
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 };
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 }
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 TEST(MultiThreading, SharedMessageQueueBasic)
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 {
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 std::set<int> s;
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 SharedMessageQueue q;
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 ASSERT_TRUE(q.WaitEmpty(0));
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 q.Enqueue(new DynamicInteger(10, s));
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 ASSERT_FALSE(q.WaitEmpty(1));
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 q.Enqueue(new DynamicInteger(20, s));
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 q.Enqueue(new DynamicInteger(30, s));
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 q.Enqueue(new DynamicInteger(40, s));
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 std::auto_ptr<DynamicInteger> i;
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(10, i->GetValue());
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(20, i->GetValue());
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(30, i->GetValue());
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 ASSERT_FALSE(q.WaitEmpty(1));
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 i.reset(dynamic_cast<DynamicInteger*>(q.Dequeue(1))); ASSERT_EQ(40, i->GetValue());
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 ASSERT_TRUE(q.WaitEmpty(0));
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 ASSERT_EQ(NULL, q.Dequeue(1));
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 }
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 TEST(MultiThreading, SharedMessageQueueClean)
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 {
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 std::set<int> s;
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 try
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 {
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 SharedMessageQueue q;
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 q.Enqueue(new DynamicInteger(10, s));
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 q.Enqueue(new DynamicInteger(20, s));
1583
9ea3d082b064 got rid of custom exceptions
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1582
diff changeset
101 throw OrthancException(ErrorCode_InternalError);
723
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 }
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 catch (OrthancException&)
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 {
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 }
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 }
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107
0da078f3affc multithreading tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108
760
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
109 TEST(MultiThreading, Mutex)
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
110 {
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
111 Mutex mutex;
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
112 Locker locker(mutex);
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
113 }
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
114
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
115
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
116 TEST(MultiThreading, ReaderWriterLock)
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
117 {
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
118 ReaderWriterLock lock;
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
119
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
120 {
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
121 Locker locker1(lock.ForReader());
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
122 Locker locker2(lock.ForReader());
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
123 }
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
124
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
125 {
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
126 Locker locker3(lock.ForWriter());
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
127 }
b2a62f22fbe8 lock abstraction
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 723
diff changeset
128 }
769
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
129
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
130
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
131
2382
7284093111b0 big reorganization to cleanly separate framework vs. server
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2244
diff changeset
132 #include "../Core/DicomNetworking/ReusableDicomUserConnection.h"
769
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
133
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
134 TEST(ReusableDicomUserConnection, DISABLED_Basic)
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
135 {
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
136 ReusableDicomUserConnection c;
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
137 c.SetMillisecondsBeforeClose(200);
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
138 printf("START\n"); fflush(stdout);
775
d3ba35466225 integration mainline -> lua-scripting
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 770 769
diff changeset
139
769
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
140 {
1427
d710ea64f0fd Custom setting of the local AET during C-Store SCU (both in Lua and in the REST API)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1396
diff changeset
141 RemoteModalityParameters remote("STORESCP", "localhost", 2000, ModalityManufacturer_Generic);
d710ea64f0fd Custom setting of the local AET during C-Store SCU (both in Lua and in the REST API)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1396
diff changeset
142 ReusableDicomUserConnection::Locker lock(c, "ORTHANC", remote);
2222
21713ce8717b Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2143
diff changeset
143 lock.GetConnection().StoreFile("/home/jodogne/DICOM/Cardiac/MR.X.1.2.276.0.7230010.3.1.4.2831157719.2256.1336386844.676281");
769
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
144 }
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
145
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
146 printf("**\n"); fflush(stdout);
2242
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2222
diff changeset
147 SystemToolbox::USleep(1000000);
769
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
148 printf("**\n"); fflush(stdout);
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
149
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
150 {
1427
d710ea64f0fd Custom setting of the local AET during C-Store SCU (both in Lua and in the REST API)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1396
diff changeset
151 RemoteModalityParameters remote("STORESCP", "localhost", 2000, ModalityManufacturer_Generic);
d710ea64f0fd Custom setting of the local AET during C-Store SCU (both in Lua and in the REST API)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1396
diff changeset
152 ReusableDicomUserConnection::Locker lock(c, "ORTHANC", remote);
2222
21713ce8717b Fix handling of Move Originator AET and ID in C-MOVE SCP
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2143
diff changeset
153 lock.GetConnection().StoreFile("/home/jodogne/DICOM/Cardiac/MR.X.1.2.276.0.7230010.3.1.4.2831157719.2256.1336386844.676277");
769
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
154 }
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
155
2140
aa4b8895cd23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1907
diff changeset
156 SystemToolbox::ServerBarrier();
769
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
157 printf("DONE\n"); fflush(stdout);
3f946e5c3802 ReusableDicomUserConnection
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
158 }
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
159
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
160
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
161
1000
13e230bbd882 rename filter to command
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 995
diff changeset
162 class Tutu : public IServerCommand
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
163 {
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
164 private:
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
165 int factor_;
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
166
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
167 public:
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
168 Tutu(int f) : factor_(f)
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
169 {
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
170 }
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
171
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
172 virtual bool Apply(ListOfStrings& outputs,
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
173 const ListOfStrings& inputs)
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
174 {
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
175 for (ListOfStrings::const_iterator
1304
7b6925b0890d cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
176 it = inputs.begin(); it != inputs.end(); ++it)
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
177 {
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
178 int a = boost::lexical_cast<int>(*it);
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
179 int b = factor_ * a;
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
180
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
181 printf("%d * %d = %d\n", a, factor_, b);
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
182
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
183 //if (a == 84) { printf("BREAK\n"); return false; }
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
184
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
185 outputs.push_back(boost::lexical_cast<std::string>(b));
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
186 }
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
187
2242
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2222
diff changeset
188 SystemToolbox::USleep(30000);
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
189
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
190 return true;
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
191 }
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
192 };
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
193
768
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
194
770
a64ca424e0e2 fix test
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 768
diff changeset
195 static void Tata(ServerScheduler* s, ServerJob* j, bool* done)
768
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
196 {
1000
13e230bbd882 rename filter to command
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 995
diff changeset
197 typedef IServerCommand::ListOfStrings ListOfStrings;
779
76eb563f08f0 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 777
diff changeset
198
770
a64ca424e0e2 fix test
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 768
diff changeset
199 while (!(*done))
768
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
200 {
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
201 ListOfStrings l;
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
202 s->GetListOfJobs(l);
1304
7b6925b0890d cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
203 for (ListOfStrings::iterator it = l.begin(); it != l.end(); ++it)
7b6925b0890d cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
204 {
7b6925b0890d cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
205 printf(">> %s: %0.1f\n", it->c_str(), 100.0f * s->GetProgress(*it));
7b6925b0890d cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
206 }
2242
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2222
diff changeset
207 SystemToolbox::USleep(3000);
768
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
208 }
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
209 }
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
210
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
211
1009
26642cecd36d clearer job interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1005
diff changeset
212 TEST(MultiThreading, ServerScheduler)
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
213 {
995
8c67382f44a7 limit number of jobs in the scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 994
diff changeset
214 ServerScheduler scheduler(10);
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
215
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
216 ServerJob job;
1000
13e230bbd882 rename filter to command
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 995
diff changeset
217 ServerCommandInstance& f2 = job.AddCommand(new Tutu(2));
13e230bbd882 rename filter to command
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 995
diff changeset
218 ServerCommandInstance& f3 = job.AddCommand(new Tutu(3));
13e230bbd882 rename filter to command
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 995
diff changeset
219 ServerCommandInstance& f4 = job.AddCommand(new Tutu(4));
13e230bbd882 rename filter to command
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 995
diff changeset
220 ServerCommandInstance& f5 = job.AddCommand(new Tutu(5));
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
221 f2.AddInput(boost::lexical_cast<std::string>(42));
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
222 //f3.AddInput(boost::lexical_cast<std::string>(42));
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
223 //f4.AddInput(boost::lexical_cast<std::string>(42));
1009
26642cecd36d clearer job interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1005
diff changeset
224 f2.ConnectOutput(f3);
26642cecd36d clearer job interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1005
diff changeset
225 f3.ConnectOutput(f4);
26642cecd36d clearer job interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1005
diff changeset
226 f4.ConnectOutput(f5);
26642cecd36d clearer job interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1005
diff changeset
227
26642cecd36d clearer job interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1005
diff changeset
228 f3.SetConnectedToSink(true);
26642cecd36d clearer job interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1005
diff changeset
229 f5.SetConnectedToSink(true);
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
230
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
231 job.SetDescription("tutu");
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
232
770
a64ca424e0e2 fix test
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 768
diff changeset
233 bool done = false;
a64ca424e0e2 fix test
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 768
diff changeset
234 boost::thread t(Tata, &scheduler, &job, &done);
768
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
235
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
236
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
237 //scheduler.Submit(job);
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
238
1000
13e230bbd882 rename filter to command
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 995
diff changeset
239 IServerCommand::ListOfStrings l;
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
240 scheduler.SubmitAndWait(l, job);
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
241
1492
9f66a12eb8fc fix warnings for gcc 5
jodogne
parents: 1486
diff changeset
242 ASSERT_EQ(2u, l.size());
1009
26642cecd36d clearer job interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1005
diff changeset
243 ASSERT_EQ(42 * 2 * 3, boost::lexical_cast<int>(l.front()));
26642cecd36d clearer job interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1005
diff changeset
244 ASSERT_EQ(42 * 2 * 3 * 4 * 5, boost::lexical_cast<int>(l.back()));
26642cecd36d clearer job interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1005
diff changeset
245
1000
13e230bbd882 rename filter to command
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 995
diff changeset
246 for (IServerCommand::ListOfStrings::iterator i = l.begin(); i != l.end(); i++)
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
247 {
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
248 printf("** %s\n", i->c_str());
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
249 }
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
250
2140
aa4b8895cd23 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1907
diff changeset
251 //SystemToolbox::ServerBarrier();
2242
4e8e0ad2001c move USleep() in SystemToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2222
diff changeset
252 //SystemToolbox::USleep(3000000);
768
476febedc516 improvements
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 765
diff changeset
253
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
254 scheduler.Stop();
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
255
770
a64ca424e0e2 fix test
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 768
diff changeset
256 done = true;
1453
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
257 if (t.joinable())
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
258 {
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
259 t.join();
c0bdc47165ef code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1427
diff changeset
260 }
765
fc97f762834c scheduler
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 760
diff changeset
261 }
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
262
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
263
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
264
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
265
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
266
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
267 #if !defined(ORTHANC_SANDBOXED)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
268 # error The macro ORTHANC_SANDBOXED must be defined
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
269 #endif
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
270
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
271 #if ORTHANC_SANDBOXED == 1
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
272 # error The job engine cannot be used in sandboxed environments
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
273 #endif
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
274
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
275 #include "../Core/Logging.h"
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
276
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
277 #include <boost/date_time/posix_time/posix_time.hpp>
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
278 #include <queue>
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
279
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
280 namespace Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
281 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
282 enum JobState
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
283 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
284 JobState_Pending,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
285 JobState_Running,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
286 JobState_Success,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
287 JobState_Failure,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
288 JobState_Paused,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
289 JobState_Retry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
290 };
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
291
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
292 enum JobStepStatus
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
293 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
294 JobStepStatus_Success,
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
295 JobStepStatus_Failure,
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
296 JobStepStatus_Continue,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
297 JobStepStatus_Retry
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
298 };
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
299
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
300
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
301 class JobStepResult
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
302 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
303 private:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
304 JobStepStatus status_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
305
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
306 public:
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
307 explicit JobStepResult(JobStepStatus status) :
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
308 status_(status)
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
309 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
310 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
311
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
312 virtual ~JobStepResult()
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
313 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
314 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
315
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
316 JobStepStatus GetStatus() const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
317 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
318 return status_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
319 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
320 };
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
321
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
322
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
323 class RetryResult : public JobStepResult
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
324 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
325 private:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
326 unsigned int timeout_; // Retry after "timeout_" milliseconds
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
327
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
328 public:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
329 RetryResult(unsigned int timeout) :
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
330 JobStepResult(JobStepStatus_Retry),
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
331 timeout_(timeout)
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
332 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
333 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
334
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
335 unsigned int GetTimeout() const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
336 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
337 return timeout_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
338 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
339 };
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
340
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
342 class IJob : public boost::noncopyable
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
343 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
344 public:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
345 virtual ~IJob()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
346 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
347 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
348
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
349 virtual JobStepResult* ExecuteStep() = 0;
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
350
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
351 virtual void ReleaseResources() = 0; // For pausing jobs
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
352
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
353 virtual float GetProgress() = 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
354
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
355 virtual void FormatStatus(Json::Value& value) = 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
356 };
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
357
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
358
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
359 class JobHandler : public boost::noncopyable
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
360 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
361 private:
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
362 std::string id_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
363 JobState state_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
364 std::auto_ptr<IJob> job_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
365 int priority_; // "+inf()" means highest priority
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
366 boost::posix_time::ptime creationTime_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
367 boost::posix_time::ptime lastUpdateTime_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
368 boost::posix_time::ptime retryTime_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
369 uint64_t runtime_; // In milliseconds
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
370 bool pauseScheduled_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
371
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
372 void SetStateInternal(JobState state)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
373 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
374 const boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time();
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
375
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
376 if (state_ == JobState_Running)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
377 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
378 runtime_ += (now - lastUpdateTime_).total_milliseconds();
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
379 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
380
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
381 state_ = state;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
382 lastUpdateTime_ = now;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
383 pauseScheduled_ = false;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
384 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
385
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
386 public:
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
387 JobHandler(IJob* job,
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
388 int priority) :
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
389 id_(Toolbox::GenerateUuid()),
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
390 state_(JobState_Pending),
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
391 job_(job),
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
392 priority_(priority),
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
393 creationTime_(boost::posix_time::microsec_clock::universal_time()),
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
394 lastUpdateTime_(creationTime_),
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
395 runtime_(0),
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
396 pauseScheduled_(false)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
397 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
398 if (job == NULL)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
399 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
400 throw OrthancException(ErrorCode_NullPointer);
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
401 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
402 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
403
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
404 const std::string& GetId() const
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
405 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
406 return id_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
407 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
408
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
409 IJob& GetJob() const
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
410 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
411 assert(job_.get() != NULL);
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
412 return *job_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
413 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
414
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
415 void SetPriority(int priority)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
416 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
417 priority_ = priority;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
418 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
419
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
420 int GetPriority() const
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
421 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
422 return priority_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
423 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
424
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
425 JobState GetState() const
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
426 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
427 return state_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
428 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
429
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
430 void SetState(JobState state)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
431 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
432 if (state == JobState_Retry)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
433 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
434 // Use "SetRetryState()"
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
435 throw OrthancException(ErrorCode_BadSequenceOfCalls);
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
436 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
437 else
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
438 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
439 SetStateInternal(state);
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
440 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
441 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
442
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
443 void SetRetryState(unsigned int timeout)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
444 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
445 if (state_ == JobState_Running)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
446 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
447 SetStateInternal(JobState_Retry);
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
448 retryTime_ = (boost::posix_time::microsec_clock::universal_time() +
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
449 boost::posix_time::milliseconds(timeout));
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
450 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
451 else
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
452 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
453 // Only valid for running jobs
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
454 throw OrthancException(ErrorCode_BadSequenceOfCalls);
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
455 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
456 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
457
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
458 void SchedulePause()
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
459 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
460 if (state_ == JobState_Running)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
461 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
462 pauseScheduled_ = true;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
463 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
464 else
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
465 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
466 // Only valid for running jobs
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
467 throw OrthancException(ErrorCode_BadSequenceOfCalls);
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
468 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
469 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
470
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
471 bool IsPauseScheduled()
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
472 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
473 return pauseScheduled_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
474 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
475
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
476 bool IsRetryReady(const boost::posix_time::ptime& now) const
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
477 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
478 if (state_ != JobState_Retry)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
479 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
480 throw OrthancException(ErrorCode_BadSequenceOfCalls);
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
481 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
482 else
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
483 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
484 return retryTime_ <= now;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
485 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
486 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
487 };
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
488
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
489
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
490 class JobsRegistry : public boost::noncopyable
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
491 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
492 private:
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
493 struct PriorityComparator
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
494 {
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
495 bool operator() (JobHandler*& a,
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
496 JobHandler*& b) const
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
497 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
498 return a->GetPriority() < b->GetPriority();
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
499 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
500 };
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
501
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
502 typedef std::map<std::string, JobHandler*> JobsIndex;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
503 typedef std::list<const JobHandler*> CompletedJobs;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
504 typedef std::set<JobHandler*> RetryJobs;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
505 typedef std::priority_queue<JobHandler*,
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
506 std::vector<JobHandler*>, // Could be a "std::deque"
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
507 PriorityComparator> PendingJobs;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
508
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
509 boost::mutex mutex_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
510 JobsIndex jobsIndex_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
511 PendingJobs pendingJobs_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
512 CompletedJobs completedJobs_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
513 RetryJobs retryJobs_;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
514
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
515 boost::condition_variable pendingJobAvailable_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
516 size_t maxCompletedJobs_;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
517
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
518
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
519 #ifndef NDEBUG
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
520 bool IsPendingJob(const JobHandler& job) const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
521 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
522 PendingJobs copy = pendingJobs_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
523 while (!copy.empty())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
524 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
525 if (copy.top() == &job)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
526 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
527 return true;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
528 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
529
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
530 copy.pop();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
531 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
532
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
533 return false;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
534 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
535
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
536 bool IsCompletedJob(const JobHandler& job) const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
537 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
538 for (CompletedJobs::const_iterator it = completedJobs_.begin();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
539 it != completedJobs_.end(); ++it)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
540 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
541 if (*it == &job)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
542 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
543 return true;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
544 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
545 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
546
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
547 return false;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
548 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
549
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
550 bool IsRetryJob(JobHandler& job) const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
551 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
552 return retryJobs_.find(&job) != retryJobs_.end();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
553 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
554 #endif
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
555
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
557 void CheckInvariants()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
558 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
559 #ifndef NDEBUG
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
560 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
561 PendingJobs copy = pendingJobs_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
562 while (!copy.empty())
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
563 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
564 assert(copy.top()->GetState() == JobState_Pending);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
565 copy.pop();
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
566 }
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
567 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
568
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
569 assert(completedJobs_.size() <= maxCompletedJobs_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
570
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
571 for (CompletedJobs::const_iterator it = completedJobs_.begin();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
572 it != completedJobs_.end(); ++it)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
573 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
574 assert((*it)->GetState() == JobState_Success ||
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
575 (*it)->GetState() == JobState_Failure);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
576 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
577
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
578 for (RetryJobs::const_iterator it = retryJobs_.begin();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
579 it != retryJobs_.end(); ++it)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
580 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
581 assert((*it)->GetState() == JobState_Retry);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
582 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
583
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
584 for (JobsIndex::iterator it = jobsIndex_.begin();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
585 it != jobsIndex_.end(); ++it)
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
586 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
587 JobHandler& job = *it->second;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
588
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
589 assert(job.GetId() == it->first);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
590
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
591 switch (job.GetState())
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
592 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
593 case JobState_Pending:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
594 assert(!IsRetryJob(job) && IsPendingJob(job) && !IsCompletedJob(job));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
595 break;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
596
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
597 case JobState_Success:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
598 case JobState_Failure:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
599 assert(!IsRetryJob(job) && !IsPendingJob(job) && IsCompletedJob(job));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
600 break;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
601
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
602 case JobState_Retry:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
603 assert(IsRetryJob(job) && !IsPendingJob(job) && !IsCompletedJob(job));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
604 break;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
605
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
606 case JobState_Running:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
607 case JobState_Paused:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
608 assert(!IsRetryJob(job) && !IsPendingJob(job) && !IsCompletedJob(job));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
609 break;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
610
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
611 default:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
612 throw OrthancException(ErrorCode_InternalError);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
613 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
614 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
615 #endif
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
616 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
617
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
618
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
619 void ForgetOldCompletedJobs()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
620 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
621 if (maxCompletedJobs_ != 0)
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
622 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
623 while (completedJobs_.size() > maxCompletedJobs_)
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
624 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
625 assert(completedJobs_.front() != NULL);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
626
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
627 std::string id = completedJobs_.front()->GetId();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
628 assert(jobsIndex_.find(id) != jobsIndex_.end());
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
629
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
630 jobsIndex_.erase(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
631 delete(completedJobs_.front());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
632 completedJobs_.pop_front();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
633 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
634 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
635 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
636
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
637
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
638 void MarkRunningAsCompleted(JobHandler& job,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
639 bool success)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
640 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
641 LOG(INFO) << "Job has completed with " << (success ? "success" : "failure")
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
642 << ": " << job.GetId();
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
643
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
644 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
645 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
646 assert(job.GetState() == JobState_Running);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
647
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
648 job.SetState(success ? JobState_Success : JobState_Failure);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
649
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
650 completedJobs_.push_back(&job);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
651 ForgetOldCompletedJobs();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
652
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
653 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
654 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
655
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
656
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
657 void MarkRunningAsRetry(JobHandler& job,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
658 unsigned int timeout)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
659 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
660 LOG(INFO) << "Job scheduled for retry in " << timeout << "ms: " << job.GetId();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
661
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
662 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
663 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
664
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
665 assert(job.GetState() == JobState_Running &&
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
666 retryJobs_.find(&job) == retryJobs_.end());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
667
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
668 retryJobs_.insert(&job);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
669 job.SetRetryState(timeout);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
670
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
671 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
672 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
673
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
674
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
675 void MarkRunningAsPaused(JobHandler& job)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
676 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
677 LOG(INFO) << "Job paused: " << job.GetId();
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
678
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
679 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
680 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
681 assert(job.GetState() == JobState_Running);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
682
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
683 job.SetState(JobState_Paused);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
684
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
685 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
686 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
687
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
688
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
689 JobHandler* WaitPendingJob(unsigned int timeout)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
690 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
691 boost::mutex::scoped_lock lock(mutex_);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
692
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
693 while (pendingJobs_.empty())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
694 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
695 if (timeout == 0)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
696 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
697 pendingJobAvailable_.wait(lock);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
698 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
699 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
700 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
701 bool success = pendingJobAvailable_.timed_wait
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
702 (lock, boost::posix_time::milliseconds(timeout));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
703 if (!success)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
704 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
705 return NULL;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
706 }
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
707 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
708 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
709
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
710 JobHandler* job = pendingJobs_.top();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
711 pendingJobs_.pop();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
712
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
713 job->SetState(JobState_Running);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
714 return job;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
715 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
716
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
717
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
718 public:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
719 JobsRegistry() :
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
720 maxCompletedJobs_(10)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
721 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
722 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
723
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
724
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
725 ~JobsRegistry()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
726 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
727 for (JobsIndex::iterator it = jobsIndex_.begin(); it != jobsIndex_.end(); ++it)
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
728 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
729 assert(it->second != NULL);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
730 delete it->second;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
731 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
732 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
733
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
734
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
735 void SetMaxCompletedJobs(size_t i)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
736 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
737 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
738 CheckInvariants();
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
739
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
740 maxCompletedJobs_ = i;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
741 ForgetOldCompletedJobs();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
742
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
743 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
744 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
745
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
746
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
747 void ListJobs(std::set<std::string>& target)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
748 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
749 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
750 CheckInvariants();
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
751
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
752 for (JobsIndex::const_iterator it = jobsIndex_.begin();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
753 it != jobsIndex_.end(); ++it)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
754 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
755 target.insert(it->first);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
756 }
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
757 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
758
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
759
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
760 void Submit(std::string& id,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
761 IJob* job, // Takes ownership
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
762 int priority)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
763 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
764 std::auto_ptr<JobHandler> handler(new JobHandler(job, priority));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
765
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
766 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
767 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
768
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
769 id = handler->GetId();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
770
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
771 pendingJobs_.push(handler.get());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
772 pendingJobAvailable_.notify_one();
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
773
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
774 jobsIndex_.insert(std::make_pair(id, handler.release()));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
775
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
776 LOG(INFO) << "New job submitted: " << id;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
777
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
778 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
779 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
780
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
781
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
782 void Submit(IJob* job, // Takes ownership
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
783 int priority)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
784 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
785 std::string id;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
786 Submit(id, job, priority);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
787 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
788
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
789
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
790 void SetPriority(const std::string& id,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
791 int priority)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
792 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
793 LOG(INFO) << "Changing priority to " << priority << " for job: " << id;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
794
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
795 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
796 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
797
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
798 JobsIndex::iterator found = jobsIndex_.find(id);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
799
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
800 if (found == jobsIndex_.end())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
801 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
802 LOG(WARNING) << "Unknown job: " << id;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
803 }
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
804 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
805 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
806 found->second->SetPriority(priority);
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
807
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
808 if (found->second->GetState() == JobState_Pending)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
809 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
810 // If the job is pending, we need to reconstruct the
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
811 // priority queue, as the heap condition has changed
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
812
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
813 PendingJobs copy;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
814 std::swap(copy, pendingJobs_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
815
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
816 assert(pendingJobs_.empty());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
817 while (!copy.empty())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
818 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
819 pendingJobs_.push(copy.top());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
820 copy.pop();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
821 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
822 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
823 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
824
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
825 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
826 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
827
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
828
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
829 void Pause(const std::string& id)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
830 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
831 LOG(INFO) << "Pausing job: " << id;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
832
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
833 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
834 CheckInvariants();
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
835
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
836 JobsIndex::iterator found = jobsIndex_.find(id);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
837
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
838 if (found == jobsIndex_.end())
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
839 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
840 LOG(WARNING) << "Unknown job: " << id;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
841 }
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
842 else
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
843 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
844 switch (found->second->GetState())
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
845 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
846 case JobState_Pending:
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
847 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
848 // If the job is pending, we need to reconstruct the
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
849 // priority queue to remove it
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
850 PendingJobs copy;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
851 std::swap(copy, pendingJobs_);
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
852
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
853 assert(pendingJobs_.empty());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
854 while (!copy.empty())
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
855 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
856 if (copy.top()->GetId() != id)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
857 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
858 pendingJobs_.push(copy.top());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
859 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
860
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
861 copy.pop();
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
862 }
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
863
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
864 found->second->SetState(JobState_Paused);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
865
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
866 break;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
867 }
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
868
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
869 case JobState_Retry:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
870 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
871 RetryJobs::iterator item = retryJobs_.find(found->second);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
872 assert(item != retryJobs_.end());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
873 retryJobs_.erase(item);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
874
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
875 found->second->SetState(JobState_Paused);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
876
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
877 break;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
878 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
879
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
880 case JobState_Paused:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
881 case JobState_Success:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
882 case JobState_Failure:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
883 // Nothing to be done
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
884 break;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
885
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
886 case JobState_Running:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
887 found->second->SchedulePause();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
888 break;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
889
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
890 default:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
891 throw OrthancException(ErrorCode_InternalError);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
892 }
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
893 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
894
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
895 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
896 }
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
897
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
898
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
899 void Resume(const std::string& id)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
900 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
901 LOG(INFO) << "Resuming job: " << id;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
902
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
903 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
904 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
905
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
906 JobsIndex::iterator found = jobsIndex_.find(id);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
907
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
908 if (found == jobsIndex_.end())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
909 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
910 LOG(WARNING) << "Unknown job: " << id;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
911 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
912 else if (found->second->GetState() != JobState_Paused)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
913 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
914 LOG(WARNING) << "Cannot resume a job that is not paused: " << id;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
915 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
916 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
917 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
918 found->second->SetState(JobState_Pending);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
919 pendingJobs_.push(found->second);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
920 pendingJobAvailable_.notify_one();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
921 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
922
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
923 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
924 }
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
925
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
926
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
927 void Resubmit(const std::string& id)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
928 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
929 LOG(INFO) << "Resubmitting failed job: " << id;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
930
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
931 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
932 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
933
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
934 JobsIndex::iterator found = jobsIndex_.find(id);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
935
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
936 if (found == jobsIndex_.end())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
937 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
938 LOG(WARNING) << "Unknown job: " << id;
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
939 }
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
940 else if (found->second->GetState() != JobState_Failure)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
941 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
942 LOG(WARNING) << "Cannot resubmit a job that has not failed: " << id;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
943 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
944 else
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
945 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
946 bool ok = false;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
947 for (CompletedJobs::iterator it = completedJobs_.begin();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
948 it != completedJobs_.end(); ++it)
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
949 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
950 if (*it == found->second)
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
951 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
952 ok = true;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
953 completedJobs_.erase(it);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
954 break;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
955 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
956 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
957
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
958 assert(ok);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
959
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
960 found->second->SetState(JobState_Pending);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
961 pendingJobs_.push(found->second);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
962 pendingJobAvailable_.notify_one();
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
963 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
964
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
965 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
966 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
967
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
968
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
969 void ScheduleRetries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
970 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
971 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
972 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
973
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
974 RetryJobs copy;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
975 std::swap(copy, retryJobs_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
976
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
977 const boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
978
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
979 assert(retryJobs_.empty());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
980 for (RetryJobs::iterator it = copy.begin(); it != copy.end(); ++it)
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
981 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
982 if ((*it)->IsRetryReady(now))
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
983 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
984 LOG(INFO) << "Retrying job: " << (*it)->GetId();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
985 (*it)->SetState(JobState_Pending);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
986 pendingJobs_.push(*it);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
987 pendingJobAvailable_.notify_one();
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
988 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
989 else
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
990 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
991 retryJobs_.insert(*it);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
992 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
993 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
994
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
995 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
996 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
997
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
998
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
999 bool GetState(JobState& state,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1000 const std::string& id)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1001 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1002 boost::mutex::scoped_lock lock(mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1003 CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1004
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1005 JobsIndex::const_iterator it = jobsIndex_.find(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1006 if (it == jobsIndex_.end())
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
1007 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1008 return false;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1009 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1010 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1011 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1012 state = it->second->GetState();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1013 return true;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1014 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1015 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1016
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1017
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1018 class RunningJob : public boost::noncopyable
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1019 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1020 private:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1021 JobsRegistry& that_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1022 JobHandler* handler_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1023 JobState targetState_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1024 unsigned int retryTimeout_;
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
1025
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1026 public:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1027 RunningJob(JobsRegistry& that,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1028 unsigned int timeout) :
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1029 that_(that),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1030 handler_(NULL),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1031 targetState_(JobState_Failure),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1032 retryTimeout_(0)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1033 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1034 handler_ = that_.WaitPendingJob(timeout);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1035 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1036
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1037 ~RunningJob()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1038 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1039 if (IsValid())
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
1040 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1041 switch (targetState_)
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1042 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1043 case JobState_Failure:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1044 that_.MarkRunningAsCompleted(*handler_, false);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1045 break;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1046
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1047 case JobState_Success:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1048 that_.MarkRunningAsCompleted(*handler_, true);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1049 break;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1050
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1051 case JobState_Paused:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1052 that_.MarkRunningAsPaused(*handler_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1053 break;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1054
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1055 case JobState_Retry:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1056 that_.MarkRunningAsRetry(*handler_, retryTimeout_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1057 break;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1058
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1059 default:
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1060 assert(0);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1061 }
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
1062 }
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1063 }
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
1064
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1065 bool IsValid() const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1066 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1067 return handler_ != NULL;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1068 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1069
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1070 const std::string& GetId() const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1071 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1072 if (IsValid())
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
1073 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1074 return handler_->GetId();
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
1075 }
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1076 else
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1077 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1078 throw OrthancException(ErrorCode_BadSequenceOfCalls);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1079 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1080 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1081
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1082 int GetPriority() const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1083 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1084 if (IsValid())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1085 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1086 return handler_->GetPriority();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1087 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1088 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1089 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1090 throw OrthancException(ErrorCode_BadSequenceOfCalls);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1091 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1092 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1093
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1094 bool IsPauseScheduled()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1095 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1096 if (!IsValid())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1097 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1098 throw OrthancException(ErrorCode_BadSequenceOfCalls);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1099 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1100
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1101 boost::mutex::scoped_lock lock(that_.mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1102 that_.CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1103 assert(handler_->GetState() == JobState_Running);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1104
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1105 return handler_->IsPauseScheduled();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1106 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1107
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1108 IJob& GetJob()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1109 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1110 if (!IsValid())
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1111 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1112 throw OrthancException(ErrorCode_BadSequenceOfCalls);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1113 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1114
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1115 boost::mutex::scoped_lock lock(that_.mutex_);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1116 that_.CheckInvariants();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1117 assert(handler_->GetState() == JobState_Running);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1118
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1119 return handler_->GetJob();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1120 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1121
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1122 void MarkSuccess()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1123 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1124 if (!IsValid())
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1125 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1126 throw OrthancException(ErrorCode_BadSequenceOfCalls);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1127 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1128
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1129 targetState_ = JobState_Success;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1130 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1131
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1132 void MarkFailure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1133 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1134 if (!IsValid())
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1135 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1136 throw OrthancException(ErrorCode_BadSequenceOfCalls);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1137 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1138
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1139 targetState_ = JobState_Failure;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1140 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1141
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1142 void SchedulePause()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1143 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1144 if (!IsValid())
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1145 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1146 throw OrthancException(ErrorCode_BadSequenceOfCalls);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1147 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1148
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1149 targetState_ = JobState_Paused;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1150 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1151
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1152 void MarkRetry(unsigned int timeout)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1153 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1154 if (!IsValid())
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1155 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1156 throw OrthancException(ErrorCode_BadSequenceOfCalls);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1157 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1158
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1159 targetState_ = JobState_Retry;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1160 retryTimeout_ = timeout;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1161 }
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
1162 };
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1163 };
2556
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2447
diff changeset
1164 }
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1165
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1166
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1167
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1168 class DummyJob : public Orthanc::IJob
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1169 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1170 private:
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1171 JobStepResult result_;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1172
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1173 public:
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1174 DummyJob() :
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1175 result_(Orthanc::JobStepStatus_Success)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1176 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1177 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1178
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1179 explicit DummyJob(JobStepResult result) :
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1180 result_(result)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1181 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1182 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1183
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1184 virtual JobStepResult* ExecuteStep()
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1185 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1186 return new JobStepResult(result_);
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1187 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1188
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1189 virtual void ReleaseResources()
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1190 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1191 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1192
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1193 virtual float GetProgress()
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1194 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1195 return 0;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1196 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1197
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1198 virtual void FormatStatus(Json::Value& value)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1199 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1200 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1201 };
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1202
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1203
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1204 static bool CheckState(Orthanc::JobsRegistry& registry,
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1205 const std::string& id,
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1206 Orthanc::JobState state)
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1207 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1208 Orthanc::JobState s;
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1209 if (registry.GetState(s, id))
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1210 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1211 return state == s;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1212 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1213 else
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1214 {
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1215 return false;
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1216 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1217 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1218
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1219
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1220 TEST(JobsRegistry, Priority)
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1221 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1222 JobsRegistry registry;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1223
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1224 std::string i1, i2, i3, i4;
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1225 registry.Submit(i1, new DummyJob(), 10);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1226 registry.Submit(i2, new DummyJob(), 30);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1227 registry.Submit(i3, new DummyJob(), 20);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1228 registry.Submit(i4, new DummyJob(), 5);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1229
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1230 registry.SetMaxCompletedJobs(2);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1231
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1232 std::set<std::string> id;
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1233 registry.ListJobs(id);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1234
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1235 ASSERT_EQ(4u, id.size());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1236 ASSERT_TRUE(id.find(i1) != id.end());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1237 ASSERT_TRUE(id.find(i2) != id.end());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1238 ASSERT_TRUE(id.find(i3) != id.end());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1239 ASSERT_TRUE(id.find(i4) != id.end());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1240
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1241 ASSERT_TRUE(CheckState(registry, i2, Orthanc::JobState_Pending));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1242
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1243 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1244 JobsRegistry::RunningJob job(registry, 0);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1245 ASSERT_TRUE(job.IsValid());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1246 ASSERT_EQ(30, job.GetPriority());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1247 ASSERT_EQ(i2, job.GetId());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1248
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1249 ASSERT_TRUE(CheckState(registry, i2, Orthanc::JobState_Running));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1250 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1251
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1252 ASSERT_TRUE(CheckState(registry, i2, Orthanc::JobState_Failure));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1253 ASSERT_TRUE(CheckState(registry, i3, Orthanc::JobState_Pending));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1254
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1255 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1256 JobsRegistry::RunningJob job(registry, 0);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1257 ASSERT_TRUE(job.IsValid());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1258 ASSERT_EQ(20, job.GetPriority());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1259 ASSERT_EQ(i3, job.GetId());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1260
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1261 job.MarkSuccess();
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1262
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1263 ASSERT_TRUE(CheckState(registry, i3, Orthanc::JobState_Running));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1264 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1265
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1266 ASSERT_TRUE(CheckState(registry, i3, Orthanc::JobState_Success));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1267
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1268 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1269 JobsRegistry::RunningJob job(registry, 0);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1270 ASSERT_TRUE(job.IsValid());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1271 ASSERT_EQ(10, job.GetPriority());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1272 ASSERT_EQ(i1, job.GetId());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1273 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1274
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1275 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1276 JobsRegistry::RunningJob job(registry, 0);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1277 ASSERT_TRUE(job.IsValid());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1278 ASSERT_EQ(5, job.GetPriority());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1279 ASSERT_EQ(i4, job.GetId());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1280 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1281
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1282 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1283 JobsRegistry::RunningJob job(registry, 1);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1284 ASSERT_FALSE(job.IsValid());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1285 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1286
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1287 Orthanc::JobState s;
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1288 ASSERT_TRUE(registry.GetState(s, i1));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1289 ASSERT_FALSE(registry.GetState(s, i2)); // Removed because oldest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1290 ASSERT_FALSE(registry.GetState(s, i3)); // Removed because second oldest
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1291 ASSERT_TRUE(registry.GetState(s, i4));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1292
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1293 registry.SetMaxCompletedJobs(1); // (*)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1294 ASSERT_FALSE(registry.GetState(s, i1)); // Just discarded by (*)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1295 ASSERT_TRUE(registry.GetState(s, i4));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1296 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1297
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1298
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1299 TEST(JobsRegistry, Simultaneous)
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1300 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1301 JobsRegistry registry;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1302
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1303 std::string i1, i2;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1304 registry.Submit(i1, new DummyJob(), 20);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1305 registry.Submit(i2, new DummyJob(), 10);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1306
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1307 ASSERT_TRUE(CheckState(registry, i1, Orthanc::JobState_Pending));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1308 ASSERT_TRUE(CheckState(registry, i2, Orthanc::JobState_Pending));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1309
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1310 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1311 JobsRegistry::RunningJob job1(registry, 0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1312 JobsRegistry::RunningJob job2(registry, 0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1313
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1314 ASSERT_TRUE(job1.IsValid());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1315 ASSERT_TRUE(job2.IsValid());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1316
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1317 job1.MarkFailure();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1318 job2.MarkSuccess();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1319
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1320 ASSERT_TRUE(CheckState(registry, i1, Orthanc::JobState_Running));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1321 ASSERT_TRUE(CheckState(registry, i2, Orthanc::JobState_Running));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1322 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1323
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1324 ASSERT_TRUE(CheckState(registry, i1, Orthanc::JobState_Failure));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1325 ASSERT_TRUE(CheckState(registry, i2, Orthanc::JobState_Success));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1326 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1327
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1328
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1329 TEST(JobsRegistry, Resubmit)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1330 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1331 JobsRegistry registry;
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1332
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1333 std::string id;
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1334 registry.Submit(id, new DummyJob(), 10);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1335
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1336 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1337
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1338 registry.Resubmit(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1339 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1340
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1341 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1342 JobsRegistry::RunningJob job(registry, 0);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1343 ASSERT_TRUE(job.IsValid());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1344 job.MarkFailure();
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1345
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1346 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Running));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1347
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1348 registry.Resubmit(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1349 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Running));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1350 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1351
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1352 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Failure));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1353
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1354 registry.Resubmit(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1355 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1356
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1357 {
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1358 JobsRegistry::RunningJob job(registry, 0);
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1359 ASSERT_TRUE(job.IsValid());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1360 ASSERT_EQ(id, job.GetId());
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1361
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1362 job.MarkSuccess();
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1363 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Running));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1364 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1365
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1366 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Success));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1367
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1368 registry.Resubmit(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1369 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Success));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1370 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1371
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1372
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1373 TEST(JobsRegistry, Retry)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1374 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1375 JobsRegistry registry;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1376
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1377 std::string id;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1378 registry.Submit(id, new DummyJob(), 10);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1379
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1380 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1381
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1382 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1383 JobsRegistry::RunningJob job(registry, 0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1384 ASSERT_TRUE(job.IsValid());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1385 job.MarkRetry(0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1386
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1387 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Running));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1388 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1389
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1390 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Retry));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1391
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1392 registry.Resubmit(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1393 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Retry));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1394
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1395 registry.ScheduleRetries();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1396 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1397
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1398 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1399 JobsRegistry::RunningJob job(registry, 0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1400 ASSERT_TRUE(job.IsValid());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1401 job.MarkSuccess();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1402
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1403 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Running));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1404 }
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1405
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1406 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Success));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1407 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1408
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1409
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1410 TEST(JobsRegistry, PausePending)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1411 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1412 JobsRegistry registry;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1413
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1414 std::string id;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1415 registry.Submit(id, new DummyJob(), 10);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1416
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1417 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1418
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1419 registry.Pause(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1420 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Paused));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1421
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1422 registry.Pause(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1423 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Paused));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1424
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1425 registry.Resubmit(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1426 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Paused));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1427
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1428 registry.Resume(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1429 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
2557
b4516a6f214b state machine
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2556
diff changeset
1430 }
2558
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1431
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1432
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1433 TEST(JobsRegistry, PauseRunning)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1434 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1435 JobsRegistry registry;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1436
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1437 std::string id;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1438 registry.Submit(id, new DummyJob(), 10);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1439
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1440 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1441
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1442 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1443 JobsRegistry::RunningJob job(registry, 0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1444 ASSERT_TRUE(job.IsValid());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1445
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1446 registry.Resubmit(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1447 job.SchedulePause();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1448 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Running));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1449 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1450
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1451 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Paused));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1452
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1453 registry.Resubmit(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1454 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Paused));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1455
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1456 registry.Resume(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1457 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1458
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1459 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1460 JobsRegistry::RunningJob job(registry, 0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1461 ASSERT_TRUE(job.IsValid());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1462
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1463 job.MarkSuccess();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1464 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Running));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1465 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1466
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1467 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Success));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1468 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1469
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1470
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1471 TEST(JobsRegistry, PauseRetry)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1472 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1473 JobsRegistry registry;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1474
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1475 std::string id;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1476 registry.Submit(id, new DummyJob(), 10);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1477
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1478 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1479
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1480 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1481 JobsRegistry::RunningJob job(registry, 0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1482 ASSERT_TRUE(job.IsValid());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1483
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1484 job.MarkRetry(0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1485 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Running));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1486 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1487
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1488 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Retry));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1489
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1490 registry.Pause(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1491 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Paused));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1492
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1493 registry.Resume(id);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1494 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Pending));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1495
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1496 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1497 JobsRegistry::RunningJob job(registry, 0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1498 ASSERT_TRUE(job.IsValid());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1499
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1500 job.MarkSuccess();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1501 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Running));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1502 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1503
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1504 ASSERT_TRUE(CheckState(registry, id, Orthanc::JobState_Success));
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 2557
diff changeset
1505 }