···88 "time"
991010 "github.com/prometheus/client_golang/prometheus/promhttp"
1111+ "tangled.org/core/idresolver"
1112 "tangled.org/core/knotmirror/config"
1213 "tangled.org/core/knotmirror/db"
1314 "tangled.org/core/knotmirror/knotstream"
1415 "tangled.org/core/knotmirror/models"
1616+ "tangled.org/core/knotmirror/xrpc"
1517 "tangled.org/core/log"
1618)
1719···3234 if err != nil {
3335 return fmt.Errorf("initializing db: %w", err)
3436 }
3737+3838+ resolver := idresolver.DefaultResolver(cfg.PlcUrl)
35393640 res, err := db.ExecContext(ctx,
3741 `update repos set state = $1 where state = $2`,
···4751 }
4852 logger.Info(fmt.Sprintf("clearing resyning states: %d records updated", rows))
49535454+ xrpc := xrpc.New(logger, cfg, resolver)
5055 knotstream := knotstream.NewKnotStream(logger, db, cfg)
5156 crawler := NewCrawler(logger, db)
5257 resyncer := NewResyncer(logger, db, cfg)
···5560 // maintain repository list with tap
5661 // NOTE: this can be removed once we introduce did-for-repo because then we can just listen to KnotStream for #identity events.
5762 tap := NewTapClient(logger, cfg, db, knotstream)
6363+6464+ // start xrpc server
6565+ go func() {
6666+ logger.Info("starting xrpc server", "addr", cfg.Listen)
6767+ if err := http.ListenAndServe(cfg.Listen, xrpc.Router()); err != nil {
6868+ logger.Error("xrpc server failed", "error", err)
6969+ }
7070+ }()
58715972 // start metrics endpoint
6073 go func() {
+1
knotmirror/readme.md
···99- [x] cleanup 'resyncing' state on shutdown (or on startup too)
1010- [x] better tap reconnecting logic
1111- [ ] handle really large repos (maybe shallow-clone first?)
1212+- [ ] handle repository knot changes (change git repo origin)
12131314idea: run multiple different resync workers. 4 for long running tasks, 10 for short tasks. on timeout, schedule it for long running task
1415