Passed
Push — master ( 1e32c6...392926 )
by Darko
11:49
created

BinariesRunner   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 140
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 20
eloc 85
c 1
b 0
f 0
dl 0
loc 140
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
B binaries() 0 43 6
C safeBinaries() 0 92 14
1
<?php
2
3
namespace App\Services\Runners;
4
5
use App\Models\Settings;
6
use Illuminate\Support\Facades\DB;
7
8
class BinariesRunner extends BaseRunner
9
{
10
    public function binaries(int $maxPerGroup): void
11
    {
12
        $work = DB::select(
13
            sprintf(
14
                'SELECT name, %d AS max FROM usenet_groups WHERE active = 1',
15
                $maxPerGroup
16
            )
17
        );
18
19
        $maxProcesses = (int) Settings::settingValue('binarythreads');
20
21
        $count = count($work);
22
        if ($count === 0) {
23
            $this->headerNone();
24
25
            return;
26
        }
27
28
        // Streaming mode
29
        if ((bool) config('nntmux.stream_fork_output', false) === true) {
30
            $commands = [];
31
            foreach ($work as $group) {
32
                $commands[] = PHP_BINARY.' artisan update:binaries '.$group->name.' '.$group->max;
33
            }
34
            $this->runStreamingCommands($commands, $maxProcesses, 'binaries');
35
36
            return;
37
        }
38
39
        $this->headerStart('binaries', $count, $maxProcesses);
40
41
        // Build commands array for parallel execution
42
        $commands = [];
43
        foreach ($work as $group) {
44
            $commands[$group->name] = PHP_BINARY.' artisan update:binaries '.$group->name.' '.$group->max;
45
        }
46
47
        // Process using parallel commands with configurable timeout
48
        $results = $this->runParallelCommands($commands, $maxProcesses);
49
50
        foreach ($results as $groupName => $output) {
51
            echo $output;
52
            $this->colorCli->primary('Updated group '.$groupName);
53
        }
54
    }
55
56
    public function safeBinaries(): void
57
    {
58
        // update group stats - Updated to use new script location (modernized)
59
        $this->executeCommand(PHP_BINARY.' app/Services/Tmux/Scripts/update_groups.php');
60
61
        $maxHeaders = (int) Settings::settingValue('max_headers_iteration') ?: 1000000;
62
        $maxMessages = (int) Settings::settingValue('maxmssgs');
63
64
        // Prevent division by zero - ensure maxmssgs is at least 1
65
        if ($maxMessages < 1) {
66
            $defaultMaxMessages = 20000;
67
            $this->colorCli->warning('maxmssgs setting is invalid or not set, using default of '.$defaultMaxMessages);
68
            $maxMessages = $defaultMaxMessages;
69
        }
70
71
        $maxProcesses = (int) Settings::settingValue('binarythreads');
72
73
        $groups = DB::select(
74
            '
75
            SELECT g.name AS groupname, g.last_record AS our_last,
76
                a.last_record AS their_last
77
            FROM usenet_groups g
78
            INNER JOIN short_groups a ON g.active = 1 AND g.name = a.name
79
            ORDER BY a.last_record DESC'
80
        );
81
82
        if (empty($groups)) {
83
            $this->headerNone();
84
85
            return;
86
        }
87
88
        $i = 1;
89
        $queues = [];
90
        foreach ($groups as $group) {
91
            if ((int) $group->our_last === 0) {
92
                $queues[$i] = sprintf('update_group_headers  %s', $group->groupname);
93
                $i++;
94
            } else {
95
                $count = $group->their_last - $group->our_last - 20000; // skip first 20k
96
                if ($count <= $maxMessages * 2) {
97
                    $queues[$i] = sprintf('update_group_headers  %s', $group->groupname);
98
                    $i++;
99
                } else {
100
                    $queues[$i] = sprintf('part_repair  %s', $group->groupname);
101
                    $i++;
102
                    $getEach = (int) floor(min($count, $maxHeaders) / $maxMessages);
103
                    $remaining = (int) (min($count, $maxHeaders) - $getEach * $maxMessages);
104
                    for ($j = 0; $j < $getEach; $j++) {
105
                        $queues[$i] = sprintf('get_range  binaries  %s  %s  %s  %s', $group->groupname, $group->our_last + $j * $maxMessages + 1, $group->our_last + $j * $maxMessages + $maxMessages, $i);
106
                        $i++;
107
                    }
108
                    if ($remaining > 0) {
109
                        $start = $group->our_last + $getEach * $maxMessages + 1;
110
                        $end = $start + $remaining;
111
                        $queues[$i] = sprintf('get_range  binaries  %s  %s  %s  %s', $group->groupname, $start, $end, $i);
112
                        $i++;
113
                    }
114
                }
115
            }
116
        }
117
118
        // Streaming mode
119
        if ((bool) config('nntmux.stream_fork_output', false) === true) {
120
            $commands = [];
121
            foreach ($queues as $queue) {
122
                $commands[] = $this->buildDnrCommand($queue);
123
            }
124
            $this->runStreamingCommands($commands, $maxProcesses, 'safe_binaries');
125
126
            return;
127
        }
128
129
        $this->headerStart('safe_binaries', count($queues), $maxProcesses);
130
131
        // Build commands array with group info for parallel execution
132
        $commands = [];
133
        $groupMapping = [];
134
        foreach ($queues as $idx => $queue) {
135
            preg_match('/alt\..+/i', $queue, $hit);
136
            $commands[$idx] = $this->buildDnrCommand($queue);
137
            $groupMapping[$idx] = $hit[0] ?? '';
138
        }
139
140
        // Process using parallel commands with configurable timeout
141
        $results = $this->runParallelCommands($commands, $maxProcesses);
142
143
        foreach ($results as $idx => $output) {
144
            $group = $groupMapping[$idx] ?? '';
145
            if (!empty($group)) {
146
                echo $output;
147
                $this->colorCli->primary('Updated group '.$group);
148
            }
149
        }
150
    }
151
}
152
153