Completed
Push — master ( ce55af...9dbaff )
by Matthew
04:38
created

BaseRunManager::setRunArchiveClass()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Dtc\QueueBundle\Doctrine;
4
5
use Doctrine\Common\Persistence\ObjectManager;
6
use Doctrine\Common\Persistence\ObjectRepository;
7
use Dtc\QueueBundle\Model\Job;
8
use Dtc\QueueBundle\Model\JobTiming;
9
use Dtc\QueueBundle\Model\Run;
10
use Dtc\QueueBundle\Model\RunManager;
11
12
abstract class BaseRunManager extends RunManager
13
{
14
    /** @var ObjectManager */
15
    protected $objectManager;
16
17
    /** @var string|null */
18
    protected $runArchiveClass;
19
20 10
    public function __construct(ObjectManager $objectManager, $runClass, $jobTimingClass, $recordTimings)
21
    {
22 10
        $this->objectManager = $objectManager;
23 10
        parent::__construct($runClass, $jobTimingClass, $recordTimings);
24 10
    }
25
26
    /**
27
     * @return ObjectManager
28
     */
29 5
    public function getObjectManager()
30
    {
31 5
        return $this->objectManager;
32
    }
33
34
    /**
35
     * @param ObjectManager $objectManager
36
     */
37
    public function setObjectManager(ObjectManager $objectManager)
38
    {
39
        $this->objectManager = $objectManager;
40
    }
41
42
    /**
43
     * @return ObjectRepository
44
     */
45
    public function getRepository()
46
    {
47
        return $this->objectManager->getRepository($this->getRunClass());
48
    }
49
50
    /**
51
     * @return null|string
52
     */
53 10
    public function getRunArchiveClass()
54
    {
55 10
        return $this->runArchiveClass;
56
    }
57
58
    /**
59
     * @param null|string $runArchiveClass
60
     */
61 10
    public function setRunArchiveClass($runArchiveClass)
62
    {
63 10
        $this->runArchiveClass = $runArchiveClass;
64 10
    }
65
66 2
    public function recordJobRun(Job $job)
67
    {
68 2
        parent::recordJobRun($job);
69
70 2
        $finishedAt = $job->getFinishedAt();
71 2
        if (null === $finishedAt) {
72
            $finishedAt = new \DateTime();
73
        }
74
        /** @var JobTiming $jobTiming */
75 2
        $jobTiming = new $this->jobTimingClass();
76 2
        $jobTiming->setFinishedAt($finishedAt);
77 2
        $this->objectManager->persist($jobTiming);
78 2
        $this->objectManager->flush();
79 2
    }
80
81 2
    public function pruneStalledRuns()
82
    {
83 2
        $runs = $this->getOldLiveRuns();
84
        /** @var Run $run */
85 2
        $delete = [];
86
87 2
        foreach ($runs as $run) {
88 2
            $lastHeartbeat = $run->getLastHeartbeatAt();
89 2
            $time = time() - 3600;
90 2
            $processTimeout = $run->getProcessTimeout();
91 2
            $time -= $processTimeout;
92 2
            $oldDate = new \DateTime("@$time");
93 2
            if (null === $lastHeartbeat || $oldDate > $lastHeartbeat) {
94 2
                $delete[] = $run;
95
            }
96
        }
97
98 2
        return $this->deleteOldRuns($delete);
99
    }
100
101
    /**
102
     * @param array $delete
103
     *
104
     * @return int
105
     */
106 2
    protected function deleteOldRuns(array $delete)
107
    {
108 2
        $count = count($delete);
109 2
        $objectManager = $this->getObjectManager();
110 2
        for ($i = 0; $i < $count; $i += 100) {
111 2
            $deleteList = array_slice($delete, $i, 100);
112 2
            foreach ($deleteList as $object) {
113 2
                $objectManager->remove($object);
114
            }
115 2
            $this->flush();
116
        }
117
118 2
        return $count;
119
    }
120
121 2
    protected function flush()
122
    {
123 2
        $this->getObjectManager()->flush();
124 2
    }
125
126 2
    protected function persistRun(Run $run, $action = 'persist')
127
    {
128 2
        $objectManager = $this->getObjectManager();
129 2
        $objectManager->$action($run);
130 2
        $objectManager->flush();
131 2
    }
132
133
    /**
134
     * @return array
135
     */
136
    abstract protected function getOldLiveRuns();
137
138
    abstract protected function removeOlderThan($objectName, $field, \DateTime $olderThan);
139
140 1
    public function pruneArchivedRuns(\DateTime $olderThan)
141
    {
142 1
        return $this->removeOlderThan($this->getRunArchiveClass(), 'endedAt', $olderThan);
143
    }
144
145
    public function pruneJobTimings(\DateTime $olderThan)
146
    {
147
        return $this->removeOlderThan($this->getJobTimingClass(), 'createdAt', $olderThan);
148
    }
149
}
150