Committed by
Gerrit Code Review
Bug ONOS-2030: Wait for mastership
Change-Id: Ie05c44d227f198900a68d7dc8f6a4aed96da9dcc
Showing
1 changed file
with
15 additions
and
5 deletions
| ... | @@ -61,6 +61,7 @@ import java.util.Collection; | ... | @@ -61,6 +61,7 @@ import java.util.Collection; |
| 61 | import java.util.List; | 61 | import java.util.List; |
| 62 | import java.util.Objects; | 62 | import java.util.Objects; |
| 63 | import java.util.concurrent.CompletableFuture; | 63 | import java.util.concurrent.CompletableFuture; |
| 64 | +import java.util.concurrent.ExecutionException; | ||
| 64 | import java.util.concurrent.ScheduledExecutorService; | 65 | import java.util.concurrent.ScheduledExecutorService; |
| 65 | import java.util.concurrent.TimeUnit; | 66 | import java.util.concurrent.TimeUnit; |
| 66 | 67 | ||
| ... | @@ -332,12 +333,23 @@ public class DeviceManager | ... | @@ -332,12 +333,23 @@ public class DeviceManager |
| 332 | 333 | ||
| 333 | log.info("Device {} connected", deviceId); | 334 | log.info("Device {} connected", deviceId); |
| 334 | // check my Role | 335 | // check my Role |
| 335 | - mastershipService.requestRoleFor(deviceId); | 336 | + CompletableFuture<MastershipRole> role = mastershipService.requestRoleFor(deviceId); |
| 337 | + try { | ||
| 338 | + // Device subsystem must wait for role assignment | ||
| 339 | + // to avoid losing Device information. | ||
| 340 | + // (This node could be the only Node connected to the Device.) | ||
| 341 | + role.get(); | ||
| 342 | + } catch (InterruptedException e) { | ||
| 343 | + log.warn("Interrupted while waiting role-assignment for {}", deviceId); | ||
| 344 | + Thread.currentThread().interrupt(); | ||
| 345 | + } catch (ExecutionException e) { | ||
| 346 | + log.error("Exception thrown while waiting role-assignment for {}", | ||
| 347 | + deviceId, e); | ||
| 348 | + } | ||
| 349 | + | ||
| 336 | final MastershipTerm term = termService.getMastershipTerm(deviceId); | 350 | final MastershipTerm term = termService.getMastershipTerm(deviceId); |
| 337 | if (term == null || !localNodeId.equals(term.master())) { | 351 | if (term == null || !localNodeId.equals(term.master())) { |
| 338 | log.info("Role of this node is STANDBY for {}", deviceId); | 352 | log.info("Role of this node is STANDBY for {}", deviceId); |
| 339 | - // TODO: Do we need to explicitly tell the Provider that | ||
| 340 | - // this instance is not the MASTER | ||
| 341 | applyRole(deviceId, MastershipRole.STANDBY); | 353 | applyRole(deviceId, MastershipRole.STANDBY); |
| 342 | } else { | 354 | } else { |
| 343 | log.info("Role of this node is MASTER for {}", deviceId); | 355 | log.info("Role of this node is MASTER for {}", deviceId); |
| ... | @@ -349,8 +361,6 @@ public class DeviceManager | ... | @@ -349,8 +361,6 @@ public class DeviceManager |
| 349 | DeviceEvent event = store.createOrUpdateDevice(provider().id(), | 361 | DeviceEvent event = store.createOrUpdateDevice(provider().id(), |
| 350 | deviceId, deviceDescription); | 362 | deviceId, deviceDescription); |
| 351 | 363 | ||
| 352 | - // If there was a change of any kind, tell the provider | ||
| 353 | - // that this instance is the master. | ||
| 354 | if (event != null) { | 364 | if (event != null) { |
| 355 | log.trace("event: {} {}", event.type(), event); | 365 | log.trace("event: {} {}", event.type(), event); |
| 356 | post(event); | 366 | post(event); | ... | ... |
-
Please register or login to post a comment