this repo has no description

restart jetstream if disconnects

Changed files
+33 -17
cmd
recordcollector
+33 -17
cmd/recordcollector/main.go
···
"app.bsky",
"chat.bsky",
"blue.flashes",
+
"social.pinksky",
"jp.5leaf",
}
···
log.Fatalf("failed to create jetstream client: %v", err)
}
-
var cursor int64
-
err = dbCnx.QueryRowContext(ctx, "select val from config where key = 'cursor'").Scan(&cursor)
-
if err == sql.ErrNoRows {
-
logger.Info("no persisted cursor found")
-
} else if err != nil {
-
logger.Error("failed obtaining past cursor", "err", err)
-
} else {
-
logger.Info("found cursor in db", "cursor", cursor)
-
}
+
// https://bsky.app/profile/icyphox.sh/post/3lkt5wpjbcc2f
+
for {
+
var cursor int64
+
err = dbCnx.QueryRowContext(ctx, "select val from config where key = 'cursor'").Scan(&cursor)
+
if err == sql.ErrNoRows {
+
logger.Info("no persisted cursor found")
+
} else if err != nil {
+
logger.Error("failed obtaining past cursor", "err", err)
+
} else {
+
logger.Info("found cursor in db", "cursor", cursor)
+
}
-
var connectCursor *int64
-
if cursor > 0 {
-
connectCursor = &cursor
-
}
+
var connectCursor *int64
+
if cursor > 0 {
+
connectCursor = &cursor
+
}
+
+
connCtx, cancel := context.WithCancel(ctx)
+
defer cancel()
+
if err := jetstreamClient.ConnectAndRead(connCtx, connectCursor); err != nil {
+
logger.Error("error in ConnectAndRead", "err", err)
+
cancel()
+
}
-
if err := jetstreamClient.ConnectAndRead(ctx, connectCursor); err != nil {
-
log.Fatalf("failed to connect: %v", err)
+
select {
+
case <-ctx.Done():
+
logger.Info("stopping")
+
return
+
case <-connCtx.Done():
+
logger.Info("restarting")
+
continue
+
}
}
logger.Info("shutdown")
···
h.count++
if h.count%5000 == 0 {
cursor := event.TimeUS
-
delta := time.Now().UTC().UnixMicro() - cursor
-
h.logger.Info("persisting cursor", "cursor", cursor, "delta", delta)
+
delta := (time.Now().UTC().UnixMicro() - cursor) / 1_000_000
+
h.logger.Info("persisting cursor", "cursor", cursor, "deltaSeconds", delta)
updateQuery := "insert into config (key, val) values ('cursor', ?) on conflict do update set val = ?"
if _, err := h.db.ExecContext(ctx, updateQuery, cursor, cursor); err != nil {
h.logger.Error("failed persisting cursor", "err", err)