/** @syncpriority 200 */ public synchronized void startBroadcast() { if (broadcasting) throw new SeekInnerCalmException(); log.debug("Starting pagebuffer for " + streamId); pageBuf.start(); broadcasting = true; log.info("Starting broadcast of " + pageBuf.getTotalPages() + " pages for " + streamId); // If we're already rebroadcasting, this means that we've completed // reception and are now a broadcaster - so we don't need to announce // ourselves again if (rebroadcasting) rebroadcasting = false; else mina.getStreamAdvertiser().advertiseStream(streamId); }
public StreamStatus buildStreamStatus(String toNodeId) { StreamStatus.Builder bldr = StreamStatus.newBuilder(); if (toNodeId != null) { bldr.setToNodeId(toNodeId); bldr.setFromNodeId(mina.getMyNodeId()); } bldr.setStreamId(streamId); if (pageBuf.getTotalPages() > 0) bldr.setTotalPages(pageBuf.getTotalPages()); StreamPosition sp = pageBuf.getStreamPosition(); bldr.setLastContiguousPage(sp.getLastContiguousPage()); if (sp.getPageMap() > 0) bldr.setPageMap(sp.getPageMap()); return bldr.build(); }
/** @syncpriority 200 */ public synchronized void stop() { log.debug("SM for " + streamId + " stopping"); if (broadcasting) stopBroadcast(); if (rebroadcasting) stopRebroadcast(); if (receiving) stopReception(); listeners.clear(); checkWantingSources(); streamConns.closeAll(); mina.getSmRegister().unregisterSM(streamId); if (pageBuf != null) { pageBuf.stop(); pageBuf.close(); } }
/** @syncpriority 200 */ public void notifyDeadConnection(ConnectionPair pair) { synchronized (this) { streamConns.removeConnectionPair(pair); if (pair instanceof LCPair) { prm.notifyDeadConnection(pair.getCC().getNodeId()); if (streamConns.getNumListenConns() < mina.getConfig().getMaxSources()) requestCachedSources(); bidStrategy.cleanup(pair.getCC().getNodeId()); // Make note of them in case they come back LCPair lcp = (LCPair) pair; SourceStatus sourceStat = lcp.getLastSourceStatus(); if (sourceStat != null) { StreamStatus streamStat = lcp.getLastStreamStatus(); if (streamStat == null) throw new SeekInnerCalmException(); mina.getSourceMgr().cachePossiblyDeadSource(sourceStat, streamStat); } } if (streamConns.getNumBroadcastConns() == 0 && streamConns.getNumListenConns() == 0) { try { pageBuf.sleep(); } catch (IOException e) { log.error("Error sleeping page buffer", e); stop(); } } } if (isReceiving()) mina.getEventMgr().fireReceptionConnsChanged(streamId); }
/** @syncpriority 200 */ public void receivePage(Page p) { synchronized (this) { // We might have already stopped receiving, in which case the // pagebuf will be closed if (!isReceiving()) return; try { pageBuf.putPage(p); } catch (IOException e) { log.error("Error putting page into buffer", e); stop(); return; } } prm.notifyPageReceived(p.getPageNumber()); updateStreamStatus(); if (isReceiving() && !isRebroadcasting()) startRebroadcast(); if (pageBuf.getLastContiguousPage() == (pageBuf.getTotalPages() - 1)) receptionCompleted(); }
/** @syncpriority 200 */ public synchronized void startReception() { if (receiving) throw new SeekInnerCalmException(); // If we're already finished, just start rebroadcasting if (pageBuf.isComplete()) startRebroadcast(); else { receiving = true; requestCachedSources(); mina.getSourceMgr().wantSources(streamId, tolerateDelay()); } }
public void setPageBuffer(PageBuffer pageBuf) { this.pageBuf = pageBuf; if (pageBuf.getTotalPages() <= 0) pageBuf.setTotalPages(totalPages); }
public void foundSource(SourceStatus sourceStat, StreamStatus streamStat) { String fromNodeId = sourceStat.getFromNode().getId(); String sourceId = fromNodeId; if (streamStat.getTotalPages() != 0) { long totalPages = streamStat.getTotalPages(); if (pageBuf == null) this.totalPages = totalPages; else { if (pageBuf.getTotalPages() <= 0) pageBuf.setTotalPages(totalPages); else { if (pageBuf.getTotalPages() != totalPages) { log.error( "Node " + sourceId + " advertised total pages " + totalPages + " for stream " + streamId + ", but I have already recorded " + pageBuf.getTotalPages()); return; } } } } if (streamConns.haveListenConnWithId(sourceId)) return; // If we're not receiving, then we're just caching sources to pass to an external listener - so // cache it if (!receiving) { mina.getSourceMgr().cacheSourceUntilReady(sourceStat, streamStat); notifyListenersOfSource(sourceId); return; } // Not listening to this node - let's see if we should if (mina.getConfig().isAgoric()) { if (!bidStrategy.worthConnectingTo(new AuctionState(sourceStat.getAuctionState()))) { log.debug( "Not connecting to node " + sourceId + " for " + streamId + " - bid strategy says no"); mina.getSourceMgr().cacheSourceUntilAgoricsAcceptable(sourceStat, streamStat); return; } } // Check that they have data useful to us if (pageBuf != null) { StreamPosition sp = new StreamPosition(streamStat.getLastContiguousPage(), streamStat.getPageMap()); if (sp.highestIncludedPage() <= pageBuf.getLastContiguousPage()) { // Useless at the moment - cache them and ask again later mina.getSourceMgr().cacheSourceUntilDataAvailable(sourceStat, streamStat); return; } } // This is a useful source - let our listeners know notifyListenersOfSource(sourceId); if (streamConns.getNumListenConns() >= mina.getConfig().getMaxSources()) { mina.getSourceMgr().cacheSourceUntilReady(sourceStat, streamStat); return; } try { streamConns.makeListenConnectionTo(sourceStat); } catch (MinaConnectionException e) { log.error("Caught MinaConnectionException when attempting to connect to " + sourceId); } }