@@ -20,7 +20,7 @@ use crate::{
20
20
} ,
21
21
Error , Result ,
22
22
} ;
23
- use async_fd_lock:: LockWrite ;
23
+ use async_fd_lock:: { LockRead , LockWrite } ;
24
24
use async_stream:: try_stream;
25
25
use async_trait:: async_trait;
26
26
use binary_stream:: futures:: { BinaryReader , Decodable , Encodable } ;
@@ -40,10 +40,8 @@ use std::result::Result as StdResult;
40
40
use std:: {
41
41
io:: SeekFrom ,
42
42
path:: { Path , PathBuf } ,
43
- sync:: Arc ,
44
43
} ;
45
44
use tokio:: io:: { AsyncReadExt , AsyncSeekExt , AsyncWriteExt , BufReader } ;
46
- use tokio:: sync:: Mutex ;
47
45
48
46
#[ cfg( feature = "files" ) ]
49
47
use sos_core:: events:: FileEvent ;
@@ -69,20 +67,19 @@ type Iter = Box<dyn FormatStreamIterator<EventLogRecord> + Send + Sync>;
69
67
/// Read the bytes for the encoded event
70
68
/// inside the log record.
71
69
async fn read_event_buffer (
72
- handle : Arc < Mutex < File > > ,
70
+ file_path : impl AsRef < Path > ,
73
71
record : & EventLogRecord ,
74
72
) -> Result < Vec < u8 > > {
75
- let mut file = handle. lock ( ) . await ;
76
-
77
- // let _guard = file.lock().await;
73
+ let file = File :: open ( file_path. as_ref ( ) ) . await ?;
74
+ let mut guard = file. lock_read ( ) . await . map_err ( |e| e. error ) ?;
78
75
79
76
let offset = record. value ( ) ;
80
77
let row_len = offset. end - offset. start ;
81
78
82
- file . seek ( SeekFrom :: Start ( offset. start ) ) . await ?;
79
+ guard . seek ( SeekFrom :: Start ( offset. start ) ) . await ?;
83
80
84
81
let mut buf = vec ! [ 0u8 ; row_len as usize ] ;
85
- file . read_exact ( & mut buf) . await ?;
82
+ guard . read_exact ( & mut buf) . await ?;
86
83
87
84
Ok ( buf)
88
85
}
@@ -104,7 +101,6 @@ where
104
101
+ Sync
105
102
+ ' static ,
106
103
{
107
- file : Arc < Mutex < File > > ,
108
104
tree : CommitTree ,
109
105
data : PathBuf ,
110
106
identity : & ' static [ u8 ] ,
@@ -133,11 +129,11 @@ where
133
129
) -> BoxStream < ' async_trait , StdResult < EventRecord , Self :: Error > > {
134
130
let mut it =
135
131
self . iter ( reverse) . await . expect ( "to initialize iterator" ) ;
136
- let handle = self . file ( ) ;
132
+ let file_path = self . data . clone ( ) ;
137
133
Box :: pin ( try_stream ! {
138
134
while let Some ( record) = it. next( ) . await ? {
139
135
let event_buffer = read_event_buffer(
140
- handle . clone( ) , & record) . await ?;
136
+ file_path . clone( ) , & record) . await ?;
141
137
let event_record = record. into_event_record( event_buffer) ;
142
138
yield event_record;
143
139
}
@@ -152,11 +148,11 @@ where
152
148
let mut it =
153
149
self . iter ( reverse) . await . expect ( "to initialize iterator" ) ;
154
150
155
- let handle = self . file ( ) ;
151
+ let file_path = self . data . clone ( ) ;
156
152
Box :: pin ( try_stream ! {
157
153
while let Some ( record) = it. next( ) . await ? {
158
154
let event_buffer = read_event_buffer(
159
- handle . clone( ) , & record) . await ?;
155
+ file_path . clone( ) , & record) . await ?;
160
156
let event_record = record. into_event_record( event_buffer) ;
161
157
let event = event_record. decode_event:: <T >( ) . await ?;
162
158
yield ( event_record, event) ;
@@ -208,16 +204,11 @@ where
208
204
209
205
tracing:: trace!( length = %length, "event_log::rewind" ) ;
210
206
211
- let handle = self . file ( ) ;
212
207
let mut records = Vec :: new ( ) ;
213
208
214
209
while let Some ( record) = it. next ( ) . await ? {
215
210
// Found the target commit
216
211
if & record. commit ( ) == commit. as_ref ( ) {
217
- // Acquire file lock as we will truncate
218
- let file = self . file ( ) ;
219
- let _guard = file. lock ( ) . await ;
220
-
221
212
// Rewrite the in-memory tree
222
213
let mut leaves = self . tree ( ) . leaves ( ) . unwrap_or_default ( ) ;
223
214
if leaves. len ( ) > records. len ( ) {
@@ -237,7 +228,6 @@ where
237
228
let mut guard =
238
229
file. lock_write ( ) . await . map_err ( |e| e. error ) ?;
239
230
guard. inner_mut ( ) . set_len ( length) . await ?;
240
- // file.set_len(length).await?;
241
231
242
232
return Ok ( records) ;
243
233
}
@@ -249,8 +239,7 @@ where
249
239
length -= byte_length;
250
240
}
251
241
252
- let event_buffer =
253
- read_event_buffer ( handle. clone ( ) , & record) . await ?;
242
+ let event_buffer = read_event_buffer ( & self . data , & record) . await ?;
254
243
255
244
let event_record = record. into_event_record ( event_buffer) ;
256
245
records. push ( event_record) ;
@@ -310,9 +299,6 @@ where
310
299
commits. push ( * record. commit ( ) ) ;
311
300
}
312
301
313
- let rw = self . file ( ) ;
314
- let _lock = rw. lock ( ) . await ;
315
-
316
302
#[ allow( unused_mut) ]
317
303
let mut file = OpenOptions :: new ( )
318
304
. write ( true )
@@ -433,16 +419,15 @@ where
433
419
commit : Option < & CommitHash > ,
434
420
) -> StdResult < Vec < EventRecord > , Self :: Error > {
435
421
let mut events = Vec :: new ( ) ;
436
- let file = self . file ( ) ;
422
+ // let file = self.file();
437
423
let mut it = self . iter ( true ) . await ?;
438
424
while let Some ( record) = it. next ( ) . await ? {
439
425
if let Some ( commit) = commit {
440
426
if & record. commit ( ) == commit. as_ref ( ) {
441
427
return Ok ( events) ;
442
428
}
443
429
}
444
- let buffer =
445
- read_event_buffer ( Arc :: clone ( & file) , & record) . await ?;
430
+ let buffer = read_event_buffer ( & self . data , & record) . await ?;
446
431
// Iterating in reverse order as we would typically
447
432
// be looking for commits near the end of the event log
448
433
// but we want the patch events in the order they were
@@ -488,7 +473,6 @@ where
488
473
AsyncSeekExt as TokioAsyncSeekExt ,
489
474
AsyncWriteExt as TokioAsyncWriteExt ,
490
475
} ;
491
- let _ = self . file . lock ( ) . await ;
492
476
493
477
// Workaround for set_len(0) failing with "Access Denied" on Windows
494
478
// SEE: https://github.com/rust-lang/rust/issues/105437
@@ -518,12 +502,12 @@ where
518
502
) -> StdResult < T , E > {
519
503
let value = item. value ( ) ;
520
504
521
- let rw = self . file ( ) ;
522
- let mut file = rw . lock ( ) . await ;
505
+ let file = File :: open ( & self . data ) . await ? ;
506
+ let mut guard = file . lock_read ( ) . await . map_err ( |e| e . error ) ? ;
523
507
524
- file . seek ( SeekFrom :: Start ( value. start ) ) . await ?;
508
+ guard . seek ( SeekFrom :: Start ( value. start ) ) . await ?;
525
509
let mut buffer = vec ! [ 0 ; ( value. end - value. start) as usize ] ;
526
- file . read_exact ( buffer. as_mut_slice ( ) ) . await ?;
510
+ guard . read_exact ( buffer. as_mut_slice ( ) ) . await ?;
527
511
528
512
let mut stream = BufReader :: new ( Cursor :: new ( & mut buffer) ) ;
529
513
let mut reader = BinaryReader :: new ( & mut stream, encoding_options ( ) ) ;
@@ -549,10 +533,6 @@ where
549
533
Ok ( it)
550
534
}
551
535
552
- fn file ( & self ) -> Arc < Mutex < File > > {
553
- Arc :: clone ( & self . file )
554
- }
555
-
556
536
/// Length of the file magic bytes and optional
557
537
/// encoding version.
558
538
#[ doc( hidden) ]
@@ -589,26 +569,23 @@ where
589
569
}
590
570
*/
591
571
592
- /// Create the writer for an event log file.
593
- async fn create_writer < P : AsRef < Path > > (
572
+ /// Create an event log file if it does not exist.
573
+ ///
574
+ /// Ensure the identity bytes are written when the file
575
+ /// length is zero.
576
+ async fn initialize_event_log < P : AsRef < Path > > (
594
577
path : P ,
595
578
identity : & ' static [ u8 ] ,
596
579
encoding_version : Option < u16 > ,
597
- ) -> StdResult < File , E > {
580
+ ) -> StdResult < ( ) , E > {
598
581
let file = OpenOptions :: new ( )
599
582
. create ( true )
600
- . read ( true )
601
- . append ( true )
583
+ . write ( true )
602
584
. open ( path. as_ref ( ) )
603
585
. await ?;
604
586
605
587
let size = vfs:: metadata ( path. as_ref ( ) ) . await ?. len ( ) ;
606
588
if size == 0 {
607
- let file = OpenOptions :: new ( )
608
- . create ( true )
609
- . append ( true )
610
- . open ( path. as_ref ( ) )
611
- . await ?;
612
589
let mut guard = file. lock_write ( ) . await . map_err ( |e| e. error ) ?;
613
590
let mut header = identity. to_vec ( ) ;
614
591
if let Some ( version) = encoding_version {
@@ -618,14 +595,11 @@ where
618
595
guard. flush ( ) . await ?;
619
596
}
620
597
621
- Ok ( file )
598
+ Ok ( ( ) )
622
599
}
623
600
624
601
#[ doc( hidden) ]
625
602
async fn try_create_snapshot ( & self ) -> StdResult < Option < PathBuf > , E > {
626
- let file = self . file ( ) ;
627
- let _guard = file. lock ( ) . await ;
628
-
629
603
if let Some ( root) = self . tree ( ) . root ( ) {
630
604
let mut snapshot_path = self . data . clone ( ) ;
631
605
snapshot_path. set_extension ( & format ! ( "snapshot-{}" , root) ) ;
@@ -653,9 +627,6 @@ where
653
627
) -> StdResult < ( ) , E > {
654
628
let source_path = self . data . clone ( ) ;
655
629
656
- let file = self . file ( ) ;
657
- let _guard = file. lock ( ) . await ;
658
-
659
630
let metadata = vfs:: metadata ( snapshot_path) . await ?;
660
631
tracing:: debug!(
661
632
file_size = %metadata. len( ) ,
@@ -689,7 +660,7 @@ where
689
660
// Note that for backwards compatibility we don't
690
661
// encode a version, later we will need to upgrade
691
662
// the encoding to include a version
692
- let writer = Self :: create_writer (
663
+ Self :: initialize_event_log (
693
664
path. as_ref ( ) ,
694
665
& FOLDER_EVENT_LOG_IDENTITY ,
695
666
None ,
@@ -700,7 +671,6 @@ where
700
671
. await ?;
701
672
702
673
Ok ( Self {
703
- file : Arc :: new ( Mutex :: new ( writer) ) ,
704
674
data : path. as_ref ( ) . to_path_buf ( ) ,
705
675
tree : Default :: default ( ) ,
706
676
identity : & FOLDER_EVENT_LOG_IDENTITY ,
@@ -726,7 +696,7 @@ where
726
696
use sos_core:: {
727
697
constants:: ACCOUNT_EVENT_LOG_IDENTITY , encoding:: VERSION ,
728
698
} ;
729
- let writer = Self :: create_writer (
699
+ Self :: initialize_event_log (
730
700
path. as_ref ( ) ,
731
701
& ACCOUNT_EVENT_LOG_IDENTITY ,
732
702
Some ( VERSION ) ,
@@ -737,7 +707,6 @@ where
737
707
. await ?;
738
708
739
709
Ok ( Self {
740
- file : Arc :: new ( Mutex :: new ( writer) ) ,
741
710
data : path. as_ref ( ) . to_path_buf ( ) ,
742
711
tree : Default :: default ( ) ,
743
712
identity : & ACCOUNT_EVENT_LOG_IDENTITY ,
@@ -763,7 +732,8 @@ where
763
732
use sos_core:: {
764
733
constants:: DEVICE_EVENT_LOG_IDENTITY , encoding:: VERSION ,
765
734
} ;
766
- let writer = Self :: create_writer (
735
+
736
+ Self :: initialize_event_log (
767
737
path. as_ref ( ) ,
768
738
& DEVICE_EVENT_LOG_IDENTITY ,
769
739
Some ( VERSION ) ,
@@ -774,7 +744,6 @@ where
774
744
. await ?;
775
745
776
746
Ok ( Self {
777
- file : Arc :: new ( Mutex :: new ( writer) ) ,
778
747
data : path. as_ref ( ) . to_path_buf ( ) ,
779
748
tree : Default :: default ( ) ,
780
749
identity : & DEVICE_EVENT_LOG_IDENTITY ,
@@ -801,7 +770,8 @@ where
801
770
use sos_core:: {
802
771
constants:: FILE_EVENT_LOG_IDENTITY , encoding:: VERSION ,
803
772
} ;
804
- let writer = Self :: create_writer (
773
+
774
+ Self :: initialize_event_log (
805
775
path. as_ref ( ) ,
806
776
& FILE_EVENT_LOG_IDENTITY ,
807
777
Some ( VERSION ) ,
@@ -812,7 +782,6 @@ where
812
782
. await ?;
813
783
814
784
Ok ( Self {
815
- file : Arc :: new ( Mutex :: new ( writer) ) ,
816
785
data : path. as_ref ( ) . to_path_buf ( ) ,
817
786
tree : Default :: default ( ) ,
818
787
identity : & FILE_EVENT_LOG_IDENTITY ,
0 commit comments