Skip to content

Commit ddad968

Browse files
authored
Merge pull request #5974 from spacemeshos/backport/1.5/5943
Fix timing out querying proof in 1:N in presence of a broken Poet (#5943)
2 parents 52b57e7 + efdd848 commit ddad968

File tree

3 files changed

+45
-2
lines changed

3 files changed

+45
-2
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
See [RELEASE](./RELEASE.md) for workflow instructions.
44

5+
## Release v1.5.6
6+
7+
### Improvements
8+
9+
* [#5943](https://github.com/spacemeshos/go-spacemesh/pull/5943) Fix timing out querying proof in 1:N in a presence of a broken Poet.
10+
11+
Previously, every identitiy waited for the full timeout time (~20 minutes) before giving up.
12+
513
## Release v1.5.5
614

715
### Improvements

activation/poet.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,9 @@ func (c *PoetClient) Submit(
351351
}
352352

353353
func (c *PoetClient) Proof(ctx context.Context, roundID string) (*types.PoetProof, []types.Hash32, error) {
354+
getProofsCtx, cancel := withConditionalTimeout(ctx, c.requestTimeout)
355+
defer cancel()
356+
354357
c.gettingProof.Lock()
355358
defer c.gettingProof.Unlock()
356359

@@ -363,8 +366,6 @@ func (c *PoetClient) Proof(ctx context.Context, roundID string) (*types.PoetProo
363366
c.logger.Warn("cached members found but proof not found in db", zap.String("round_id", roundID), zap.Error(err))
364367
}
365368

366-
getProofsCtx, cancel := withConditionalTimeout(ctx, c.requestTimeout)
367-
defer cancel()
368369
proof, members, err := c.client.Proof(getProofsCtx, roundID)
369370
if err != nil {
370371
return nil, nil, fmt.Errorf("getting proof: %w", err)

activation/poet_client_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,3 +188,37 @@ func TestPoetClient_CachesProof(t *testing.T) {
188188
require.NoError(t, err)
189189
require.Equal(t, uint64(2), proofsCalled.Load())
190190
}
191+
192+
func TestPoetClient_QueryProofTimeout(t *testing.T) {
193+
t.Parallel()
194+
195+
block := make(chan struct{})
196+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
197+
<-block
198+
}))
199+
defer ts.Close()
200+
defer close(block)
201+
202+
server := types.PoetServer{
203+
Address: ts.URL,
204+
Pubkey: types.NewBase64Enc([]byte("pubkey")),
205+
}
206+
cfg := PoetConfig{
207+
RequestTimeout: time.Millisecond * 100,
208+
}
209+
poet, err := newPoetClient(nil, server, cfg, zaptest.NewLogger(t))
210+
require.NoError(t, err)
211+
poet.client.client.HTTPClient = ts.Client()
212+
213+
start := time.Now()
214+
eg := errgroup.Group{}
215+
for range 50 {
216+
eg.Go(func() error {
217+
_, _, err := poet.Proof(context.Background(), "1")
218+
require.ErrorIs(t, err, context.DeadlineExceeded)
219+
return nil
220+
})
221+
}
222+
eg.Wait()
223+
require.WithinDuration(t, start.Add(cfg.RequestTimeout), time.Now(), time.Millisecond*300)
224+
}

0 commit comments

Comments
 (0)