Skip to content

Commit 49345b6

Browse files
committed
Improve file write performance by fwrite with cache. v5.0.133
1 parent c756be7 commit 49345b6

File tree

7 files changed

+91
-35
lines changed

7 files changed

+91
-35
lines changed

trunk/doc/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ The changelog for SRS.
88

99
## SRS 5.0 Changelog
1010

11+
* v5.0, 2023-01-08, Merge [#3308](https://github.com/ossrs/srs/pull/3308): DVR: Improve file write performance by fwrite with cache. v5.0.133
1112
* v5.0, 2023-01-06, DVR: Support blackbox test based on hooks. v5.0.132
1213
* v5.0, 2023-01-06, FFmpeg: Support build with FFmpeg native opus. v5.0.131 (#3140)
1314
* v5.0, 2023-01-05, CORS: Refine HTTP CORS headers. v5.0.130

trunk/src/app/srs_app_dvr.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ using namespace std;
2626
#include <srs_kernel_mp4.hpp>
2727
#include <srs_app_fragment.hpp>
2828

29+
#define SRS_FWRITE_CACHE_SIZE 65536
30+
2931
SrsDvrSegmenter::SrsDvrSegmenter()
3032
{
3133
req = NULL;
@@ -95,8 +97,8 @@ srs_error_t SrsDvrSegmenter::open()
9597
return srs_error_wrap(err, "open file %s", path.c_str());
9698
}
9799

98-
// set libc file write cache buffer size
99-
if ((err = fs->set_iobuf_size(65536)) != srs_success) {
100+
// Set libc file write cache buffer size
101+
if ((err = fs->set_iobuf_size(SRS_FWRITE_CACHE_SIZE)) != srs_success) {
100102
return srs_error_wrap(err, "set iobuf size for file %s", path.c_str());
101103
}
102104

trunk/src/core/srs_core_version5.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99

1010
#define VERSION_MAJOR 5
1111
#define VERSION_MINOR 0
12-
#define VERSION_REVISION 132
12+
#define VERSION_REVISION 133
1313

1414
#endif

trunk/src/kernel/srs_kernel_file.cpp

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ SrsFileWriter::~SrsFileWriter()
4646
srs_freepa(buf_);
4747
}
4848

49-
5049
srs_error_t SrsFileWriter::set_iobuf_size(int size)
5150
{
5251
srs_error_t err = srs_success;
@@ -56,25 +55,15 @@ srs_error_t SrsFileWriter::set_iobuf_size(int size)
5655
}
5756

5857
srs_freepa(buf_);
59-
60-
int ret;
61-
62-
if (size > 0) {
63-
buf_ = new char[size];
64-
ret = _srs_setvbuf_fn(fp_, buf_, _IOFBF, size);
65-
}
66-
else {
67-
ret = _srs_setvbuf_fn(fp_, NULL, _IONBF, size);
68-
}
69-
70-
if (ret != 0) {
71-
return srs_error_new(ERROR_SYSTEM_FILE_SETVBUF, "file %s set vbuf error", path_.c_str());
58+
buf_ = size > 0 ? new char[size] : NULL;
59+
int r0 = _srs_setvbuf_fn(fp_, buf_, _IOFBF, size);
60+
if (!r0) {
61+
return srs_error_new(ERROR_SYSTEM_FILE_SETVBUF, "setvbuf err, file=%s, r0=%d", path_.c_str(), r0);
7262
}
7363

7464
return err;
7565
}
7666

77-
7867
srs_error_t SrsFileWriter::open(string p)
7968
{
8069
srs_error_t err = srs_success;

trunk/src/utest/srs_utest_kernel.cpp

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4328,7 +4328,6 @@ VOID TEST(KernelFileWriterTest, WriteSpecialCase)
43284328

43294329
EXPECT_EQ(f.tellg(), -1);
43304330
}
4331-
43324331
}
43334332

43344333
VOID TEST(KernelFileReaderTest, WriteSpecialCase)
@@ -4385,26 +4384,24 @@ VOID TEST(KernelFileReaderTest, WriteSpecialCase)
43854384
}
43864385
}
43874386

4388-
class MockFileRemover
4387+
MockFileRemover::MockFileRemover(string p)
43894388
{
4390-
private:
4391-
string f;
4392-
public:
4393-
MockFileRemover(string p) {
4394-
f = p;
4395-
}
4396-
virtual ~MockFileRemover() {
4397-
if (f != "") {
4398-
::unlink(f.c_str());
4399-
}
4400-
}
4401-
};
4389+
path_ = p;
4390+
}
4391+
4392+
MockFileRemover::~MockFileRemover()
4393+
{
4394+
// Only remove {_srs_tmp_file_prefix}*.log file.
4395+
if (path_.find(_srs_tmp_file_prefix) != 0) return;
4396+
if (path_.find(".log") == string::npos) return;
4397+
::unlink(path_.c_str());
4398+
}
44024399

