Merge: * "refresh filters" HTTP handler: return the old synchronous behaviour
Close #1058 * commit 'c9d7bc30698555677a1922d7dfb8e3882249cbba': * "refresh filters" HTTP handler: return the old synchronous behaviour
This commit is contained in:
commit
6612ccf107
|
@ -177,8 +177,14 @@ func handleFilteringSetRules(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleFilteringRefresh(w http.ResponseWriter, r *http.Request) {
|
func handleFilteringRefresh(w http.ResponseWriter, r *http.Request) {
|
||||||
beginRefreshFilters()
|
config.controlLock.Unlock()
|
||||||
fmt.Fprintf(w, "OK 0 filters updated\n")
|
nUpdated, err := refreshFilters()
|
||||||
|
config.controlLock.Lock()
|
||||||
|
if err != nil {
|
||||||
|
httpError(w, http.StatusInternalServerError, "%s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Fprintf(w, "OK %d filters updated\n", nUpdated)
|
||||||
}
|
}
|
||||||
|
|
||||||
type filterJSON struct {
|
type filterJSON struct {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/AdguardTeam/AdGuardHome/dnsfilter"
|
"github.com/AdguardTeam/AdGuardHome/dnsfilter"
|
||||||
|
@ -19,7 +20,8 @@ import (
|
||||||
var (
|
var (
|
||||||
nextFilterID = time.Now().Unix() // semi-stable way to generate an unique ID
|
nextFilterID = time.Now().Unix() // semi-stable way to generate an unique ID
|
||||||
filterTitleRegexp = regexp.MustCompile(`^! Title: +(.*)$`)
|
filterTitleRegexp = regexp.MustCompile(`^! Title: +(.*)$`)
|
||||||
forceRefresh bool
|
refreshStatus uint32 // 0:none; 1:in progress
|
||||||
|
refreshLock sync.Mutex
|
||||||
)
|
)
|
||||||
|
|
||||||
func initFiltering() {
|
func initFiltering() {
|
||||||
|
@ -175,25 +177,30 @@ func assignUniqueFilterID() int64 {
|
||||||
|
|
||||||
// Sets up a timer that will be checking for filters updates periodically
|
// Sets up a timer that will be checking for filters updates periodically
|
||||||
func periodicallyRefreshFilters() {
|
func periodicallyRefreshFilters() {
|
||||||
nextRefresh := int64(0)
|
|
||||||
for {
|
for {
|
||||||
if forceRefresh {
|
if config.DNS.FiltersUpdateIntervalHours != 0 && refreshStatus != 0 {
|
||||||
_ = refreshFiltersIfNecessary(true)
|
refreshStatus = 1
|
||||||
forceRefresh = false
|
refreshLock.Lock()
|
||||||
}
|
|
||||||
|
|
||||||
if config.DNS.FiltersUpdateIntervalHours != 0 && nextRefresh <= time.Now().Unix() {
|
|
||||||
_ = refreshFiltersIfNecessary(false)
|
_ = refreshFiltersIfNecessary(false)
|
||||||
nextRefresh = time.Now().Add(1 * time.Hour).Unix()
|
refreshLock.Unlock()
|
||||||
|
refreshStatus = 0
|
||||||
}
|
}
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Hour)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Schedule the procedure to refresh filters
|
// Refresh filters
|
||||||
func beginRefreshFilters() {
|
func refreshFilters() (int, error) {
|
||||||
forceRefresh = true
|
if refreshStatus != 0 { // we could use atomic cmpxchg here, but it's not really required
|
||||||
log.Debug("Filters: schedule update")
|
return 0, fmt.Errorf("Filters update procedure is already running")
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshStatus = 1
|
||||||
|
refreshLock.Lock()
|
||||||
|
nUpdated := refreshFiltersIfNecessary(true)
|
||||||
|
refreshLock.Unlock()
|
||||||
|
refreshStatus = 0
|
||||||
|
return nUpdated, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checks filters updates if necessary
|
// Checks filters updates if necessary
|
||||||
|
|
Loading…
Reference in New Issue