24
24
#include " util/rate_limiter.h"
25
25
26
26
namespace ROCKSDB_NAMESPACE {
27
- namespace {
28
- IOStatus AssertFalseAndGetStatusForPrevError () {
29
- assert (false );
30
- return IOStatus::IOError (" Writer has previous error." );
31
- }
32
- } // namespace
33
-
34
27
IOStatus WritableFileWriter::Create (const std::shared_ptr<FileSystem>& fs,
35
28
const std::string& fname,
36
29
const FileOptions& file_opts,
@@ -51,7 +44,7 @@ IOStatus WritableFileWriter::Create(const std::shared_ptr<FileSystem>& fs,
51
44
52
45
IOStatus WritableFileWriter::Append (const Slice& data, uint32_t crc32c_checksum,
53
46
Env::IOPriority op_rate_limiter_priority) {
54
- if (seen_error_ ) {
47
+ if (seen_error () ) {
55
48
return AssertFalseAndGetStatusForPrevError ();
56
49
}
57
50
@@ -97,7 +90,7 @@ IOStatus WritableFileWriter::Append(const Slice& data, uint32_t crc32c_checksum,
97
90
if (buf_.CurrentSize () > 0 ) {
98
91
s = Flush (op_rate_limiter_priority);
99
92
if (!s.ok ()) {
100
- seen_error_ = true ;
93
+ set_seen_error () ;
101
94
return s;
102
95
}
103
96
}
@@ -179,14 +172,14 @@ IOStatus WritableFileWriter::Append(const Slice& data, uint32_t crc32c_checksum,
179
172
uint64_t cur_size = filesize_.load (std::memory_order_acquire);
180
173
filesize_.store (cur_size + data.size (), std::memory_order_release);
181
174
} else {
182
- seen_error_ = true ;
175
+ set_seen_error () ;
183
176
}
184
177
return s;
185
178
}
186
179
187
180
IOStatus WritableFileWriter::Pad (const size_t pad_bytes,
188
181
Env::IOPriority op_rate_limiter_priority) {
189
- if (seen_error_ ) {
182
+ if (seen_error () ) {
190
183
return AssertFalseAndGetStatusForPrevError ();
191
184
}
192
185
assert (pad_bytes < kDefaultPageSize );
@@ -204,7 +197,7 @@ IOStatus WritableFileWriter::Pad(const size_t pad_bytes,
204
197
if (left > 0 ) {
205
198
IOStatus s = Flush (op_rate_limiter_priority);
206
199
if (!s.ok ()) {
207
- seen_error_ = true ;
200
+ set_seen_error () ;
208
201
return s;
209
202
}
210
203
}
@@ -222,7 +215,7 @@ IOStatus WritableFileWriter::Pad(const size_t pad_bytes,
222
215
}
223
216
224
217
IOStatus WritableFileWriter::Close () {
225
- if (seen_error_ ) {
218
+ if (seen_error () ) {
226
219
IOStatus interim;
227
220
if (writable_file_.get () != nullptr ) {
228
221
interim = writable_file_->Close (IOOptions (), nullptr );
@@ -333,7 +326,7 @@ IOStatus WritableFileWriter::Close() {
333
326
checksum_finalized_ = true ;
334
327
}
335
328
} else {
336
- seen_error_ = true ;
329
+ set_seen_error () ;
337
330
}
338
331
339
332
return s;
@@ -342,7 +335,7 @@ IOStatus WritableFileWriter::Close() {
342
335
// write out the cached data to the OS cache or storage if direct I/O
343
336
// enabled
344
337
IOStatus WritableFileWriter::Flush (Env::IOPriority op_rate_limiter_priority) {
345
- if (seen_error_ ) {
338
+ if (seen_error () ) {
346
339
return AssertFalseAndGetStatusForPrevError ();
347
340
}
348
341
@@ -370,7 +363,7 @@ IOStatus WritableFileWriter::Flush(Env::IOPriority op_rate_limiter_priority) {
370
363
}
371
364
}
372
365
if (!s.ok ()) {
373
- seen_error_ = true ;
366
+ set_seen_error () ;
374
367
return s;
375
368
}
376
369
}
@@ -399,7 +392,7 @@ IOStatus WritableFileWriter::Flush(Env::IOPriority op_rate_limiter_priority) {
399
392
}
400
393
401
394
if (!s.ok ()) {
402
- seen_error_ = true ;
395
+ set_seen_error () ;
403
396
return s;
404
397
}
405
398
@@ -427,7 +420,7 @@ IOStatus WritableFileWriter::Flush(Env::IOPriority op_rate_limiter_priority) {
427
420
offset_sync_to - last_sync_size_ >= bytes_per_sync_) {
428
421
s = RangeSync (last_sync_size_, offset_sync_to - last_sync_size_);
429
422
if (!s.ok ()) {
430
- seen_error_ = true ;
423
+ set_seen_error () ;
431
424
}
432
425
last_sync_size_ = offset_sync_to;
433
426
}
@@ -455,20 +448,20 @@ const char* WritableFileWriter::GetFileChecksumFuncName() const {
455
448
}
456
449
457
450
IOStatus WritableFileWriter::Sync (bool use_fsync) {
458
- if (seen_error_ ) {
451
+ if (seen_error () ) {
459
452
return AssertFalseAndGetStatusForPrevError ();
460
453
}
461
454
462
455
IOStatus s = Flush ();
463
456
if (!s.ok ()) {
464
- seen_error_ = true ;
457
+ set_seen_error () ;
465
458
return s;
466
459
}
467
460
TEST_KILL_RANDOM (" WritableFileWriter::Sync:0" );
468
461
if (!use_direct_io () && pending_sync_) {
469
462
s = SyncInternal (use_fsync);
470
463
if (!s.ok ()) {
471
- seen_error_ = true ;
464
+ set_seen_error () ;
472
465
return s;
473
466
}
474
467
}
@@ -478,10 +471,9 @@ IOStatus WritableFileWriter::Sync(bool use_fsync) {
478
471
}
479
472
480
473
IOStatus WritableFileWriter::SyncWithoutFlush (bool use_fsync) {
481
- if (seen_error_ ) {
474
+ if (seen_error () ) {
482
475
return AssertFalseAndGetStatusForPrevError ();
483
476
}
484
-
485
477
if (!writable_file_->IsSyncThreadSafe ()) {
486
478
return IOStatus::NotSupported (
487
479
" Can't WritableFileWriter::SyncWithoutFlush() because "
@@ -491,16 +483,16 @@ IOStatus WritableFileWriter::SyncWithoutFlush(bool use_fsync) {
491
483
IOStatus s = SyncInternal (use_fsync);
492
484
TEST_SYNC_POINT (" WritableFileWriter::SyncWithoutFlush:2" );
493
485
if (!s.ok ()) {
494
- seen_error_ = true ;
486
+ #ifndef NDEBUG
487
+ sync_without_flush_called_ = true ;
488
+ #endif // NDEBUG
489
+ set_seen_error ();
495
490
}
496
491
return s;
497
492
}
498
493
499
494
IOStatus WritableFileWriter::SyncInternal (bool use_fsync) {
500
- if (seen_error_) {
501
- return AssertFalseAndGetStatusForPrevError ();
502
- }
503
-
495
+ // Caller is supposed to check seen_error_
504
496
IOStatus s;
505
497
IOSTATS_TIMER_GUARD (fsync_nanos);
506
498
TEST_SYNC_POINT (" WritableFileWriter::SyncInternal:0" );
@@ -536,14 +528,13 @@ IOStatus WritableFileWriter::SyncInternal(bool use_fsync) {
536
528
}
537
529
#endif
538
530
SetPerfLevel (prev_perf_level);
539
- if (!s.ok ()) {
540
- seen_error_ = true ;
541
- }
531
+
532
+ // The caller will be responsible to call set_seen_error() if s is not OK.
542
533
return s;
543
534
}
544
535
545
536
IOStatus WritableFileWriter::RangeSync (uint64_t offset, uint64_t nbytes) {
546
- if (seen_error_ ) {
537
+ if (seen_error () ) {
547
538
return AssertFalseAndGetStatusForPrevError ();
548
539
}
549
540
@@ -559,7 +550,7 @@ IOStatus WritableFileWriter::RangeSync(uint64_t offset, uint64_t nbytes) {
559
550
io_options.rate_limiter_priority = writable_file_->GetIOPriority ();
560
551
IOStatus s = writable_file_->RangeSync (offset, nbytes, io_options, nullptr );
561
552
if (!s.ok ()) {
562
- seen_error_ = true ;
553
+ set_seen_error () ;
563
554
}
564
555
#ifndef ROCKSDB_LITE
565
556
if (ShouldNotifyListeners ()) {
@@ -578,7 +569,7 @@ IOStatus WritableFileWriter::RangeSync(uint64_t offset, uint64_t nbytes) {
578
569
// limiter if available
579
570
IOStatus WritableFileWriter::WriteBuffered (
580
571
const char * data, size_t size, Env::IOPriority op_rate_limiter_priority) {
581
- if (seen_error_ ) {
572
+ if (seen_error () ) {
582
573
return AssertFalseAndGetStatusForPrevError ();
583
574
}
584
575
@@ -653,7 +644,7 @@ IOStatus WritableFileWriter::WriteBuffered(
653
644
}
654
645
#endif
655
646
if (!s.ok ()) {
656
- seen_error_ = true ;
647
+ set_seen_error () ;
657
648
return s;
658
649
}
659
650
}
@@ -669,14 +660,14 @@ IOStatus WritableFileWriter::WriteBuffered(
669
660
buf_.Size (0 );
670
661
buffered_data_crc32c_checksum_ = 0 ;
671
662
if (!s.ok ()) {
672
- seen_error_ = true ;
663
+ set_seen_error () ;
673
664
}
674
665
return s;
675
666
}
676
667
677
668
IOStatus WritableFileWriter::WriteBufferedWithChecksum (
678
669
const char * data, size_t size, Env::IOPriority op_rate_limiter_priority) {
679
- if (seen_error_ ) {
670
+ if (seen_error () ) {
680
671
return AssertFalseAndGetStatusForPrevError ();
681
672
}
682
673
@@ -751,7 +742,7 @@ IOStatus WritableFileWriter::WriteBufferedWithChecksum(
751
742
// and let caller determine error handling.
752
743
buf_.Size (0 );
753
744
buffered_data_crc32c_checksum_ = 0 ;
754
- seen_error_ = true ;
745
+ set_seen_error () ;
755
746
return s;
756
747
}
757
748
}
@@ -766,7 +757,7 @@ IOStatus WritableFileWriter::WriteBufferedWithChecksum(
766
757
uint64_t cur_size = flushed_size_.load (std::memory_order_acquire);
767
758
flushed_size_.store (cur_size + left, std::memory_order_release);
768
759
if (!s.ok ()) {
769
- seen_error_ = true ;
760
+ set_seen_error () ;
770
761
}
771
762
return s;
772
763
}
@@ -801,7 +792,7 @@ void WritableFileWriter::Crc32cHandoffChecksumCalculation(const char* data,
801
792
#ifndef ROCKSDB_LITE
802
793
IOStatus WritableFileWriter::WriteDirect (
803
794
Env::IOPriority op_rate_limiter_priority) {
804
- if (seen_error_ ) {
795
+ if (seen_error () ) {
805
796
assert (false );
806
797
807
798
return IOStatus::IOError (" Writer has previous error." );
@@ -873,7 +864,7 @@ IOStatus WritableFileWriter::WriteDirect(
873
864
}
874
865
if (!s.ok ()) {
875
866
buf_.Size (file_advance + leftover_tail);
876
- seen_error_ = true ;
867
+ set_seen_error () ;
877
868
return s;
878
869
}
879
870
}
@@ -898,14 +889,14 @@ IOStatus WritableFileWriter::WriteDirect(
898
889
// behind
899
890
next_write_offset_ += file_advance;
900
891
} else {
901
- seen_error_ = true ;
892
+ set_seen_error () ;
902
893
}
903
894
return s;
904
895
}
905
896
906
897
IOStatus WritableFileWriter::WriteDirectWithChecksum (
907
898
Env::IOPriority op_rate_limiter_priority) {
908
- if (seen_error_ ) {
899
+ if (seen_error () ) {
909
900
return AssertFalseAndGetStatusForPrevError ();
910
901
}
911
902
@@ -986,7 +977,7 @@ IOStatus WritableFileWriter::WriteDirectWithChecksum(
986
977
buf_.Size (file_advance + leftover_tail);
987
978
buffered_data_crc32c_checksum_ =
988
979
crc32c::Value (buf_.BufferStart (), buf_.CurrentSize ());
989
- seen_error_ = true ;
980
+ set_seen_error () ;
990
981
return s;
991
982
}
992
983
}
@@ -1011,7 +1002,7 @@ IOStatus WritableFileWriter::WriteDirectWithChecksum(
1011
1002
// behind
1012
1003
next_write_offset_ += file_advance;
1013
1004
} else {
1014
- seen_error_ = true ;
1005
+ set_seen_error () ;
1015
1006
}
1016
1007
return s;
1017
1008
}
0 commit comments