if (tmp.isEmpty()) { StringBuilder sb = new StringBuilder(); for (short s : tagSet) {
if (tmp.isEmpty()) { StringBuilder sb = new StringBuilder(); for (short s : tagSet) {
public synchronized boolean removeNode(short node) { nodes.remove(node); return nodes.isEmpty(); } }
public synchronized boolean removeNode(short node) { nodes.remove(node); return nodes.isEmpty(); } }
/** * Can block */ @Override protected synchronized void broadcast(Message message) { // synchronized for message ID ordering try { assert message.isBroadcast() && !message.isResponse(); assignMessageId(message); final boolean unicast = getNumPeerNodes() < minimumNodesToMulticast; final TShortHashSet nodes = new TShortHashSet(); for (NodePeer peer : peers.values()) { nodes.add(peer.node); peer.sendMessage(message, unicast); executor.submit(peer); } if (nodes.isEmpty()) { if (message instanceof LineMessage) { LOG.debug("No other nodes in cluster. Responding with NOT_FOUND to message {}", message); receive(Message.NOT_FOUND((LineMessage) message).setIncoming()); } return; } broadcastPeer.sendMessage(message, nodes, unicast); if (!unicast) executor.submit(broadcastPeer); } catch (InterruptedException ex) { LOG.error("InterruptedException", ex); throw new RuntimeException(ex); } }
if (entry.nodes.isEmpty()) { broadcasts.remove(next.getMessageId()); if (next instanceof LineMessage) {
if (LOG.isDebugEnabled()) LOG.debug("Node {} switched/removed - removing from sharers of line {}", node, line); if (line.sharers.isEmpty()) { setState(line, State.E); handlePendingOps(line, LINE_STATE_CHANGED);
private int handleMessagePutX(Message.PUTX msg, CacheLine line) throws IrrelevantStateException { relevantStates(line, State.I, State.S); if (line.version > msg.getVersion()) { LOG.warn("Got PUTX with version {} which is older than current version {}", msg.getVersion(), line.version); return LINE_NO_CHANGE; } final TShortHashSet sharers = new TShortHashSet((msg.getSharers() != null ? msg.getSharers().length : 0) + 1); if (msg.getSharers() != null) sharers.addAll(msg.getSharers()); if (hasServer && msg.getNode() != Comm.SERVER) sharers.add(Comm.SERVER); // this is so we make sure the server was notified for the ownership transfer. this is done by INV sharers.remove(myNodeId()); // don't INV myself int change = LINE_NO_CHANGE; change |= line.getState().isLessThan(State.O) ? LINE_OWNER_CHANGED : 0; change |= setState(line, sharers.isEmpty() ? State.E : State.O) ? LINE_STATE_CHANGED : 0; if (sharers.isEmpty()) change |= setOwner(line, myNodeId()) ? LINE_OWNER_CHANGED : 0; else setOwner(line, msg.getNode()); // We set owner to the PREVIOUS owner - used// change |= setOwner(line, cluster.getMyNodeId()) ? LINE_OWNER_CHANGED : 0; line.sharers.addAll(sharers); line.version = msg.getVersion(); writeData(line, (Object) msg.getData()); line.parts = (short) msg.getMessages(); setOwnerClock(line, msg); fireLineReceived(line); if (hasServer && msg.getNode() != Comm.SERVER) send(Message.INV(Comm.SERVER, line.id, msg.getNode())); return change; }
assert !line.sharers.isEmpty(); for (TShortIterator it = line.sharers.iterator(); it.hasNext();) { final short sharer = it.next();
int change = LINE_NO_CHANGE; line.sharers.remove(msg.getNode()); if (line.sharers.isEmpty()) { change |= setState(line, line.is(CacheLine.DELETED) ? State.I : State.E) ? LINE_STATE_CHANGED : 0; change |= setOwner(line, myNodeId()) ? LINE_OWNER_CHANGED : 0;