> On Sept. 27, 2016, 5:28 p.m., Jiang Yan Xu wrote:
> > src/common/resources.cpp, lines 478-484
> > <https://reviews.apache.org/r/51999/diff/5/?file=1510283#file1510283line478>
> >
> >     Per our discussion I thought we would delay the validation until when 
> > we construct `Resources` objects? (i.e., kill this).
> >     
> >     The result is that the two more primitive parsing functions 
> > `fromJSONString()` and `fromSimpleString()` only captures syntactic errors 
> > (malformatted strings) but not semantic errors. We can then take advantage 
> > of this in the later patch to fill in missing values to make them 
> > semantically valid.

This was done in https://reviews.apache.org/r/51879/ when I added support for 
auto detection since that is when we could not longer do a `validate()` at this 
point.


> On Sept. 27, 2016, 5:28 p.m., Jiang Yan Xu wrote:
> > include/mesos/resources.hpp, line 199
> > <https://reviews.apache.org/r/51999/diff/5/?file=1510281#file1510281line199>
> >
> >     s/JSON::Array& resourcesJSON/std::string text/
> >     
> >     Looking the current and potential call-sites, it doesn't look like we 
> > ever directly call this method with a `JSON::Array` not parsed from text.
> >     
> >     Considering this, I think it would be more consistent to have the 
> > following three methods which take the same argument list.
> >     
> >     ```
> >     static Try<Resources> parse(
> >         const std::string& text,
> >         const std::string& defaultRole = "*");
> >     
> >     static Try<std::vector<Resource>> fromJSONString(
> >         const std::string& text,
> >         const std::string& defaultRole = "*");
> >     
> >     static Try<vector<Resource>> fromSimpleString(
> >         const std::string& text,
> >         const std::string& defaultRole = "*")
> >     ```

For JSON handling, we do the following in sequence:
(1) `JSON::parse<JSON::Array>()` converts input string to JSON array. 
(2) `protobuf::parse<RepeatedPtrField<Resource>>(resourcesJSON)` converts the 
JSON array to protobuf.

If we call both of these in `fromJSONString()`, then in `Resources::parse()`, 
we would not be able to deduce which of the above 2 functions failed. This is 
needed since if it failed in (1), it means we parse assuming text; whereas if 
it failed in (2), that is an error since protobuf conversion failed for the 
JSON (we should not assume it is text).

So, I think this should work:
In `Resources::parse()`:
- Convert to JSON array (`JSON::parse<JSON::Array>()`).
- If `JSON::parse<JSON::Array>()` succeeds, process JSON array in 
`fromJSONString()`. Any failure here is an error condition.
- If `JSON::parse<JSON::Array>()` fails, assume it is text and process in 
`fromSimpleString()`.


> On Sept. 27, 2016, 5:28 p.m., Jiang Yan Xu wrote:
> > src/common/resources.cpp, lines 587-617
> > <https://reviews.apache.org/r/51999/diff/5/?file=1510283#file1510283line587>
> >
> >     Is the following cleaner? (I added the logic to validate resources in 
> > the result vector instead of implicit conversion)
> >     
> >     ```
> >     Try<vector<Resource>> resources = fromJSONString(text, defaultRole);
> >     
> >     // Parsing as a simple string if parsing as a JSON string fails.
> >     if (resources.isError()) {
> >       resources = fromSimpleString(text, defaultRole);
> >     }
> >     
> >     if (resources.isError()) {
> >       return Error(resources.error());
> >     }
> >     
> >     Resources result;
> >     
> >     foreach (const Resource& resource, resoruces) {
> >       // If invalid, propgate error instead of skipping the resource.
> >       Option<Error> error = Resources::validate(resource);
> >       
> >       if (error.isSome()) {
> >         return error.get();
> >       }
> >       
> >       result += resource;
> >     }
> >     
> >     Option<Error> error = internal::validateCommandLineResources(result);
> >     if (error.isSome()) {
> >       return error.get();
> >     }
> >     
> >     return result;
> >     ```
> 
> Guangya Liu wrote:
>     1) Can we kill the validation? Seems we already done the validation in 
> each sub function.
>     
>     ```
>     // If invalid, propgate error instead of skipping the resource.
>     Option<Error> error = Resources::validate(resource);
>     ```
>     
>     2) Using `result.add(resource)` instead.

