openreplay/backend/internal/sink/sessionwriter/session.go
Alexander e67c3ec876
[Sink] Zombie session killer feature (#829)
* feat(backend): added zombie session killer feature
2022-11-22 11:53:21 +01:00

81 lines
1.5 KiB
Go

package sessionwriter
import (
"fmt"
"os"
"strconv"
"sync"
"time"
)
type Session struct {
lock *sync.Mutex
dom *os.File
dev *os.File
lastUpdate time.Time
}
func NewSession(dir string, id uint64) (*Session, error) {
if id == 0 {
return nil, fmt.Errorf("wrong session id")
}
filePath := dir + strconv.FormatUint(id, 10)
domFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
return nil, err
}
filePath += "devtools"
devFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
domFile.Close() // should close first file descriptor
return nil, err
}
return &Session{
lock: &sync.Mutex{},
dom: domFile,
dev: devFile,
lastUpdate: time.Now(),
}, nil
}
func (s *Session) Lock() {
s.lock.Lock()
}
func (s *Session) Unlock() {
s.lock.Unlock()
}
func (s *Session) Write(mode FileType, data []byte) (err error) {
if mode == DOM {
_, err = s.dom.Write(data)
} else {
_, err = s.dev.Write(data)
}
s.lastUpdate = time.Now()
return err
}
func (s *Session) LastUpdate() time.Time {
return s.lastUpdate
}
func (s *Session) Sync() error {
domErr := s.dom.Sync()
devErr := s.dev.Sync()
if domErr == nil && devErr == nil {
return nil
}
return fmt.Errorf("dom: %s, dev: %s", domErr, devErr)
}
func (s *Session) Close() error {
domErr := s.dom.Close()
devErr := s.dev.Close()
if domErr == nil && devErr == nil {
return nil
}
return fmt.Errorf("dom: %s, dev: %s", domErr, devErr)
}