s.start()
}
-// Flush returns when every write before the call is durable.
-func (s *Syncer) Flush(ctx context.Context) error {
- s.mutex.Lock()
-
- target := s.written
- s.mutex.Unlock()
-
- for {
- s.mutex.Lock()
-
- reached := s.durable >= target
- failure := s.failure
- done := s.done
- s.mutex.Unlock()
-
- if reached {
- return nil
- }
-
- if failure != nil {
- return failure
- }
-
- select {
- case <-done:
- case <-ctx.Done():
- return ctx.Err()
- }
- }
-}
-
-// Close makes every write durable, waits for the syncs, and closes the
-// directory.
-func (s *Syncer) Close() error {
- err := s.Flush(context.Background())
- s.workers.Wait()
-
- if s.file != nil {
- err = errors.Join(err, s.file.Close())
- s.file = nil
- }
-
- return err
-}
-
// start starts a sync of the writes so far when none runs and a write is not
// durable. The caller holds the mutex.
func (s *Syncer) start() {
s.done = make(chan struct{})
s.start()
}
+
+// Close makes every write durable, waits for the syncs, and closes the
+// directory.
+func (s *Syncer) Close() error {
+ err := s.Flush(context.Background())
+ s.workers.Wait()
+
+ if s.file != nil {
+ err = errors.Join(err, s.file.Close())
+ s.file = nil
+ }
+
+ return err
+}
+
+// Flush returns when every write before the call is durable.
+func (s *Syncer) Flush(ctx context.Context) error {
+ s.mutex.Lock()
+
+ target := s.written
+ s.mutex.Unlock()
+
+ for {
+ s.mutex.Lock()
+
+ reached := s.durable >= target
+ failure := s.failure
+ done := s.done
+ s.mutex.Unlock()
+
+ if reached {
+ return nil
+ }
+
+ if failure != nil {
+ return failure
+ }
+
+ select {
+ case <-done:
+ case <-ctx.Done():
+ return ctx.Err()
+ }
+ }
+}