ipni / index-provider

📢 Index Provider

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

WithTopic and WithTopicName Option

sssion opened this issue · comments

// WithTopic sets the pubsub topic on which new advertisements are announced.
// To use the default pubsub configuration with a specific topic name, use WithTopicName. If both
// options are specified, WithTopic takes presence.
//
// Note that this option only takes effect if the PublisherKind is set to DataTransferPublisher.
// See: WithPublisherKind.
func WithTopic(t *pubsub.Topic) Option {
return func(o *options) error {
o.pubTopic = t
return nil
}
}

// WithTopicName sets toe topic name on which pubsub announcements are published.
// To override the default pubsub configuration, use WithTopic.
//
// Note that this option only takes effect if the PublisherKind is set to DataTransferPublisher.
// See: WithPublisherKind.
func WithTopicName(t string) Option {
return func(o *options) error {
o.pubTopicName = t
return nil
}
}

The topic and topic name works in legs dtsyn publisher. But topic will not override the topic name.


engine.go 183
	case DataTransferPublisher:
		dtOpts := []dtsync.Option{
			dtsync.Topic(e.pubTopic),
			dtsync.WithExtraData(e.pubExtraGossipData),
			dtsync.AllowPeer(e.syncPolicy.Allowed),
		}

		if e.pubDT != nil {
			return dtsync.NewPublisherFromExisting(e.pubDT, e.h, e.pubTopicName, e.lsys, dtOpts...)
		}
		ds := dsn.Wrap(e.ds, datastore.NewKey("/legs/dtsync/pub"))
		return dtsync.NewPublisher(e.h, ds, e.lsys, e.pubTopicName, dtOpts...)

dtsync/publisher.go
// NewPublisher creates a new legs publisher
func NewPublisher(host host.Host, ds datastore.Batching, lsys ipld.LinkSystem, topic string, options ...Option) (*publisher, error) {
	cfg := config{}
	err := cfg.apply(options)
	if err != nil {
		return nil, err
	}

	var cancel context.CancelFunc
	t := cfg.topic
	if t == nil {
		var ctx context.Context
		ctx, cancel = context.WithCancel(context.Background())
		t, err = gpubsub.MakePubsub(ctx, host, topic)
		if err != nil {
			cancel()
			return nil, err
		}
	}

	dtManager, _, dtClose, err := makeDataTransfer(host, ds, lsys, cfg.allowPeer)
	if err != nil {
		if cancel != nil {
			cancel()
		}
		return nil, err
	}

	headPublisher := head.NewPublisher()
	startHeadPublisher(host, topic, headPublisher)

	p := &publisher{
		cancelPubSub:  cancel,
		dtManager:     dtManager,
		dtClose:       dtClose,
		headPublisher: headPublisher,
		host:          host,
		topic:         t,
	}

	if len(cfg.extraData) != 0 {
		p.extraData = cfg.extraData
	}
	return p, nil
}

func startHeadPublisher(host host.Host, topic string, headPublisher *head.Publisher) {
	go func() {
		log.Infow("Starting head publisher for topic", "topic", topic, "host", host.ID())
		err := headPublisher.Serve(host, topic)
		if err != http.ErrServerClosed {
			log.Errorw("Head publisher stopped serving on topic on host", "topic", topic, "host", host.ID(), "err", err)
		}
		log.Infow("Stopped head publisher", "host", host.ID(), "topic", topic)
	}()
}


The topic name is must and as the headpublisher topic. If Topic in Option is nil a new Topic will be created with the topic name.
If topic name and Topic are both set value and not equal in name,  head.QueryRootCid will get error "Get "http://unused.invalid/head": protocol not supported" .

engine_test.go 139
subject, err := New(
WithHost(pubHost),
WithPublisherKind(DataTransferPublisher),
WithTopic(pubT),
WithTopicName(topic),
WithSubTopic(pubTSub),
WithExtraGossipData(extraGossipData),
)
If delete WithTopicName or modify the topic string, the ut will fail.