+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
package main
import (
"database/sql"
- "log"
"sync"
"time"
"git.curoverse.com/arvados.git/sdk/go/arvados"
+ "github.com/ghodss/yaml"
)
type eventSink interface {
}
type eventSource interface {
- NewSink(chan *event) eventSink
+ NewSink() eventSink
+ DB() *sql.DB
+ DBHealth() error
}
type event struct {
- LogUUID string
+ LogID uint64
Received time.Time
+ Ready time.Time
Serial uint64
+ db *sql.DB
logRow *arvados.Log
- err error
- mtx sync.Mutex
+ err error
+ mtx sync.Mutex
}
// Detail returns the database row corresponding to the event. It can
// be called safely from multiple goroutines. Only one attempt will be
// made. If the database row cannot be retrieved, Detail returns nil.
-func (e *event) Detail(db *sql.DB) *arvados.Log {
+func (e *event) Detail() *arvados.Log {
e.mtx.Lock()
defer e.mtx.Unlock()
- if e.logRow != nil || e.err != nil || db == nil {
+ if e.logRow != nil || e.err != nil {
return e.logRow
}
var logRow arvados.Log
- var oldAttrs, newAttrs []byte
- e.err = db.QueryRow(`SELECT id, uuid, object_uuid, object_owner_uuid, event_type, created_at, old_attributes, new_attributes FROM logs WHERE uuid = ?`, e.LogUUID).Scan(
+ var propYAML []byte
+ e.err = e.db.QueryRow(`SELECT id, uuid, object_uuid, COALESCE(object_owner_uuid,''), COALESCE(event_type,''), event_at, created_at, properties FROM logs WHERE id = $1`, e.LogID).Scan(
&logRow.ID,
&logRow.UUID,
&logRow.ObjectUUID,
&logRow.ObjectOwnerUUID,
&logRow.EventType,
+ &logRow.EventAt,
&logRow.CreatedAt,
- &oldAttrs,
- &newAttrs)
+ &propYAML)
+ if e.err != nil {
+ logger(nil).WithField("LogID", e.LogID).WithError(e.err).Error("QueryRow failed")
+ return nil
+ }
+ e.err = yaml.Unmarshal(propYAML, &logRow.Properties)
if e.err != nil {
- log.Printf("retrieving log row %s: %s", e.LogUUID, e.err)
+ logger(nil).WithField("LogID", e.LogID).WithError(e.err).Error("yaml decode failed")
+ return nil
}
+ e.logRow = &logRow
return e.logRow
}