44034400
VOID TEST(KernelFileTest, ReadWriteCase)
44044401
{
44054402
srs_error_t err;
44064403

4407-
string filepath = _srs_tmp_file_prefix + "kernel-file-read-write-case";
4404+
string filepath = _srs_tmp_file_prefix + "kernel-file-read-write-case.log";
44084405
MockFileRemover _mfr(filepath);
44094406

44104407
SrsFileWriter w;
@@ -4431,7 +4428,7 @@ VOID TEST(KernelFileTest, SeekCase)
44314428
{
44324429
srs_error_t err;
44334430

4434-
string filepath = _srs_tmp_file_prefix + "kernel-file-read-write-case";
4431+
string filepath = _srs_tmp_file_prefix + "kernel-file-read-write-case.log";
44354432
MockFileRemover _mfr(filepath);
44364433

44374434
SrsFileWriter w;
@@ -4468,7 +4465,6 @@ VOID TEST(KernelFileTest, SeekCase)
44684465
EXPECT_EQ(5, nn);
44694466

44704467
EXPECT_STREQ("World", buf);
4471-
44724468
}
44734469

44744470
VOID TEST(KernelFLVTest, CoverAll)

trunk/src/utest/srs_utest_kernel.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ class MockSrsFile
3939
virtual srs_error_t lseek(off_t offset, int whence, off_t* seeked);
4040
};
4141

42+
class MockFileRemover
43+
{
44+
private:
45+
std::string path_;
46+
public:
47+
MockFileRemover(std::string p);
48+
virtual ~MockFileRemover();
49+
};
50+
4251
class MockSrsFileWriter : public SrsFileWriter
4352
{
4453
public:

trunk/src/utest/srs_utest_kernel2.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,62 @@ VOID TEST(KernelLogTest, LogLevelStringV2)
352352
EXPECT_EQ(srs_get_log_level_v2("off"), SrsLogLevelDisabled);
353353
}
354354

355+
VOID TEST(KernelFileWriterTest, RealfileTest)
356+
{
357+
srs_error_t err;
358+
359+
string filename = "./test-realfile.log";
360+
MockFileRemover disposer(filename);
361+
362+
if (true) {
363+
SrsFileWriter f;
364+
HELPER_EXPECT_SUCCESS(f.open(filename));
365+
EXPECT_TRUE(f.is_open());
366+
EXPECT_EQ(0, f.tellg());
367+
368+
HELPER_EXPECT_SUCCESS(f.write((void*) "HelloWorld", 10, NULL));
369+
EXPECT_EQ(10, f.tellg());
370+
371+
f.seek2(5);
372+
EXPECT_EQ(5, f.tellg());
373+
374+
HELPER_EXPECT_SUCCESS(f.write((void*) "HelloWorld", 10, NULL));
375+
EXPECT_EQ(15, f.tellg());
376+
377+
off_t v = 0;
378+
HELPER_EXPECT_SUCCESS(f.lseek(0, SEEK_CUR, &v));
379+
EXPECT_EQ(15, v);
380+
381+
HELPER_EXPECT_SUCCESS(f.lseek(0, SEEK_SET, &v));
382+
EXPECT_EQ(0, v);
383+
384+
HELPER_EXPECT_SUCCESS(f.lseek(10, SEEK_SET, &v));
385+
EXPECT_EQ(10, v);
386+
387+
HELPER_EXPECT_SUCCESS(f.lseek(0, SEEK_END, &v));
388+
EXPECT_EQ(15, v);
389+
390+
// There are 5 bytes empty lagging in file.
391+
HELPER_EXPECT_SUCCESS(f.lseek(5, SEEK_END, &v));
392+
EXPECT_EQ(20, v);
393+
394+
HELPER_EXPECT_SUCCESS(f.write((void*) "HelloWorld", 10, NULL));
395+
EXPECT_EQ(30, f.tellg());
396+
397+
HELPER_EXPECT_SUCCESS(f.lseek(0, SEEK_SET, &v));
398+
EXPECT_EQ(0, v);
399+
400+
HELPER_EXPECT_SUCCESS(f.write((void*) "HelloWorld", 10, NULL));
401+
EXPECT_EQ(10, f.tellg());
402+
}
403+
404+
SrsFileReader fr;
405+
HELPER_ASSERT_SUCCESS(fr.open(filename));
406+
407+
// "HelloWorldWorld\0\0\0\0\0HelloWorld"
408+
string str;
409+
HELPER_ASSERT_SUCCESS(srs_ioutil_read_all(&fr, str));
410+
EXPECT_STREQ("HelloWorldWorld", str.c_str());
411+
EXPECT_STREQ("HelloWorld", str.substr(20).c_str());
412+
}
413+

0 commit comments

Comments
 (0)