[ 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)