Skip to content

Commit 0907327

Browse files
authored
Merge pull request #697 from nextcloud/backport/674/stable29
[stable29] Fix inaccurate disk usage reporting for ext* filesystems due to reserved blocks
2 parents 54a8195 + 4b395e2 commit 0907327

3 files changed

Lines changed: 44 additions & 21 deletions

File tree

lib/OperatingSystems/FreeBSD.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,10 @@ public function getDiskInfo(): array {
218218
$disk = new Disk();
219219
$disk->setDevice($filesystem);
220220
$disk->setFs($matches['Type'][$i]);
221-
$disk->setUsed((int)((int)$matches['Used'][$i] / 1024));
222-
$disk->setAvailable((int)((int)$matches['Available'][$i] / 1024));
223-
$disk->setPercent($matches['Capacity'][$i]);
221+
$used = (int)((int)$matches['Blocks'][$i] - (int)$matches['Available'][$i]);
222+
$disk->setUsed((int)ceil($used / 1024));
223+
$disk->setAvailable((int)floor((int)$matches['Available'][$i] / 1024));
224+
$disk->setPercent(round(($used * 100 / (int)$matches['Blocks'][$i]), 2) . '%');
224225
$disk->setMount($matches['Mounted'][$i]);
225226

226227
$data[] = $disk;

lib/OperatingSystems/Linux.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,10 @@ public function getDiskInfo(): array {
233233
$disk = new Disk();
234234
$disk->setDevice($filesystem);
235235
$disk->setFs($matches['Type'][$i]);
236-
$disk->setUsed((int)((int)$matches['Used'][$i] / 1024));
237-
$disk->setAvailable((int)((int)$matches['Available'][$i] / 1024));
238-
$disk->setPercent($matches['Capacity'][$i]);
236+
$used = (int)((int)$matches['Blocks'][$i] - (int)$matches['Available'][$i]);
237+
$disk->setUsed((int)ceil($used / 1024));
238+
$disk->setAvailable((int)floor((int)$matches['Available'][$i] / 1024));
239+
$disk->setPercent(round(($used * 100 / (int)$matches['Blocks'][$i]), 2) . '%');
239240
$disk->setMount($matches['Mounted'][$i]);
240241

241242
$data[] = $disk;

tests/lib/LinuxTest.php

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -160,57 +160,78 @@ public function testGetDiskInfo(): void {
160160
$disk1 = new Disk();
161161
$disk1->setDevice('/dev/mapper/homestead--vg-root');
162162
$disk1->setFs('ext4');
163-
$disk1->setUsed(6060);
164-
$disk1->setAvailable(46212);
165-
$disk1->setPercent('12%');
163+
// $size1 = 56422560;
164+
// $available1 = 47321220;
165+
$used1 = 9101340; // $size1 - $available1
166+
$disk1->setUsed(8889); // ceil(9101340 / 1024); (= 8888.0273)
167+
$disk1->setAvailable(46212); // floor(47321220 / 1024); (= 46212.1289)
168+
$disk1->setPercent('16.13%'); // round(($used1 * 100 / $size1), 2) . '%'; (= 16.1307%)
166169
$disk1->setMount('/');
167170

168171
$disk2 = new Disk();
169172
$disk2->setDevice('/dev/mapper/homestead--vg-mysql--master');
170173
$disk2->setFs('ext4');
171-
$disk2->setUsed(251);
174+
// $size2 = 65531436;
175+
// $available2 = 61902400;
176+
$used2 = 3629036;
177+
$disk2->setUsed(3544);
172178
$disk2->setAvailable(60451);
173-
$disk2->setPercent('1%');
179+
$disk2->setPercent('5.54%');
174180
$disk2->setMount('/homestead-vg/master');
175181

176182
$disk3 = new Disk();
177183
$disk3->setDevice('vagrant');
178184
$disk3->setFs('vboxsf');
179-
$disk3->setUsed(600421);
185+
// $size3 = 958123168;
186+
// $available3 = 343292036;
187+
$used3 = 614831132;
188+
$disk3->setUsed(600422);
180189
$disk3->setAvailable(335246);
181-
$disk3->setPercent('65%');
190+
$disk3->setPercent('64.17%');
182191
$disk3->setMount('/vagrant');
183192

184193
$disk4 = new Disk();
185194
$disk4->setDevice('home_vagrant_code');
186195
$disk4->setFs('vboxsf');
187-
$disk4->setUsed(600421);
196+
// $size4 = 958123168;
197+
// $available4 = 343292036;
198+
$used4 = 614831132;
199+
$disk4->setUsed(600422);
188200
$disk4->setAvailable(335246);
189-
$disk4->setPercent('65%');
201+
$disk4->setPercent('64.17%');
190202
$disk4->setMount('/home/vagrant/code');
191203

192204
$disk5 = new Disk();
193205
$disk5->setDevice('nfs.example.com:/export');
194206
$disk5->setFs('nfs4');
195-
$disk5->setUsed(0);
207+
// $size5 = 14820;
208+
// $available5 = 1230
209+
$used5 = 13590;
210+
$disk5->setUsed(14);
196211
$disk5->setAvailable(1);
197-
$disk5->setPercent('0%');
212+
$disk5->setPercent('91.7%');
198213
$disk5->setMount('/nfs');
199214

200215
$disk6 = new Disk();
201216
$disk6->setDevice('198.51.100.42:/storage');
202217
$disk6->setFs('fuse.sshfs');
203-
$disk6->setUsed(51);
218+
// $size6 = 47929956;
219+
// $available6 = 45419052;
220+
$used6 = 2510904;
221+
$disk6->setUsed(2453);
204222
$disk6->setAvailable(44354);
205-
$disk6->setPercent('1%');
223+
$disk6->setPercent('5.24%');
206224
$disk6->setMount('/mnt/sshfs');
207225

208226
$disk7 = new Disk();
209227
$disk7->setDevice('/dev/vda5');
210228
$disk7->setFs('ext4');
211-
$disk7->setUsed(107508);
229+
// $size7 = 205314024;
230+
// $available7 = 84722884;
231+
$used7 = 120591140;
232+
$disk7->setUsed(117765);
212233
$disk7->setAvailable(82737);
213-
$disk7->setPercent('57%');
234+
$disk7->setPercent('58.73%');
214235
$disk7->setMount('/nextcloud/my.cloud.domain.xx');
215236

216237
$this->assertEquals([$disk1, $disk2, $disk3, $disk4, $disk5, $disk6, $disk7], $this->os->getDiskInfo());

0 commit comments

Comments
 (0)