- /*
- * We shortcut the data pending check if no bound is known for this
- * stream. This prevents us from never closing the stream in the case
- * where a connection would be closed before a "close" command has
- * been received.
- *
- * TODO
- * This still leaves open the question of handling missing data after
- * a bound has been set by a stream close command. Since we have no
- * way of pairing data and control connection, and that a data
- * connection has no ownership of a stream, it is likely that a
- * timeout approach would be appropriate to handle dangling streams.
- */
+
+ if (stream->last_net_seq_num == -1ULL) {
+ /*
+ * Handle connection close without explicit stream close
+ * command.
+ *
+ * We can be clever about indexes partially received in
+ * cases where we received the data socket part, but not
+ * the control socket part: since we're currently closing
+ * the stream on behalf of the control socket, we *know*
+ * there won't be any more control information for this
+ * socket. Therefore, we can destroy all indexes for
+ * which we have received only the file descriptor (from
+ * data socket). This takes care of consumerd crashes
+ * between sending the data and control information for
+ * a packet. Since those are sent in that order, we take
+ * care of consumerd crashes.
+ */
+ relay_index_close_partial_fd(stream);
+ /*
+ * Use the highest net_seq_num we currently have pending
+ * As end of stream indicator. Leave last_net_seq_num
+ * at -1ULL if we cannot find any index.
+ */
+ stream->last_net_seq_num = relay_index_find_last(stream);
+ /* Fall-through into the next check. */
+ }
+