Skip to content

Can't reliably get PubSub - "no available client found" #244

@nicoroy2561

Description

@nicoroy2561

I keep getting the "no available client found" error when calling pubsub, err = client.NewPubSub() on client = cache.NewEmbeddedClient(). It seems to seldomly work - I managed to get it to work like 1/10 times.

Details

22:36:17.574 [INFO] Olric 0.5.4 on linux/amd64 go1.22.0
 
23:36:17.574 [INFO] Join completed. Synced with 1 initial nodes
 
23:36:17.575 [INFO] Memberlist bindAddr: 10.244.0.88, bindPort: 3322
 
23:36:17.575 [INFO] Cluster coordinator: 10.244.0.38:3320
 
23:36:17.575 [INFO] Node name in the cluster: 10.244.0.88:3320
 
23:36:17.575 [INFO] Olric bindAddr: 10.244.0.88, bindPort: 3320
 
23:36:17.575 [INFO] Replication count is 1
 
23:36:17.575 [INFO] Node joined: 10.244.0.38:3320
 
23:36:17.587 [INFO] Routing table has been pushed by 10.244.0.38:3320
 
23:36:17.588 pubsub error no available client found

Code I'm using is the one from the base example with some custom kubernetes discovery setup:

func Init(discovery *k8s.K8sDiscovery) bool {
	discoveryAdapter, err := newK8sAdapter(discovery)
	if err != nil {
		log.Fatalln("adapter error:", err)
	}

	// create a new Olric configuration
	cfg := config.New("lan") // default configuration
	cfg.ReplicationMode = config.SyncReplicationMode
	cfg.ServiceDiscovery = map[string]interface{}{"plugin": discoveryAdapter} //https://gist.github.com/derekperkins/8f5232d897ccf5a20691a1556574cfce
	cfg.DMaps.EvictionPolicy = config.LRUEviction                             //
	cfg.DMaps.MaxInuse = 50_000_000                                           // 50 MB

	cfg.LogLevel = "INFO"
	cfg.LogVerbosity = 3 // at least 2 is recommended; https://github.com/buraksezer/olric/blob/master/config/config.go#L102

	// this wait group is used to block the main goroutine until the embedded client is ready
	wg := sync.WaitGroup{}
	wg.Add(1)
	cfg.Started = func() { wg.Done() }

	// create the actual Olric instance
	cache, err = olric.New(cfg)
	if err != nil {
		log.Println("error creating cache from config:", err)
		return false
	}

	// start the instance, which triggers the k8s service discovery and forms the cluster
	go func() {
		if err := cache.Start(); err != nil {
			panic("error starting:" + err.Error())
		}
	}()

	// wait for the cluster to be ready before continuing
	wg.Wait()

	client = cache.NewEmbeddedClient()
	if client == nil {
		log.Fatalln("client nil")
	}

	pubsub, err = client.NewPubSub()
	if err != nil {
		log.Fatalln("pubsub error", err)
	}
	return true
}

Any suggestions on what I might be doing wrong here?

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions