From 27006f58c506b3dd365a1dea3a9e42f41d5c2a6e Mon Sep 17 00:00:00 2001 From: Simon Zolin <s.zolin@adguard.com> Date: Tue, 16 Jul 2019 12:55:18 +0300 Subject: [PATCH] - filters: windows: fix update procedure We couldn't write filter files on Windows due to "file is being used" error. --- home/filter.go | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/home/filter.go b/home/filter.go index c01ce55b..4e509866 100644 --- a/home/filter.go +++ b/home/filter.go @@ -170,12 +170,15 @@ func periodicallyRefreshFilters() { // Algorithm: // . Get the list of filters to be updated // . For each filter run the download and checksum check operation -// . If filter data hasn't changed, set new update time -// . If filter data has changed, parse it, save it on disk, set new update time +// . Stop server +// . For each filter: +// . If filter data hasn't changed, just set new update time on file +// . If filter data has changed, save it on disk // . Apply changes to the current configuration -// . Restart server +// . Start server func refreshFiltersIfNecessary(force bool) int { var updateFilters []filter + var updateFlags []bool // 'true' if filter data has changed if config.firstRun { return 0 @@ -210,21 +213,28 @@ func refreshFiltersIfNecessary(force bool) int { log.Printf("Failed to update filter %s: %s\n", uf.URL, err) continue } + uf.LastUpdated = time.Now() + updateFlags = append(updateFlags, updated) + } + + isRunning := isRunning() + _ = dnsServer.Stop() + + for i := range updateFilters { + uf := &updateFilters[i] + updated := updateFlags[i] if updated { // Saving it to the filters dir now - err = uf.save() + err := uf.save() if err != nil { log.Printf("Failed to save the updated filter %d: %s", uf.ID, err) continue } - } else { - mtime := time.Now() - e := os.Chtimes(uf.Path(), mtime, mtime) + e := os.Chtimes(uf.Path(), uf.LastUpdated, uf.LastUpdated) if e != nil { log.Error("os.Chtimes(): %v", e) } - uf.LastUpdated = mtime } config.Lock() @@ -249,7 +259,7 @@ func refreshFiltersIfNecessary(force bool) int { config.Unlock() } - if updateCount > 0 && isRunning() { + if updateCount > 0 && isRunning { err := reconfigureDNSServer() if err != nil { msg := fmt.Sprintf("SHOULD NOT HAPPEN: cannot reconfigure DNS server with the new filters: %s", err)