Skip to content

Commit

Permalink
refactor(api/gateway) return error from gateway if header is not sync…
Browse files Browse the repository at this point in the history
…ed yet (#2108)

## Overview

If header was not in header store, gateway would hang until client
context was canceled. PR allows gateway to return an error immediately
in this case.

---------

Co-authored-by: rene <[email protected]>
  • Loading branch information
2 people authored and Wondertan committed Apr 27, 2023
1 parent 480bcbe commit ebdda70
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 4 deletions.
15 changes: 15 additions & 0 deletions api/gateway/availability.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package gateway

import (
"encoding/json"
"fmt"
"net/http"
"strconv"

Expand All @@ -27,6 +28,20 @@ func (h *Handler) handleHeightAvailabilityRequest(w http.ResponseWriter, r *http
return
}

//TODO: change this to NetworkHead once the adjacency in the store is fixed.
head, err := h.header.LocalHead(r.Context())
if err != nil {
writeError(w, http.StatusInternalServerError, heightAvailabilityEndpoint, err)
return
}
if headHeight := int(head.Height()); headHeight < height {
err = fmt.Errorf(
"current head local chain head: %d is lower than requested height: %d"+
" give header sync some time and retry later", headHeight, height)
writeError(w, http.StatusServiceUnavailable, heightAvailabilityEndpoint, err)
return
}

header, err := h.header.GetByHeight(r.Context(), uint64(height))
if err != nil {
writeError(w, http.StatusInternalServerError, heightAvailabilityEndpoint, err)
Expand Down
14 changes: 14 additions & 0 deletions api/gateway/header.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package gateway

import (
"encoding/json"
"fmt"
"net/http"
"strconv"

Expand Down Expand Up @@ -69,6 +70,19 @@ func (h *Handler) performGetHeaderRequest(
writeError(w, http.StatusBadRequest, endpoint, err)
return nil, err
}
//TODO: change this to NetworkHead once the adjacency in the store is fixed.
head, err := h.header.LocalHead(r.Context())
if err != nil {
writeError(w, http.StatusInternalServerError, heightAvailabilityEndpoint, err)
return nil, err
}
if headHeight := int(head.Height()); headHeight < height {
err = fmt.Errorf(
"current head local chain head: %d is lower than requested height: %d"+
" give header sync some time and retry later", headHeight, height)
writeError(w, http.StatusServiceUnavailable, endpoint, err)
return nil, err
}
// perform request
header, err := h.header.GetByHeight(r.Context(), uint64(height))
if err != nil {
Expand Down
18 changes: 14 additions & 4 deletions api/gateway/share.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"encoding/hex"
"encoding/json"
"fmt"
"net/http"
"strconv"

Expand Down Expand Up @@ -98,10 +99,19 @@ func (h *Handler) getShares(ctx context.Context, height uint64, nID namespace.ID
err error
header *header.ExtendedHeader
)
switch height {
case 0:
header, err = h.header.LocalHead(ctx)
default:

//TODO: change this to NetworkHead once the adjacency in the store is fixed.
header, err = h.header.LocalHead(ctx)
if err != nil {
return nil, 0, err
}

if height > 0 {
if storeHeight := uint64(header.Height()); storeHeight < height {
return nil, 0, fmt.Errorf(
"current head local chain head: %d is lower than requested height: %d"+
" give header sync some time and retry later", storeHeight, height)
}
header, err = h.header.GetByHeight(ctx, height)
}
if err != nil {
Expand Down

0 comments on commit ebdda70

Please sign in to comment.