@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix loop in svnserve workflow for large binaries

Summary: If you push a large binary and the data crosses multiple data frames, we can end up in a loop in the parser.

Test Plan:
After this change, I was able to push a 95MB binary in 7s, which seems reasonable:

>>> orbital ~/repos/INIS $ svn st
A large2.bin
>>> orbital ~/repos/INIS $ ls -alh
total 390648
drwxr-xr-x 6 epriestley admin 204B Dec 18 17:14 .
drwxr-xr-x 98 epriestley admin 3.3K Dec 16 11:19 ..
drwxr-xr-x 7 epriestley admin 238B Dec 18 17:14 .svn
-rw-r--r-- 1 epriestley admin 80B Dec 18 15:07 README
-rw-r--r-- 1 epriestley admin 95M Dec 18 16:53 large.bin
-rw-r--r-- 1 epriestley admin 95M Dec 18 17:14 large2.bin
>>> orbital ~/repos/INIS $ time svn commit -m 'another large binary'
Adding (bin) large2.bin
Transmitting file data .
Committed revision 25.

real 0m7.215s
user 0m5.327s
sys 0m0.407s
>>> orbital ~/repos/INIS $

There may be room to improve this by using `PhutilRope`.

Reviewers: wrotte, btrahan, wotte

Reviewed By: wotte

CC: aran

Differential Revision: https://secure.phabricator.com/D7798

+29
+4
src/applications/diffusion/protocol/DiffusionSubversionWireProtocol.php
··· 75 75 } 76 76 } else if ($this->state == 'bytes') { 77 77 $new_data = substr($this->buffer, 0, $this->expectBytes); 78 + if (!strlen($new_data)) { 79 + // No more bytes available yet, wait for more data. 80 + break; 81 + } 78 82 $this->buffer = substr($this->buffer, strlen($new_data)); 79 83 80 84 $this->expectBytes -= strlen($new_data);
+25
src/applications/diffusion/protocol/__tests__/DiffusionSubversionWireProtocolTestCase.php
··· 61 61 )); 62 62 } 63 63 64 + public function testSubversionWireProtocolPartialFrame() { 65 + $proto = new DiffusionSubversionWireProtocol(); 66 + 67 + // This is primarily a test that we don't hang when we write() a frame 68 + // which straddles a string boundary. 69 + $msg1 = $proto->writeData('( duck 5:qu'); 70 + $msg2 = $proto->writeData('ack ) '); 71 + 72 + $this->assertEqual(array(), ipull($msg1, 'structure')); 73 + $this->assertEqual( 74 + array( 75 + array( 76 + array( 77 + 'type' => 'word', 78 + 'value' => 'duck', 79 + ), 80 + array( 81 + 'type'=> 'string', 82 + 'value' => 'quack', 83 + ), 84 + ), 85 + ), 86 + ipull($msg2, 'structure')); 87 + } 88 + 64 89 private function assertSameSubversionMessages($string, array $structs) { 65 90 $proto = new DiffusionSubversionWireProtocol(); 66 91