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()
}
```

Reply via email to