Skip to content

Commit a0b70d1

Browse files
authored
Merge pull request #760 from cakephp/concurrency-errors
Allow saving requests to fail gracefully
2 parents dc87311 + 0d0a843 commit a0b70d1

File tree

3 files changed

+41
-25
lines changed

3 files changed

+41
-25
lines changed

src/Model/Table/RequestsTable.php

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616

1717
use Cake\Core\Configure;
1818
use Cake\Database\Driver\Sqlite;
19+
use Cake\Log\Log;
1920
use Cake\ORM\Query;
2021
use Cake\ORM\Table;
22+
use PDOException;
2123

2224
/**
2325
* The requests table tracks basic information about each request.
@@ -100,30 +102,36 @@ public function gc()
100102
if (!$this->shouldGc()) {
101103
return;
102104
}
103-
$noPurge = $this->find()
104-
->select(['id'])
105-
->enableHydration(false)
106-
->order(['requested_at' => 'desc'])
107-
->limit(Configure::read('DebugKit.requestCount') ?: 20)
108-
->extract('id')
109-
->toArray();
110105

111-
$query = $this->Panels->query()
112-
->delete()
113-
->where(['request_id NOT IN' => $noPurge]);
114-
$statement = $query->execute();
115-
$statement->closeCursor();
106+
try {
107+
$noPurge = $this->find()
108+
->select(['id'])
109+
->enableHydration(false)
110+
->order(['requested_at' => 'desc'])
111+
->limit(Configure::read('DebugKit.requestCount') ?: 20)
112+
->extract('id')
113+
->toArray();
116114

117-
$query = $this->query()
118-
->delete()
119-
->where(['id NOT IN' => $noPurge]);
115+
$query = $this->Panels->query()
116+
->delete()
117+
->where(['request_id NOT IN' => $noPurge]);
118+
$statement = $query->execute();
119+
$statement->closeCursor();
120120

121-
$statement = $query->execute();
122-
$statement->closeCursor();
121+
$query = $this->query()
122+
->delete()
123+
->where(['id NOT IN' => $noPurge]);
123124

124-
$conn = $this->getConnection();
125-
if ($conn->getDriver() instanceof Sqlite) {
126-
$conn->execute('VACUUM;');
125+
$statement = $query->execute();
126+
$statement->closeCursor();
127+
128+
$conn = $this->getConnection();
129+
if ($conn->getDriver() instanceof Sqlite) {
130+
$conn->execute('VACUUM;');
131+
}
132+
} catch (PDOException $e) {
133+
Log::warning('Unable to garbage collect requests table. This is probably due to concurrent requests.');
134+
Log::warning((string)$e);
127135
}
128136
}
129137
}

src/ToolbarService.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Cake\ORM\TableRegistry;
2323
use Cake\Routing\Router;
2424
use DebugKit\Panel\PanelRegistry;
25+
use PDOException;
2526
use Psr\Http\Message\ResponseInterface;
2627

2728
/**
@@ -207,7 +208,7 @@ public function initializePanels()
207208
*
208209
* @param \Cake\Http\ServerRequest $request The request
209210
* @param \Psr\Http\Message\ResponseInterface $response The response
210-
* @return null|\DebugKit\Model\Entity\Request Saved request data.
211+
* @return false|\DebugKit\Model\Entity\Request Saved request data.
211212
*/
212213
public function saveData(ServerRequest $request, ResponseInterface $response)
213214
{
@@ -218,7 +219,7 @@ public function saveData(ServerRequest $request, ResponseInterface $response)
218219
strpos($path, 'debug-kit') !== false ||
219220
$request->is('requested')
220221
) {
221-
return null;
222+
return false;
222223
}
223224
$data = [
224225
'url' => $request->getUri()->getPath(),
@@ -253,7 +254,14 @@ public function saveData(ServerRequest $request, ResponseInterface $response)
253254
]);
254255
}
255256

256-
return $requests->save($row);
257+
try {
258+
return $requests->save($row);
259+
} catch (PDOException $e) {
260+
Log::warning('Unable to save request. This is probably due to concurrent requests.');
261+
Log::warning((string)$e);
262+
}
263+
264+
return false;
257265
}
258266

259267
/**

tests/TestCase/ToolbarServiceTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public function testSaveDataIgnoreDebugKit()
141141
]);
142142

143143
$bar = new ToolbarService($this->events, []);
144-
$this->assertNull($bar->saveData($request, $response));
144+
$this->assertFalse($bar->saveData($request, $response));
145145
}
146146

147147
/**
@@ -162,7 +162,7 @@ public function testSaveDataIgnoreDebugKitDashedUrl()
162162
]);
163163

164164
$bar = new ToolbarService($this->events, []);
165-
$this->assertNull($bar->saveData($request, $response));
165+
$this->assertFalse($bar->saveData($request, $response));
166166
}
167167

168168
/**

0 commit comments

Comments
 (0)