@@ -20,6 +20,7 @@ import (
2020 grpcStatus "google.golang.org/grpc/status"
2121
2222 "github.com/ydb-platform/ydb-go-sdk/v3/internal/closer"
23+ "github.com/ydb-platform/ydb-go-sdk/v3/internal/endpoint"
2324 "github.com/ydb-platform/ydb-go-sdk/v3/internal/stack"
2425 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xcontext"
2526 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
3839
3940 onClose func () error
4041 onIsAlive func () bool
42+ onNodeID func () uint32
4143 }
4244 testWaitChPool struct {
4345 xsync.Pool [chan * testItem ]
@@ -113,6 +115,14 @@ func (t *testItem) ID() string {
113115 return ""
114116}
115117
118+ func (t * testItem ) NodeID () uint32 {
119+ if t .onNodeID != nil {
120+ return t .onNodeID ()
121+ }
122+
123+ return 0
124+ }
125+
116126func (t * testItem ) Close (context.Context ) error {
117127 if t .closed .Len () > 0 {
118128 debug .PrintStack ()
@@ -167,10 +177,126 @@ func TestPool(t *testing.T) { //nolint:gocyclo
167177 WithTrace [* testItem , testItem ](defaultTrace ),
168178 )
169179 err := p .With (rootCtx , func (ctx context.Context , testItem * testItem ) error {
180+ require .EqualValues (t , 0 , testItem .NodeID ())
181+
170182 return nil
171183 })
172184 require .NoError (t , err )
173185 })
186+ t .Run ("RequireNodeIdFromPool" , func (t * testing.T ) {
187+ nextNodeID := uint32 (0 )
188+ var newSessionCalled uint32
189+ p := New [* testItem , testItem ](rootCtx ,
190+ WithTrace [* testItem , testItem ](defaultTrace ),
191+ WithCreateItemFunc (func (ctx context.Context ) (* testItem , error ) {
192+ newSessionCalled ++
193+ var (
194+ nodeID = nextNodeID
195+ v = testItem {
196+ v : 0 ,
197+ onNodeID : func () uint32 {
198+ return nodeID
199+ },
200+ }
201+ )
202+
203+ return & v , nil
204+ }),
205+ )
206+
207+ item := mustGetItem (t , p )
208+ require .EqualValues (t , 0 , item .NodeID ())
209+ require .EqualValues (t , true , item .IsAlive ())
210+ mustPutItem (t , p , item )
211+
212+ nextNodeID = 32
213+
214+ item , err := p .getItem (endpoint .WithNodeID (context .Background (), 32 ))
215+ require .NoError (t , err )
216+ require .EqualValues (t , 32 , item .NodeID ())
217+ mustPutItem (t , p , item )
218+
219+ nextNodeID = 33
220+
221+ item , err = p .getItem (endpoint .WithNodeID (context .Background (), 33 ))
222+ require .NoError (t , err )
223+ require .EqualValues (t , 33 , item .NodeID ())
224+ mustPutItem (t , p , item )
225+
226+ item , err = p .getItem (endpoint .WithNodeID (context .Background (), 32 ))
227+ require .NoError (t , err )
228+ require .EqualValues (t , 32 , item .NodeID ())
229+ mustPutItem (t , p , item )
230+
231+ item , err = p .getItem (endpoint .WithNodeID (context .Background (), 33 ))
232+ require .NoError (t , err )
233+ require .EqualValues (t , 33 , item .NodeID ())
234+ mustPutItem (t , p , item )
235+
236+ item , err = p .getItem (endpoint .WithNodeID (context .Background (), 32 ))
237+ require .NoError (t , err )
238+ item2 , err := p .getItem (endpoint .WithNodeID (context .Background (), 33 ))
239+ require .NoError (t , err )
240+ require .EqualValues (t , 32 , item .NodeID ())
241+ require .EqualValues (t , 33 , item2 .NodeID ())
242+ mustPutItem (t , p , item2 )
243+ mustPutItem (t , p , item )
244+
245+ item , err = p .getItem (endpoint .WithNodeID (context .Background (), 32 ))
246+ require .NoError (t , err )
247+ item2 , err = p .getItem (endpoint .WithNodeID (context .Background (), 33 ))
248+ require .NoError (t , err )
249+ require .EqualValues (t , 32 , item .NodeID ())
250+ require .EqualValues (t , 33 , item2 .NodeID ())
251+ mustPutItem (t , p , item )
252+ mustPutItem (t , p , item2 )
253+
254+ item , err = p .getItem (endpoint .WithNodeID (context .Background (), 32 ))
255+ require .NoError (t , err )
256+ item2 , err = p .getItem (endpoint .WithNodeID (context .Background (), 33 ))
257+ require .NoError (t , err )
258+ item3 , err := p .getItem (context .Background ())
259+ require .NoError (t , err )
260+ require .EqualValues (t , 32 , item .NodeID ())
261+ require .EqualValues (t , 33 , item2 .NodeID ())
262+ require .EqualValues (t , 0 , item3 .NodeID ())
263+ mustPutItem (t , p , item )
264+ mustPutItem (t , p , item2 )
265+ mustPutItem (t , p , item3 )
266+
267+ require .EqualValues (t , 3 , newSessionCalled )
268+ })
269+ t .Run ("CreateSessionOnGivenNode" , func (t * testing.T ) {
270+ var newSessionCalled uint32
271+ p := New [* testItem , testItem ](rootCtx ,
272+ WithTrace [* testItem , testItem ](defaultTrace ),
273+ WithCreateItemFunc (func (ctx context.Context ) (* testItem , error ) {
274+ newSessionCalled ++
275+ v := testItem {
276+ v : 0 ,
277+ onNodeID : func () uint32 {
278+ nodeID , _ := endpoint .ContextNodeID (ctx )
279+
280+ return nodeID
281+ },
282+ }
283+
284+ return & v , nil
285+ }),
286+ )
287+
288+ item , err := p .getItem (endpoint .WithNodeID (context .Background (), 32 ))
289+ require .NoError (t , err )
290+ require .EqualValues (t , 32 , item .NodeID ())
291+ require .EqualValues (t , true , item .IsAlive ())
292+ mustPutItem (t , p , item )
293+
294+ item = mustGetItem (t , p )
295+ require .EqualValues (t , 32 , item .NodeID ())
296+ mustPutItem (t , p , item )
297+
298+ require .EqualValues (t , 1 , newSessionCalled )
299+ })
174300 t .Run ("WithLimit" , func (t * testing.T ) {
175301 p := New [* testItem , testItem ](rootCtx , WithLimit [* testItem , testItem ](1 ),
176302 WithTrace [* testItem , testItem ](defaultTrace ),
0 commit comments