diff --git a/experiment/networkdb/main.go b/experiment/networkdb/main.go new file mode 100644 index 00000000..dd0b919b --- /dev/null +++ b/experiment/networkdb/main.go @@ -0,0 +1,69 @@ +package main + +import ( + "fmt" + "github.com/docker/docker/libnetwork/networkdb" + "log/slog" + "os" + "os/signal" + "syscall" + "time" +) + +func main() { + conf := networkdb.DefaultConfig() + db, err := networkdb.New(conf) + if err != nil { + panic(err) + } + + conf2 := networkdb.DefaultConfig() + conf2.BindPort = 12345 + db2, err := networkdb.New(conf2) + if err != nil { + panic(err) + } + if err = db2.Join([]string{"192.168.1.128:7946"}); err != nil { + panic(err) + } + + fmt.Println("Peers 1:", db.ClusterPeers()) + fmt.Println("Peers 2:", db2.ClusterPeers()) + + if err = db.JoinNetwork(""); err != nil { + panic(err) + } + if err = db2.JoinNetwork(""); err != nil { + panic(err) + } + + if err = db.CreateEntry("cluster-node", "", "key", []byte("value")); err != nil { + panic(err) + } + time.Sleep(500 * time.Millisecond) + value, err := db2.GetEntry("cluster-node", "", "key") + if err != nil { + panic(err) + } + fmt.Println("Entry from db2:", string(value)) + + _ = db.WalkTable("cluster-node", func(nid, key string, value []byte, deleting bool) bool { + fmt.Println("Entry from db1:", nid, key, string(value), deleting) + return false + }) + + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + // A channel to signal that shutdown is done. + done := make(chan bool, 1) + // Start a goroutine to handle signals. + go func() { + sig := <-sigs + db.Close() + time.Sleep(1 * time.Second) + db2.Close() + slog.Info("Received signal, shutting down", "signal", sig) + done <- true + }() + <-done +}