Browse Source

Fix Reloader skipping initialization

- Zero-value checksum matches empty file, resulting in no reloadAction call on
  first load.

- Caused panic in psiphon/server.DNSResolver with empty resolv.conf.
Rod Hynes 1 năm trước cách đây
mục cha
commit
81d85b8bab
1 tập tin đã thay đổi với 4 bổ sung2 xóa
  1. 4 2
      psiphon/common/reloader.go

+ 4 - 2
psiphon/common/reloader.go

@@ -62,11 +62,11 @@ type Reloader interface {
 //
 //
 // reloadAction must ensure that data structures revert to their previous state when
 // reloadAction must ensure that data structures revert to their previous state when
 // a reload fails.
 // a reload fails.
-//
 type ReloadableFile struct {
 type ReloadableFile struct {
 	sync.RWMutex
 	sync.RWMutex
 	filename        string
 	filename        string
 	loadFileContent bool
 	loadFileContent bool
+	hasLoaded       bool
 	checksum        uint64
 	checksum        uint64
 	reloadAction    func([]byte, time.Time) error
 	reloadAction    func([]byte, time.Time) error
 }
 }
@@ -122,6 +122,7 @@ func (reloadable *ReloadableFile) Reload() (bool, error) {
 
 
 	reloadable.RLock()
 	reloadable.RLock()
 	filename := reloadable.filename
 	filename := reloadable.filename
+	hasLoaded := reloadable.hasLoaded
 	previousChecksum := reloadable.checksum
 	previousChecksum := reloadable.checksum
 	reloadable.RUnlock()
 	reloadable.RUnlock()
 
 
@@ -148,7 +149,7 @@ func (reloadable *ReloadableFile) Reload() (bool, error) {
 
 
 	checksum := hash.Sum64()
 	checksum := hash.Sum64()
 
 
-	if checksum == previousChecksum {
+	if hasLoaded && checksum == previousChecksum {
 		return false, nil
 		return false, nil
 	}
 	}
 
 
@@ -181,6 +182,7 @@ func (reloadable *ReloadableFile) Reload() (bool, error) {
 		return false, errors.Trace(err)
 		return false, errors.Trace(err)
 	}
 	}
 
 
+	reloadable.hasLoaded = true
 	reloadable.checksum = checksum
 	reloadable.checksum = checksum
 
 
 	return true, nil
 	return true, nil