Details
-
Bug
-
Status: Patch Available
-
Major
-
Resolution: Unresolved
-
3.2.0
-
None
-
None
Description
in federation, `allocate` is async. the response from RM is cached in `asyncResponseSink`.
the final allocate response is merged from all RMs allocate response. merge will throw exception when AMRMToken from UAM response is not null.
But set AMRMToken from UAM response to null is not in the scope of lock. so there will be a change merge see that AMRMToken from UAM response is not null.
so we should clear the token before add response to asyncResponseSink
synchronized (asyncResponseSink) { List<AllocateResponse> responses = null; if (asyncResponseSink.containsKey(subClusterId)) { responses = asyncResponseSink.get(subClusterId); } else { responses = new ArrayList<>(); asyncResponseSink.put(subClusterId, responses); } responses.add(response); // Notify main thread about the response arrival asyncResponseSink.notifyAll(); } ... if (this.isUAM && response.getAMRMToken() != null) { Token<AMRMTokenIdentifier> newToken = ConverterUtils .convertFromYarn(response.getAMRMToken(), (Text) null); // Do not further propagate the new amrmToken for UAM response.setAMRMToken(null); ...