[ 
https://issues.apache.org/jira/browse/MESOS-7828?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16110618#comment-16110618
 ] 

Qian Zhang commented on MESOS-7828:
-----------------------------------

[~bmahler] Yes, the protobuf supplied json libraries also have this issue, I 
confirmed it with a small program:
{code}
// test_protobuf.proto 
syntax = "proto2";

message Foo {
  enum Type {
    UNKNOWN = 0;
    CREATE = 1;
    DELETE = 2;

  }

  optional Type type = 1;
}


// main.cc
#include <iostream>
#include <string>
#include <google/protobuf/util/json_util.h>

#include "test_protobuf.pb.h"

using namespace google::protobuf::util;

int main()
{
  Foo msg;
  std::string json =
      "{"
      "  \"type\": \"xxx\""
      "}";

  JsonParseOptions options;
  Status status = JsonStringToMessage(json, &msg, options);
  if (status.ok()) {
    std::cout << msg.type() << std::endl;
  } else {
    std::cout << status.error_message() << std::endl;
  }

  return 0;
}
{code}

In the above program, the utility function {{JsonStringToMessage()}} provided 
by protobuf is called to convert a JSON string to a protobuf message. I built 
and ran this program with protobuf-3.3.0 bundled in Mesos code, and its output 
is:
{code}
$ ./main
type: invalid value "xxx" for type TYPE_ENUM
{code}


> Current approach to parse protobuf enum from JSON does not support upgrades
> ---------------------------------------------------------------------------
>
>                 Key: MESOS-7828
>                 URL: https://issues.apache.org/jira/browse/MESOS-7828
>             Project: Mesos
>          Issue Type: Bug
>            Reporter: Qian Zhang
>            Assignee: Qian Zhang
>
> To use protobuf enum in a backwards compatible way, [the suggestion on the 
> protobuf mailing 
> list|https://groups.google.com/forum/#!msg/protobuf/NhUjBfDyGmY/pf294zMi2bIJ] 
> is to use optional enum fields and include an UNKNOWN value as the first 
> entry in the enum list (and/or explicitly specifying it as the default). This 
> can handle the case of parsing protobuf message from a serialized string, but 
> it can not handle the case of parsing protobuf message from JSON.
> E.g., when I access master endpoint with an inexistent enum {{xxx}}, I will 
> get an error:
> {code}
> $ curl -X POST -H "Content-Type: application/json" -d '{"type": "xxx"}' 
> 127.0.0.1:5050/api/v1
> Failed to convert JSON into Call protobuf: Failed to find enum for 'xxx'% 
> {code}
> In the {{Call}} protobuf message, the enum {{Type}} already has a default 
> value {{UNKNOWN}} (see 
> [here|https://github.com/apache/mesos/blob/1.3.0/include/mesos/v1/master/master.proto#L45]
>  for details) and the field {{Call.type}} is optional, but the above curl 
> command will still fail. The root cause is, in the code 
> [here|https://github.com/apache/mesos/blob/1.3.0/3rdparty/stout/include/stout/protobuf.hpp#L449:L454]
>  when we try to get the enum value for the string "xxx", it will fail since 
> there is no any enum value corresponding to "xxx".



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to