in dax/internal/client/single.go [480:536]
func (client *SingleDaxClient) executeWithContext(ctx context.Context, op string, encoder func(writer *cbor.Writer) error, decoder func(reader *cbor.Reader) error, opt RequestOptions) error {
t, err := client.pool.getWithContext(ctx, client.isHighPriority(op), opt)
if err != nil {
return err
}
if err = client.pool.setDeadline(ctx, t); err != nil {
// If the error is just due to context cancelled or timeout
// then the tube is still usable because we have not written anything to tube
if err == ctx.Err() {
client.pool.put(t)
return err
}
// If we get error while setting deadline of tube
// probably something is wrong with the tube
client.pool.closeTube(t)
return err
}
if err = client.auth(ctx, t); err != nil {
// Auth method writes in the tube and
// it is not guaranteed that it will be drained completely on error
client.pool.closeTube(t)
return err
}
writer := t.CborWriter()
if err = encoder(writer); err != nil {
// Validation errors will cause connection to be closed as there is no guarantee
// that the validation was performed before any data was written into tube
client.pool.closeTube(t)
return err
}
if err := writer.Flush(); err != nil {
client.pool.closeTube(t)
return err
}
reader := t.CborReader()
ex, err := decodeError(reader)
if err != nil { // decode or network error - doesn't guarantee completely drained tube
client.pool.closeTube(t)
return err
}
if ex != nil { // user or server error
client.recycleTube(t, ex)
return ex
}
err = decoder(reader)
if err != nil {
// we are not able to completely drain tube
client.pool.closeTube(t)
} else {
client.pool.put(t)
}
return err
}