Ok, turned out to be rather simple:
```
err = doEX.Send(&flight.FlightData{FlightDescriptor:
&flight.FlightDescriptor{Type: flight.FlightDescriptor_CMD, Cmd:
[]byte("test")}})
```
Sorry for the distraction!
‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Tuesday, March 2, 2021 7:55 AM, Jasper Rädisch <[email protected]> wrote:
> Hi everyone,
>
> newbie trying to get into Flight with Go here.
>
> Invoking DoAction was pretty straight forward, but now I have problems with
> DoExchange, namely:
>
> rpc error: code = Unknown desc = Descriptor missing on first message
>
>
> I managed wrapping flight.FlightServiceClient.DoExchange into a
> flight.NewRecordWriter, but there is AFAIK no way to set the
> FlightDescriptor, which lead me to the assumption, that the first message has
> to be sent manually via DoEX.Send(<build FlightData here>).
>
> Is there a preferred way/helper to build said FlightData? Am I on the right
> track at all? I will keep digging into the source, but am thankful for any
> help.
>
> Jasper
>
> Complete client.go so far:
>
> package main
>
> import (
> "context"
> "fmt"
> "time"
>
> "github.com/apache/arrow/go/arrow"
> "github.com/apache/arrow/go/arrow/array"
> "github.com/apache/arrow/go/arrow/flight"
> "github.com/apache/arrow/go/arrow/ipc"
> "github.com/apache/arrow/go/arrow/memory"
> "google.golang.org/grpc"
> )
>
> func main() {
> conn, err := grpc.Dial("localhost:3001", grpc.WithInsecure(),
> grpc.WithBlock())
> c := flight.NewFlightServiceClient(conn)
> ctx, cancel := context.WithTimeout(context.Background(),
> 100*time.Second)
> defer cancel()
> if err != nil {
> panic(err)
> }
> defer conn.Close()
> i := 0
> doEX, err := c.DoExchange(ctx)
> if err != nil {
> panic(err)
> }
> // md := arrow.NewMetadata([]string{"f1-i64"}, []string{"v3"})
> schema := arrow.NewSchema([]arrow.Field{
> {Name: "f1-i64", Type: arrow.PrimitiveTypes.Int64},
> }, nil)
> pool := memory.NewGoAllocator()
> w := flight.NewRecordWriter(doEX, ipc.WithSchema(schema),
> ipc.WithAllocator(pool))
> b := array.NewRecordBuilder(pool, schema)
> defer b.Release()
>
> for {
> b.Field(0).(*array.Int64Builder).Append(int64(i))
> r := b.NewRecord()
> w.Write(r)
> if err != nil {
> panic(err)
> }
> fmt.Println(doEX.Recv())
> defer r.Release()
> time.Sleep(1 * time.Second)
> i = i + 1
> if i == 10 {
> break
> }
> }
> doEX.CloseSend()
> }
>