Skip to content

Commit b3c8bdf

Browse files
authored
Merge pull request #3004 from irontec/PROVIDER-2326-fix-recordings-premature-deletion
[PROVIDER-2326] Fix recordings premature deletion
2 parents 4a40f05 + 63c78d7 commit b3c8bdf

File tree

9 files changed

+33
-136
lines changed

9 files changed

+33
-136
lines changed

library/composer-packages/irontec/ivoz-provider-bundle/Resources/config/parameters.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ parameters:
1919
ami_password: ivozamisecret
2020
ami_port: 5038
2121
local_storage_path: /opt/irontec/ivozprovider/storage
22-
raw_recordings_dir: /opt/irontec/ivozprovider/storage/ivozprovider_model_recordings.originalfile/
22+
raw_recordings_dir: '%local_storage_path%/ivozprovider_model_recordings.originalfile/'
23+
incoming_recordings_dir: '%local_storage_path%/ivozprovider_model_recordings.spool/'
2324
default_prov_template_path: /opt/irontec/ivozprovider/microservices/provision/templates/
2425
sentinels:
2526
- { host: 'cache.ivozprovider.local', port: '26379' }

library/composer-packages/irontec/ivoz-provider-bundle/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "irontec/ivoz-provider-bundle",
3-
"version": "3.2",
3+
"version": "3.3",
44
"type": "symfony-bundle",
55
"description": "Symfony bridge for IvozProvider",
66
"license": "GPL-3.0-or-later",

library/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
"irontec/ivoz-api-bundle": "^5.0",
8989
"irontec/ivoz-core": "^5.0",
9090
"irontec/ivoz-dev-tools": "^6.1.1",
91-
"irontec/ivoz-provider-bundle": "^3.2",
91+
"irontec/ivoz-provider-bundle": "^3.3",
9292
"irontec/prophecy": "^1.13",
9393
"irontec/replacements": "^1.0",
9494
"irontec/wkhtmltopdf-amd64": "0.12.6.1",

library/composer.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

microservices/recordings/config/services.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ services:
4242

4343
Service\RecordingEndedChecker:
4444
arguments:
45-
$recorderCmd: '/^rtpengine-rec/'
45+
$recorderIncomingPath: '%incoming_recordings_dir%'
4646

4747
# add more service definitions when explicit configuration is needed
4848
# please note that last definitions always *replace* previous ones
@@ -61,4 +61,4 @@ when@test:
6161
Service\RecordingEndedChecker:
6262
public: true
6363
arguments:
64-
$recorderCmd: 'php'
64+
$recorderIncomingPath: '/tmp'

