mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	Exporting Zone.File to avoid getters and setters Updating getter and setter for Zone.File to be less racy Renaming GetFile to File in zone plugin
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package file
 | |
| 
 | |
| import (
 | |
| 	"os"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| // TickTime is the default time we use to reload zone. Exported to be tweaked in tests.
 | |
| var TickTime = 1 * time.Minute
 | |
| 
 | |
| // Reload reloads a zone when it is changed on disk. If z.NoRoload is true, no reloading will be done.
 | |
| func (z *Zone) Reload() error {
 | |
| 	if z.NoReload {
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	tick := time.NewTicker(TickTime)
 | |
| 
 | |
| 	go func() {
 | |
| 
 | |
| 		for {
 | |
| 			select {
 | |
| 
 | |
| 			case <-tick.C:
 | |
| 				zFile := z.File()
 | |
| 				reader, err := os.Open(zFile)
 | |
| 				if err != nil {
 | |
| 					log.Errorf("Failed to open zone %q in %q: %v", z.origin, zFile, err)
 | |
| 					continue
 | |
| 				}
 | |
| 
 | |
| 				serial := z.SOASerialIfDefined()
 | |
| 				zone, err := Parse(reader, z.origin, zFile, serial)
 | |
| 				if err != nil {
 | |
| 					if _, ok := err.(*serialErr); !ok {
 | |
| 						log.Errorf("Parsing zone %q: %v", z.origin, err)
 | |
| 					}
 | |
| 					continue
 | |
| 				}
 | |
| 
 | |
| 				// copy elements we need
 | |
| 				z.reloadMu.Lock()
 | |
| 				z.Apex = zone.Apex
 | |
| 				z.Tree = zone.Tree
 | |
| 				z.reloadMu.Unlock()
 | |
| 
 | |
| 				log.Infof("Successfully reloaded zone %q in %q with serial %d", z.origin, zFile, z.Apex.SOA.Serial)
 | |
| 				z.Notify()
 | |
| 
 | |
| 			case <-z.reloadShutdown:
 | |
| 				tick.Stop()
 | |
| 				return
 | |
| 			}
 | |
| 		}
 | |
| 	}()
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // SOASerialIfDefined returns the SOA's serial if the zone has a SOA record in the Apex, or
 | |
| // -1 otherwise.
 | |
| func (z *Zone) SOASerialIfDefined() int64 {
 | |
| 	z.reloadMu.Lock()
 | |
| 	defer z.reloadMu.Unlock()
 | |
| 	if z.Apex.SOA != nil {
 | |
| 		return int64(z.Apex.SOA.Serial)
 | |
| 	}
 | |
| 	return -1
 | |
| }
 |