@@ -229,6 +229,7 @@ func (t *freezerTable) repair() error {
229229 lastIndex indexEntry
230230 contentSize int64
231231 contentExp int64
232+ verbose bool
232233 )
233234 // Read index zero, determine what file is the earliest
234235 // and what item offset to use
@@ -272,17 +273,18 @@ func (t *freezerTable) repair() error {
272273 // Keep truncating both files until they come in sync
273274 contentExp = int64 (lastIndex .offset )
274275 for contentExp != contentSize {
276+ verbose = true
275277 // Truncate the head file to the last offset pointer
276278 if contentExp < contentSize {
277- t .logger .Warn ("Truncating dangling head" , "indexed" , common . StorageSize ( contentExp ) , "stored" , common . StorageSize ( contentSize ) )
279+ t .logger .Warn ("Truncating dangling head" , "indexed" , contentExp , "stored" , contentSize )
278280 if err := truncateFreezerFile (t .head , contentExp ); err != nil {
279281 return err
280282 }
281283 contentSize = contentExp
282284 }
283285 // Truncate the index to point within the head file
284286 if contentExp > contentSize {
285- t .logger .Warn ("Truncating dangling indexes" , "indexed" , common . StorageSize ( contentExp ) , "stored" , common . StorageSize ( contentSize ) )
287+ t .logger .Warn ("Truncating dangling indexes" , "indexes" , offsetsSize / indexEntrySize , " indexed" , contentExp , "stored" , contentSize )
286288 if err := truncateFreezerFile (t .index , offsetsSize - indexEntrySize ); err != nil {
287289 return err
288290 }
@@ -343,7 +345,11 @@ func (t *freezerTable) repair() error {
343345 if err := t .preopen (); err != nil {
344346 return err
345347 }
346- t .logger .Debug ("Chain freezer table opened" , "items" , t .items , "size" , common .StorageSize (t .headBytes ))
348+ if verbose {
349+ t .logger .Info ("Chain freezer table opened" , "items" , t .items , "size" , t .headBytes )
350+ } else {
351+ t .logger .Debug ("Chain freezer table opened" , "items" , t .items , "size" , common .StorageSize (t .headBytes ))
352+ }
347353 return nil
348354}
349355
@@ -553,21 +559,31 @@ func (t *freezerTable) Close() error {
553559 defer t .lock .Unlock ()
554560
555561 var errs []error
556- if err := t .index .Close (); err != nil {
557- errs = append (errs , err )
558- }
559- t .index = nil
560-
561- if err := t .meta .Close (); err != nil {
562- errs = append (errs , err )
562+ doClose := func (f * os.File , sync bool , close bool ) {
563+ if sync && ! t .readonly {
564+ if err := f .Sync (); err != nil {
565+ errs = append (errs , err )
566+ }
567+ }
568+ if close {
569+ if err := f .Close (); err != nil {
570+ errs = append (errs , err )
571+ }
572+ }
563573 }
564- t .meta = nil
565-
574+ // Trying to fsync a file opened in rdonly causes "Access denied"
575+ // error on Windows.
576+ doClose (t .index , true , true )
577+ doClose (t .meta , true , true )
578+ // The preopened non-head data-files are all opened in readonly.
579+ // The head is opened in rw-mode, so we sync it here - but since it's also
580+ // part of t.files, it will be closed in the loop below.
581+ doClose (t .head , true , false ) // sync but do not close
566582 for _ , f := range t .files {
567- if err := f .Close (); err != nil {
568- errs = append (errs , err )
569- }
583+ doClose (f , false , true ) // close but do not sync
570584 }
585+ t .index = nil
586+ t .meta = nil
571587 t .head = nil
572588
573589 if errs != nil {
@@ -724,7 +740,7 @@ func (t *freezerTable) retrieveItems(start, count, maxBytes uint64) ([]byte, []i
724740 defer t .lock .RUnlock ()
725741
726742 // Ensure the table and the item are accessible
727- if t .index == nil || t .head == nil {
743+ if t .index == nil || t .head == nil || t . meta == nil {
728744 return nil , nil , errClosed
729745 }
730746 var (
@@ -872,7 +888,9 @@ func (t *freezerTable) advanceHead() error {
872888func (t * freezerTable ) Sync () error {
873889 t .lock .Lock ()
874890 defer t .lock .Unlock ()
875-
891+ if t .index == nil || t .head == nil || t .meta == nil {
892+ return errClosed
893+ }
876894 var err error
877895 trackError := func (e error ) {
878896 if e != nil && err == nil {
@@ -903,7 +921,8 @@ func (t *freezerTable) dumpIndex(w io.Writer, start, stop int64) {
903921 fmt .Fprintf (w , "Failed to decode freezer table %v\n " , err )
904922 return
905923 }
906- fmt .Fprintf (w , "Version %d deleted %d, hidden %d\n " , meta .Version , atomic .LoadUint64 (& t .itemOffset ), atomic .LoadUint64 (& t .itemHidden ))
924+ fmt .Fprintf (w , "Version %d count %d, deleted %d, hidden %d\n " , meta .Version ,
925+ atomic .LoadUint64 (& t .items ), atomic .LoadUint64 (& t .itemOffset ), atomic .LoadUint64 (& t .itemHidden ))
907926
908927 buf := make ([]byte , indexEntrySize )
909928
0 commit comments