github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/tests/integration/coordination_test.go (about) 1 //go:build integration 2 // +build integration 3 4 package integration 5 6 import ( 7 "context" 8 "fmt" 9 "os" 10 "testing" 11 12 "github.com/ydb-platform/ydb-go-sdk/v3" 13 "github.com/ydb-platform/ydb-go-sdk/v3/coordination" 14 "github.com/ydb-platform/ydb-go-sdk/v3/coordination/options" 15 "github.com/ydb-platform/ydb-go-sdk/v3/log" 16 "github.com/ydb-platform/ydb-go-sdk/v3/trace" 17 ) 18 19 //nolint:errcheck 20 func TestCoordinationSemaphore(t *testing.T) { 21 ctx := context.TODO() 22 db, err := ydb.Open(ctx, 23 os.Getenv("YDB_CONNECTION_STRING"), 24 ydb.WithAccessTokenCredentials(os.Getenv("YDB_ACCESS_TOKEN_CREDENTIALS")), 25 ydb.WithLogger( 26 log.Default(os.Stderr, log.WithMinLevel(log.TRACE)), 27 trace.MatchDetails(`ydb\.(coordination).*`), 28 ), 29 ) 30 if err != nil { 31 t.Fatalf("failed to connect: %v", err) 32 } 33 defer db.Close(ctx) // cleanup resources 34 35 const nodePath = "/local/coordination/node/test" 36 37 // create node 38 err = db.Coordination().CreateNode(ctx, nodePath, coordination.NodeConfig{ 39 Path: "", 40 SelfCheckPeriodMillis: 1000, 41 SessionGracePeriodMillis: 1000, 42 ReadConsistencyMode: coordination.ConsistencyModeStrict, 43 AttachConsistencyMode: coordination.ConsistencyModeStrict, 44 RatelimiterCountersMode: coordination.RatelimiterCountersModeDetailed, 45 }) 46 if err != nil { 47 t.Fatalf("failed to create node: %v", err) 48 } 49 defer db.Coordination().DropNode(ctx, nodePath) 50 e, c, err := db.Coordination().DescribeNode(ctx, nodePath) 51 if err != nil { 52 t.Fatalf("failed to describe node: %v\n", err) 53 } 54 fmt.Printf("node description: %+v\nnode config: %+v\n", e, c) 55 56 s, err := db.Coordination().Session(ctx, nodePath) 57 if err != nil { 58 t.Fatalf("failed to create session: %v\n", err) 59 } 60 defer s.Close(ctx) 61 fmt.Printf("session 1 created, id: %d\n", s.SessionID()) 62 63 err = s.CreateSemaphore(ctx, "my-semaphore", 20, options.WithCreateData([]byte{1, 2, 3})) 64 if err != nil { 65 t.Fatalf("failed to create semaphore: %v", err) 66 } 67 fmt.Printf("semaphore my-semaphore created\n") 68 69 lease, err := s.AcquireSemaphore(ctx, "my-semaphore", 10) 70 if err != nil { 71 t.Fatalf("failed to acquire semaphore: %v", err) 72 } 73 defer lease.Release() 74 fmt.Printf("session 1 acquired semaphore 10\n") 75 76 s.Reconnect() 77 fmt.Printf("session 1 reconnected\n") 78 79 desc, err := s.DescribeSemaphore( 80 ctx, 81 "my-semaphore", 82 options.WithDescribeOwners(true), 83 options.WithDescribeWaiters(true), 84 ) 85 if err != nil { 86 t.Fatalf("failed to describe semaphore: %v", err) 87 } 88 fmt.Printf("session 1 described semaphore %v\n", desc) 89 90 err = lease.Release() 91 if err != nil { 92 t.Fatalf("failed to release semaphore: %v", err) 93 } 94 fmt.Printf("session 1 released semaphore my-semaphore\n") 95 96 err = s.DeleteSemaphore(ctx, "my-semaphore", options.WithForceDelete(true)) 97 if err != nil { 98 t.Fatalf("failed to delete semaphore: %v", err) 99 } 100 101 fmt.Printf("deleted semaphore my-semaphore\n") 102 }