660f24acff
Experimenting with better cache busting for static resources. HTTPSRedirect requests are now counted in the route analytics. More scripts are loaded asynchronously now. Upped the default ReadTimeout to eight seconds. Reduce the number of unneccesary NewAcc calls. Added panel_before_head as an injection point for themes. Themes can now declare scripts to be loaded asynchronously. Tweaked the WS resumption algorithm to mae the backoffs a little less aggressive. Fixed an ordering issue in the WS resumption algorithm where backoffs weren't expiring as fast as they should have. Fixed a bug where template logs weren't being written due to a panic. You can now use byte slices in more places in the transpiled templates. Fixed a bug where Cosora's misc.js seemed to be erroring out. Fixed a bug where YT embeds were getting blocked by the CSP. Added the panel_back_to_site phrase. Added the panel_welcome phrase.
68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
package counters
|
|
|
|
import (
|
|
"database/sql"
|
|
|
|
"github.com/Azareal/Gosora/common"
|
|
"github.com/Azareal/Gosora/query_gen"
|
|
)
|
|
|
|
var OSViewCounter *DefaultOSViewCounter
|
|
|
|
type DefaultOSViewCounter struct {
|
|
buckets []*RWMutexCounterBucket //[OSID]count
|
|
insert *sql.Stmt
|
|
}
|
|
|
|
func NewDefaultOSViewCounter(acc *qgen.Accumulator) (*DefaultOSViewCounter, error) {
|
|
var osBuckets = make([]*RWMutexCounterBucket, len(osMapEnum))
|
|
for bucketID, _ := range osBuckets {
|
|
osBuckets[bucketID] = &RWMutexCounterBucket{counter: 0}
|
|
}
|
|
counter := &DefaultOSViewCounter{
|
|
buckets: osBuckets,
|
|
insert: acc.Insert("viewchunks_systems").Columns("count, createdAt, system").Fields("?,UTC_TIMESTAMP(),?").Prepare(),
|
|
}
|
|
common.AddScheduledFifteenMinuteTask(counter.Tick)
|
|
//common.AddScheduledSecondTask(counter.Tick)
|
|
common.AddShutdownTask(counter.Tick)
|
|
return counter, acc.FirstError()
|
|
}
|
|
|
|
func (counter *DefaultOSViewCounter) Tick() error {
|
|
for id, bucket := range counter.buckets {
|
|
var count int
|
|
bucket.RLock()
|
|
count = bucket.counter
|
|
bucket.counter = 0 // TODO: Add a SetZero method to reduce the amount of duplicate code between the OS and agent counters?
|
|
bucket.RUnlock()
|
|
|
|
err := counter.insertChunk(count, id) // TODO: Bulk insert for speed?
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (counter *DefaultOSViewCounter) insertChunk(count int, os int) error {
|
|
if count == 0 {
|
|
return nil
|
|
}
|
|
var osName = reverseOSMapEnum[os]
|
|
common.DebugLogf("Inserting a viewchunk with a count of %d for OS %s (%d)", count, osName, os)
|
|
_, err := counter.insert.Exec(count, osName)
|
|
return err
|
|
}
|
|
|
|
func (counter *DefaultOSViewCounter) Bump(id int) {
|
|
// TODO: Test this check
|
|
common.DebugDetail("counter.buckets[", id, "]: ", counter.buckets[id])
|
|
if len(counter.buckets) <= id || id < 0 {
|
|
return
|
|
}
|
|
counter.buckets[id].Lock()
|
|
counter.buckets[id].counter++
|
|
counter.buckets[id].Unlock()
|
|
}
|