@xujyan: Please refer to my earlier response as to why we need to convert to 
JSON in `Resources::parse()` and handle the JSON in `fromJSONString()` if JSON 
conversion is successful [If conversion to protobuf fails in 
`fromJSONString()`, that is an error]; and assume it is text and process in 
`fromSimpleString()` if JSON conversion fails.

@gyliu: 
(1) This patch still has the validation in individual functions so validation 
in `Resources::parse()` is not needed but in  
https://reviews.apache.org/r/51879/, we move the validation out of the 
individual functions and consolidate into `Resources::parse()` [since we can 
have `Resource` with no value].
(2) Using `result.add()` now.


> On Sept. 27, 2016, 5:28 p.m., Jiang Yan Xu wrote:
> > src/tests/resources_tests.cpp, lines 630-657
> > <https://reviews.apache.org/r/51999/diff/5/?file=1510284#file1510284line630>
> >
> >     With out refactor, the result of `Resources::parse()` doesn't change 
> > right?
> 
> Jiang Yan Xu wrote:
>     s/out/our/

Im original code: If a resource in text format is encountered with value of 0, 
it is dropped; but in JSON, it flags an error. This patch makes the behavior 
same, ie. just drop if a `Resource` has a value of 0. Hence, this test would 
fail for value of 0. So I modified this test to test for negative values which 
is obviously an Error.


> On Sept. 27, 2016, 5:28 p.m., Jiang Yan Xu wrote:
> > include/mesos/resources.hpp, lines 169-172
> > <https://reviews.apache.org/r/51999/diff/5/?file=1510281#file1510281line169>
> >
> >     Now that we've moved these words to avoid duplication, we'd better 
> > refer to the place this is moved to.
> >     
> >     ```
> >       /**
> >        * Parses Resources from text in the form of a JSON array. If that 
> > fails, 
> >        * text in the form "name(role):value;name:value;...". i.e, this 
> > method
> >        * calls `fromJSONString()` or `fromSimpleString()` (see their 
> > documentation
> >        * for for details) and validates the result before converting it 
> > into a 
> >        * Resources object.
> >        */
> >     ```

Added the last comment regarding "validates the result before converting it 
into a Resources object" in https://reviews.apache.org/r/51879/ because that is 
where we made that change.


- Anindya


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/51999/#review150494
-----------------------------------------------------------


On Sept. 26, 2016, 8:58 p.m., Anindya Sinha wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/51999/
> -----------------------------------------------------------
> 
> (Updated Sept. 26, 2016, 8:58 p.m.)
> 
> 
> Review request for mesos and Jiang Yan Xu.
> 
> 
> Bugs: MESOS-6062
>     https://issues.apache.org/jira/browse/MESOS-6062
> 
> 
> Repository: mesos
> 
> 
> Description
> -------
> 
> Refactored `Resources::parse()` into 2 separate static functions:
> 1. Resources::fromJSONString() to parse JSON representation of
>    resources.
> 2. Resources::fromSimpleString() to parse text representation of
>    resources.
> 
> Since these 2 new functions return a `Try<vector<Resource>>`, the
> existing `Resources::parse()` implicitly converts that to a
> `Resources` object. This refactor is done to retrieve all resources
> (include empty resources) required for auto detection of root
> and MOUNT disks.
> 
> 
> Diffs
> -----
> 
>   include/mesos/resources.hpp 3ef8cacee529addc745b4aeb6398d7606c61b749 
>   include/mesos/v1/resources.hpp ef56b4960b103a3efd916fab64796aa334ba44c6 
>   src/common/resources.cpp 0774ff0669e831494d5b12b88e19dfa0a4a3f757 
>   src/tests/resources_tests.cpp 3e493007d6d1d8194d07035aaa1cde28dedf2b5a 
>   src/v1/resources.cpp 62a644ebbd13cfc0862bd118ba16c43e0f6aaf90 
> 
> Diff: https://reviews.apache.org/r/51999/diff/
> 
> 
> Testing
> -------
> 
> All tests passed.
> 
> 
> Thanks,
> 
> Anindya Sinha
> 
>

Reply via email to