private final ShardPeerAddressResolver addressResolver;
private final ShardIdentifier shardId;
private final String shardName;
+
+ // This reference indirection is required to have the ability to update the SchemaContext
+ // inside actor props. Otherwise we would be keeping an old SchemaContext there, preventing
+ // it from becoming garbage.
+ private final AtomicShardContextProvider schemaContextProvider = new AtomicShardContextProvider();
private ActorRef actor;
+
private Optional<DataTree> localShardDataTree;
private boolean leaderAvailable = false;
private Shard.AbstractBuilder<?, ?> builder;
private boolean isActiveMember = true;
- ShardInformation(String shardName, ShardIdentifier shardId,
- Map<String, String> initialPeerAddresses, DatastoreContext datastoreContext,
- Shard.AbstractBuilder<?, ?> builder, ShardPeerAddressResolver addressResolver) {
+ ShardInformation(final String shardName, final ShardIdentifier shardId,
+ final Map<String, String> initialPeerAddresses, final DatastoreContext datastoreContext,
+ final Shard.AbstractBuilder<?, ?> builder, final ShardPeerAddressResolver addressResolver) {
this.shardName = shardName;
this.shardId = shardId;
this.initialPeerAddresses = initialPeerAddresses;
this.addressResolver = addressResolver;
}
- Props newProps(SchemaContext schemaContext) {
+ Props newProps() {
Preconditions.checkNotNull(builder);
Props props = builder.id(shardId).peerAddresses(initialPeerAddresses).datastoreContext(datastoreContext)
- .schemaContext(schemaContext).props();
+ .schemaContextProvider(schemaContextProvider).props();
builder = null;
return props;
}
return actor;
}
- void setActor(ActorRef actor) {
+ void setActor(final ActorRef actor) {
this.actor = actor;
}
return shardId;
}
- void setLocalDataTree(Optional<DataTree> localShardDataTree) {
+ void setLocalDataTree(final Optional<DataTree> localShardDataTree) {
this.localShardDataTree = localShardDataTree;
}
return datastoreContext;
}
- void setDatastoreContext(DatastoreContext datastoreContext, ActorRef sender) {
+ void setDatastoreContext(final DatastoreContext datastoreContext, final ActorRef sender) {
this.datastoreContext = datastoreContext;
if (actor != null) {
LOG.debug("Sending new DatastoreContext to {}", shardId);
}
}
- void updatePeerAddress(String peerId, String peerAddress, ActorRef sender) {
+ void updatePeerAddress(final String peerId, final String peerAddress, final ActorRef sender) {
LOG.info("updatePeerAddress for peer {} with address {}", peerId, peerAddress);
if (actor != null) {
notifyOnShardInitializedCallbacks();
}
- void peerDown(MemberName memberName, String peerId, ActorRef sender) {
+ void peerDown(final MemberName memberName, final String peerId, final ActorRef sender) {
if (actor != null) {
actor.tell(new PeerDown(memberName, peerId), sender);
}
}
- void peerUp(MemberName memberName, String peerId, ActorRef sender) {
+ void peerUp(final MemberName memberName, final String peerId, final ActorRef sender) {
if (actor != null) {
actor.tell(new PeerUp(memberName, peerId), sender);
}
}
}
- void addOnShardInitialized(OnShardInitialized onShardInitialized) {
+ void addOnShardInitialized(final OnShardInitialized onShardInitialized) {
onShardInitializedSet.add(onShardInitialized);
}
- void removeOnShardInitialized(OnShardInitialized onShardInitialized) {
+ void removeOnShardInitialized(final OnShardInitialized onShardInitialized) {
onShardInitializedSet.remove(onShardInitialized);
}
- void setRole(String newRole) {
+ void setRole(final String newRole) {
this.role = newRole;
notifyOnShardInitializedCallbacks();
}
- void setFollowerSyncStatus(boolean syncStatus) {
+ String getRole() {
+ return role;
+ }
+
+ void setFollowerSyncStatus(final boolean syncStatus) {
this.followerSyncStatus = syncStatus;
}
return false;
}
- boolean setLeaderId(String leaderId) {
+ boolean setLeaderId(final String leaderId) {
final boolean changed = !Objects.equals(this.leaderId, leaderId);
this.leaderId = leaderId;
if (leaderId != null) {
return leaderId;
}
- void setLeaderAvailable(boolean leaderAvailable) {
+ void setLeaderAvailable(final boolean leaderAvailable) {
this.leaderAvailable = leaderAvailable;
if (leaderAvailable) {
return leaderVersion;
}
- void setLeaderVersion(short leaderVersion) {
+ void setLeaderVersion(final short leaderVersion) {
this.leaderVersion = leaderVersion;
}
return isActiveMember;
}
- void setActiveMember(boolean isActiveMember) {
+ void setActiveMember(final boolean isActiveMember) {
this.isActiveMember = isActiveMember;
}
+
+ SchemaContext getSchemaContext() {
+ return schemaContextProvider.getSchemaContext();
+ }
+
+ void setSchemaContext(final SchemaContext schemaContext) {
+ schemaContextProvider.set(Preconditions.checkNotNull(schemaContext));
+ }
}