[
https://issues.apache.org/jira/browse/MESOS-7745?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Anand Mazumdar updated MESOS-7745:
----------------------------------
Priority: Critical (was: Major)
> ReadFile protobuf doesn't match implementation
> ----------------------------------------------
>
> Key: MESOS-7745
> URL: https://issues.apache.org/jira/browse/MESOS-7745
> Project: Mesos
> Issue Type: Bug
> Components: HTTP API
> Affects Versions: 1.1.0, 1.1.1, 1.1.2, 1.2.0, 1.2.1, 1.3.0
> Reporter: Tom Runyon
> Priority: Critical
>
> ReadFile message in `include/mesos/v1/agent/agent.proto` and
> `include/mesos/v1/master/master.proto` is defined as
> {code}
> // Reads data from a file.
> message ReadFile {
> // The path of file.
> required string path = 1;
> // Initial offset in file to start reading from.
> required uint64 offset = 2;
> // The maximum number of bytes to read. The read length is capped at 16
> // memory pages.
> optional uint64 length = 3;
> }
> {code}
> According to the protobuf spec (
> https://developers.google.com/protocol-buffers/docs/proto3#json) the values
> for Offset and Length will serialize with quotations around the values.
> Generating structs (Go Code below) follows the spec defined by protobuf
> {code}
> // Reads data from a file.
> type Call_ReadFile struct {
> // The path of file.
> Path *string `protobuf:"bytes,1,req,name=path" json:"path,omitempty"`
> // Initial offset in file to start reading from.
> Offset *uint64 `protobuf:"varint,2,req,name=offset"
> json:"offset,omitempty"`
> // The maximum number of bytes to read. The read length is capped at 16
> // memory pages.
> Length *uint64 `protobuf:"varint,3,opt,name=length"
> json:"length,omitempty"`
> XXX_unrecognized []byte `json:"-"`
> }
> func (m *Call_ReadFile) Reset() { *m = Call_ReadFile{} }
> func (m *Call_ReadFile) String() string { return
> proto.CompactTextString(m) }
> func (*Call_ReadFile) ProtoMessage() {}
> func (*Call_ReadFile) Descriptor() ([]byte, []int) { return
> fileDescriptorAgent, []int{0, 3} }
> func (m *Call_ReadFile) GetPath() string {
> if m != nil && m.Path != nil {
> return *m.Path
> }
> return ""
> }
> func (m *Call_ReadFile) GetOffset() uint64 {
> if m != nil && m.Offset != nil {
> return *m.Offset
> }
> return 0
> }
> func (m *Call_ReadFile) GetLength() uint64 {
> if m != nil && m.Length != nil {
> return *m.Length
> }
> return 0
> }
> {code}
> and causes serializations that contain "s. For example, this JSON value was
> created by serializing the struct above:
> {code}
> {
> "type":"READ_FILE",
> "read_file":
> {
>
> "path":"/cloud/mesos/slaves/9136e188-546b-428c-8cba-6cc1651990ba-S16/frameworks/b2c38250-a9b2-436d-81f8-c5a6aa5d0b56-0004/executors/trunyon_database.c71c1faf-5d2d-11e7-8a4a-2e27076f4d30/runs/c8d6200d-74f3-4229-928c-6381092b8778/stdout",
> "offset":"0",
> "length":"10000"
> }
> }
> {code}
> Sending this object to the `/api/v1` endpoint returns a 400 error code, where
> eliminating the quotes returns a 200
> It looks like the issue came about between 1.0.X and 1.1.X where the protobuf
> changed from `string` objects to `uint64`.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)