microservices/recordings/src/Service/Encoder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ private function isProcessableFile(RawRecordingInfo $rawRecordingInfo): bool
349349
{
350350
$isRecordingEnded = $this
351351
->recordingEndedChecker
352-
->execute($rawRecordingInfo->getFullName());
352+
->execute($rawRecordingInfo->getFileName());
353353

354354
if (!$isRecordingEnded) {
355355
$this->logger->info(sprintf(

microservices/recordings/src/Service/RecordingEndedChecker.php

Lines changed: 14 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -5,78 +5,28 @@
55
class RecordingEndedChecker
66
{
77
public function __construct(
8-
private string $recorderCmd,
8+
private string $recorderIncomingPath,
99
) {
1010
}
1111

12-
public function execute(string $fullFilename): bool
12+
public function execute(string $fileName): bool
1313
{
14-
if (!file_exists($fullFilename)) {
15-
throw new \RuntimeException(
16-
'File not found: ' . $fullFilename,
17-
404
18-
);
19-
}
20-
21-
$results = $this->lsof($fullFilename);
22-
23-
if (empty($results)) {
24-
return true;
25-
}
26-
27-
foreach ($results as $result) {
28-
$isWriting = $result['mode'] === 'w' || $result['mode'] === 'u';
29-
if ($isWriting) {
30-
return false;
31-
}
32-
}
33-
34-
return true;
35-
}
36-
37-
/**
38-
* @return array<array{'pid': string,'mode': string}>
39-
*/
40-
private function lsof(string $fullFilename): array
41-
{
42-
$columnCount = 2;
43-
$command = sprintf(
44-
'lsof -F a -a -c %s %s 2>/dev/null',
45-
$this->recorderCmd,
46-
$fullFilename,
14+
$incomingFileName = str_replace(
15+
'-mix.wav',
16+
'.meta',
17+
$fileName
4718
);
4819

49-
/**
50-
* @var array<string> $lsofOutput
51-
*/
52-
$lsofOutput = [];
53-
$statusCode = -1;
54-
exec(
55-
$command,
56-
$lsofOutput,
57-
$statusCode
20+
$fp = sprintf(
21+
'%s/%s',
22+
$this->recorderIncomingPath,
23+
$incomingFileName,
5824
);
5925

60-
$cmdNotFound = $statusCode === 127;
61-
62-
if ($cmdNotFound) {
63-
throw new \RuntimeException(
64-
'Error executing lsof command',
65-
500
66-
);
67-
}
68-
69-
$noMatchFound = $statusCode !== 0;
70-
if ($noMatchFound) {
71-
return [];
72-
}
73-
74-
return array_map(
75-
fn(array $line) => [
76-
'pid' => substr((string)$line[0], 1),
77-
'mode' => substr((string)$line[1], 1),
78-
],
79-
array_chunk($lsofOutput, $columnCount),
26+
$fileExists = file_exists(
27+
$fp,
8028
);
29+
30+
return !$fileExists;
8131
}
8232
}

microservices/recordings/tests/Service/EncoderTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ private function setUpMockRecordingEndedChecker(): void
155155
$mockRecordingEndedChecker->expects($this->exactly(5))
156156
->method('execute')
157157
->willReturnCallback(
158-
fn($file) => $file != '/recordings/users-inbound-still-recording-file-name-mix.wav'
158+
fn($file) => $file != 'users-inbound-still-recording-file-name-mix.wav'
159159
);
160160

161161
$this->serviceContainer->set(

microservices/recordings/tests/Service/RecordingEndedCheckerTest.php

Lines changed: 8 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -17,90 +17,36 @@ protected function setUp(): void
1717

1818
public function test_runer()
1919
{
20-
$this->it_detects_opened_for_writing_file();
21-
$this->it_detectects_opened_for_read_file();
22-
$this->it_detects_unopened_file();
23-
$this->it_launch_exception_on_wrong_file();
20+
$this->it_detects_incoming_recording();
21+
$this->it_detects_ended_recording();
2422
}
2523

26-
private function it_detects_opened_for_writing_file()
24+
private function it_detects_incoming_recording()
2725
{
2826
$file = tempnam('/tmp', 'test');
29-
3027
$this->assertNotFalse(
3128
$file,
3229
'Create temporary file failed'
3330
);
3431

35-
$fd = fopen($file, 'w');
36-
3732
$this->assertNotFalse(
38-
$fd,
39-
'Open for writing temporary file failed'
33+
file_put_contents($file . '.meta', 'dummy'),
34+
'Creating temporary file failed'
4035
);
4136

4237
$checker = $this->serviceContainer->get('Service\RecordingEndedChecker');
4338

4439
$this->assertFalse(
45-
$checker->execute($file)
40+
$checker->execute(basename($file) . '-mix.wav')
4641
);
47-
48-
fclose($fd);
49-
unlink($file);
5042
}
5143

52-
private function it_detectects_opened_for_read_file()
44+
private function it_detects_ended_recording()
5345
{
54-
$file = tempnam('/tmp', 'test');
55-
56-
$this->assertNotFalse(
57-
$file,
58-
'Create temporary file failed'
59-
);
60-
61-
$fd = fopen($file, 'r');
62-
63-
$this->assertNotFalse(
64-
$fd,
65-
'Open for reading temporary file failed'
66-
);
67-
6846
$checker = $this->serviceContainer->get('Service\RecordingEndedChecker');
6947

7048
$this->assertTrue(
71-
$checker->execute($file)
49+
$checker->execute(basename('dummy-file-name-mix.wav'))
7250
);
73-
74-
fclose($fd);
75-
unlink($file);
76-
}
77-
78-
private function it_detects_unopened_file()
79-
{
80-
$file = tempnam('/tmp', 'test');
81-
82-
$this->assertNotFalse(
83-
$file,
84-
'Create temporary file failed'
85-
);
86-
87-
$checker = $this->serviceContainer->get('Service\RecordingEndedChecker');
88-
89-
$this->assertTrue(
90-
$checker->execute($file)
91-
);
92-
93-
unlink($file);
94-
}
95-
96-
private function it_launch_exception_on_wrong_file()
97-
{
98-
$file = tempnam('/tmp', 'test');
99-
unlink($file);
100-
101-
$checker = $this->serviceContainer->get('Service\RecordingEndedChecker');
102-
103-
$this->expectExceptionCode(404);
104-
$checker->execute($file);
10551
}
10652
}

0 commit comments

Comments
 (0)