/** * Synchronized helper method to prevent multiple threads from mashing * totalRetries * * @param context the current request context * @throws IOException when the client cannot perform the necessary network IO */ private synchronized void retryInterest(RetryContext context) throws IOException { LOGGER.info("Retrying interest: " + context.interest.toUri()); context.face.expressInterest(context.interest, context, context); totalRetries++; }
@Override public void onTimeout(Interest interest) { stream.onException(new TimeoutException("Interest timed out despite retries: " + interest.toUri())); } });
private void forward(Interest interest, Transport transport) { if (pit.has(interest)) { LOGGER.info("Already seen interest, swallowing: " + interest.toUri()); return; } LOGGER.info("Adding interest to PIT: " + interest.toUri()); pit.add(new PitEntryImpl(interest, (MockTransport) transport)); LOGGER.info("Forwarding interest: " + interest.toUri()); for (MockForwarder.FibEntry entry : fib.find(interest)) { entry.forward(interest, transport); } }
@Override public void add(Interest interest) { LOGGER.log(Level.INFO, "Adding pending interest: {0}", interest.toUri()); table.put(interest.getName(), interest); }
@Override public void onTimeout(Interest failedInterest) { logger.info("Timeout: " + failedInterest.toUri()); try { retryClient.retry(face, failedInterest, stream, new OnTimeout() { @Override public void onTimeout(Interest interest) { stream.onException(new TimeoutException("Interest timed out despite retries: " + interest.toUri())); } }); } catch (IOException ex) { stream.onException(ex); } } }
public void forward(Data data) { LOGGER.info("Forwarding data on: " + this.transport); if (satisfied) { LOGGER.warning("Data already forwarded for PIT entry: " + interest.toUri()); } transport.receive(data.wireEncode().buf()); satisfied = true; }
private void request(Face face, Interest interest, DataStream stream, long segmentNumber, byte marker) throws IOException { Interest copiedInterest = replaceFinalComponent(interest, segmentNumber, marker); face.expressInterest(copiedInterest, stream, stream); logger.info("Interest sent: " + copiedInterest.toUri()); setLastRequestedSegment(segmentNumber); } }
/** * {@inheritDoc} */ @Override public void onInterest(Name prefix, Interest interest, Face face, long interestFilterId, InterestFilter filter){ try { Data data = callback.onInterest(prefix, interest); data = processPipeline(data); face.putData(data); } catch (Exception e) { logger.log(Level.FINE, "Failed to send data for: " + interest.toUri(), e); } } }
@Override public void onInterest(Name name, Interest interest, Face face, long l, InterestFilter interestFilter) { LOGGER.log(Level.INFO, "Received announcement: {0}", interest.toUri()); try { long publisherId = PubSubNamespace.parsePublisher(interest.getName()); PubSubNamespace.Announcement announcement = PubSubNamespace.parseAnnouncement(interest.getName()); switch (announcement) { case ENTRANCE: add(publisherId); break; case EXIT: remove(publisherId); break; default: LOGGER.warning("Unknown announcement action, ignoring: " + interest.toUri()); } } catch (EncodingException e) { LOGGER.log(Level.SEVERE, "Failed to decode announcement: " + interest.toUri(), e); onError.on(e); } }
@Override public void onTimeout(Interest interest) { numFailures++; LOGGER.finest("Request failed, count " + numFailures + ": " + interest.toUri()); if (shouldRetry()) { try { retryInterest(this); } catch (IOException ex) { applicationOnTimeout.onTimeout(interest); } } else { applicationOnTimeout.onTimeout(interest); } } }
/** * {@inheritDoc} */ @Override public DataStream getSegmentsAsync(Face face, Interest interest) throws IOException { SegmentedDataStream stream = new SegmentedDataStream(); // once more packets are received, request more stream.observe(new SegmentationContext(stream, face)); // request first packet logger.info("Interest requested: " + interest.toUri()); face.expressInterest(interest, stream, stream); return stream; }
@Override public void onInterest(Name name, Interest interest, Face face, long registrationId, InterestFilter interestFilter) { LOGGER.log(Level.INFO, "Client requesting message: {0}", interest.toUri()); if (isAttributesRequest(name, interest)) { sendAttributes(face, name); } else { if (contentStore.has(interest)) { sendContent(face, interest); } else { pendingInterestTable.add(interest); } } }
/** * {@inheritDoc} */ @Override public void onInterest(Name prefix, Interest interest, Face face, long interestFilterId, InterestFilter filter) { logger.finer("Serving packet for: " + interest.toUri()); if (interest.getChildSelector() == -1) { try { interest.getName().get(-1).toSegment(); } catch (EncodingException e) { interest.setChildSelector(Interest.CHILD_SELECTOR_LEFT); } } try { Data data = repository.get(interest); data = processPipeline(data); face.putData(data); } catch (Exception e) { logger.log(Level.FINE, "Failed to find data satisfying: " + interest.toUri(), e); } }
@Override public void in(Interest interest, Transport destinationTransport, Face localFace) { LOGGER.info("Received registration request: " + interest.toUri()); ControlParameters params = decodeParameters(interest); MockForwarder.FibEntry entry = new ClientFibEntry(params.getName(), (MockTransport) destinationTransport, params.getForwardingFlags()); fib.add(entry); LOGGER.info("Added new route " + params.getName() + " to: " + destinationTransport); ControlResponse response = encodeResponse(params); Data data = new Data(); data.setName(interest.getName()); data.setContent(response.wireEncode()); signResponse(data); try { localFace.putData(data); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Failed to send registration response", e); } }