Pull request: querylog: use better error signaling
Merge in DNS/adguard-home from 2325-querylog-suffering to master Closes #2325. Squashed commit of the following: commit 90388050ed495286cdfed6574dd438abd4a33baa Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Thu Nov 19 12:37:00 2020 +0300 all: changelog commit bbdeabbb550c7e98f579e2a68c71de7a66624203 Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Thu Nov 19 12:33:21 2020 +0300 querylog: improve error reporting commit 807b23aa74d0e39f5ef51910e5b91c9b95a8c341 Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Wed Nov 18 19:39:22 2020 +0300 querylog: improve docs commit 65a8f4f3323192c872b3389d2b3420e072a01297 Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Wed Nov 18 19:36:28 2020 +0300 querylog: use better error signaling
This commit is contained in:
@@ -11,12 +11,12 @@ import (
|
||||
"github.com/AdguardTeam/golibs/log"
|
||||
)
|
||||
|
||||
// ErrSeekNotFound is returned from Seek if when it fails to find the requested
|
||||
// record.
|
||||
const ErrSeekNotFound agherr.Error = "seek: record not found"
|
||||
|
||||
// ErrEndOfLog is returned from Seek when the end of the current log is reached.
|
||||
const ErrEndOfLog agherr.Error = "seek: end of log"
|
||||
// Timestamp not found errors.
|
||||
const (
|
||||
ErrTSNotFound agherr.Error = "ts not found"
|
||||
ErrTSTooLate agherr.Error = "ts too late"
|
||||
ErrTSTooEarly agherr.Error = "ts too early"
|
||||
)
|
||||
|
||||
// TODO: Find a way to grow buffer instead of relying on this value when reading strings
|
||||
const maxEntrySize = 16 * 1024
|
||||
@@ -69,7 +69,7 @@ func NewQLogFile(path string) (*QLogFile, error) {
|
||||
// * It returns the position of the the line with the timestamp we were looking for
|
||||
// so that when we call "ReadNext" this line was returned.
|
||||
// * Depth of the search (how many times we compared timestamps).
|
||||
// * If we could not find it, it returns ErrSeekNotFound
|
||||
// * If we could not find it, it returns one of the errors described above.
|
||||
func (q *QLogFile) Seek(timestamp int64) (int64, int, error) {
|
||||
q.lock.Lock()
|
||||
defer q.lock.Unlock()
|
||||
@@ -103,15 +103,18 @@ func (q *QLogFile) Seek(timestamp int64) (int64, int, error) {
|
||||
if err != nil {
|
||||
return 0, depth, err
|
||||
}
|
||||
if lineIdx < start || lineEndIdx > end || lineIdx == lastProbeLineIdx {
|
||||
|
||||
if lineIdx == lastProbeLineIdx {
|
||||
if lineIdx == 0 {
|
||||
return 0, depth, ErrTSTooEarly
|
||||
}
|
||||
|
||||
// If we're testing the same line twice then most likely
|
||||
// the scope is too narrow and we won't find anything
|
||||
// anymore in any other file.
|
||||
return 0, depth, fmt.Errorf("couldn't find timestamp %v: %w", timestamp, ErrSeekNotFound)
|
||||
} else if lineIdx == end && lineEndIdx == end {
|
||||
// If both line beginning and line ending indices point
|
||||
// at the end of the file, we apparently reached it.
|
||||
return 0, depth, ErrEndOfLog
|
||||
return 0, depth, fmt.Errorf("looking up timestamp %d in %q: %w", timestamp, q.file.Name(), ErrTSNotFound)
|
||||
} else if lineIdx == fileInfo.Size() {
|
||||
return 0, depth, ErrTSTooLate
|
||||
}
|
||||
|
||||
// Save the last found idx
|
||||
@@ -119,9 +122,8 @@ func (q *QLogFile) Seek(timestamp int64) (int64, int, error) {
|
||||
|
||||
// Get the timestamp from the query log record
|
||||
ts := readQLogTimestamp(line)
|
||||
|
||||
if ts == 0 {
|
||||
return 0, depth, fmt.Errorf("couldn't get timestamp: %w", ErrSeekNotFound)
|
||||
return 0, depth, fmt.Errorf("looking up timestamp %d in %q: record %q has empty timestamp", timestamp, q.file.Name(), line)
|
||||
}
|
||||
|
||||
if ts == timestamp {
|
||||
@@ -143,7 +145,7 @@ func (q *QLogFile) Seek(timestamp int64) (int64, int, error) {
|
||||
|
||||
depth++
|
||||
if depth >= 100 {
|
||||
return 0, depth, fmt.Errorf("seek depth is too high, aborting. File %s, timestamp %v: %w", q.file.Name(), timestamp, ErrSeekNotFound)
|
||||
return 0, depth, fmt.Errorf("looking up timestamp %d in %q: depth %d too high: %w", timestamp, q.file.Name(), depth, ErrTSNotFound)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user