Skip to content

Joining Fetch #638

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 47 commits into from
Feb 11, 2025
Merged
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
619a6ec
Joining Fetch
englishm Nov 27, 2024
4525f9d
Fix client/peer in GOAWAY Timeout
englishm Dec 4, 2024
8e1e9ca
Normalize case
englishm Dec 4, 2024
7f19b5e
Normalize case
englishm Dec 4, 2024
921f4c4
Normalize case
englishm Dec 4, 2024
c285647
Normalize case
englishm Dec 4, 2024
8fa9be8
Remove extra space
englishm Dec 4, 2024
e1093ad
spelling: s/Groupe/Group/
englishm Dec 4, 2024
1522ab7
Update with a more verbose algorithm for clarity
englishm Dec 18, 2024
0a00c36
Simplify algorithm w/ intermediate resolved values
englishm Dec 18, 2024
e0e649e
Previous Group -> Preceding Group Offset
englishm Dec 18, 2024
07e93ce
Fetch error rather than closing session
englishm Dec 18, 2024
d01b841
Fix Resolved Subscribe Start Object (LatestGroup)
englishm Dec 18, 2024
dbc9f9a
Clarify empty fetch case
englishm Dec 18, 2024
204437e
Guidance for certain cases
englishm Dec 18, 2024
578b567
Update draft-ietf-moq-transport.md
englishm Dec 19, 2024
6dae36d
Update draft-ietf-moq-transport.md
englishm Dec 20, 2024
9fa2429
Incorporate feedback
englishm Jan 22, 2025
a50b040
Brief motivating example for Suhas
englishm Jan 22, 2025
6c0790f
Nit: spacing
englishm Jan 22, 2025
eb20e67
fix phrasing nit
englishm Jan 24, 2025
7d4a99d
Cleanup - remove duplicate paragraph
englishm Jan 24, 2025
450b4d7
Clarify properties apply to Fetch and Subscribe
englishm Jan 24, 2025
7db23b5
Group Order for all Fetch Types
englishm Jan 24, 2025
86ec7ff
Remove unnecessary/redundant definitions
englishm Jan 24, 2025
094d800
Merge branch 'main' into me/joining-fetch
ianswett Jan 29, 2025
5b1ec66
Reflow some long lines
ianswett Jan 30, 2025
9cbde3c
Reflow and minor editorial updates
ianswett Jan 30, 2025
e5a2868
Shorten some descriptions
ianswett Jan 30, 2025
d7e8648
Merge branch 'main' into me/joining-fetch
ianswett Jan 30, 2025
f408e38
Update draft-ietf-moq-transport.md
englishm Jan 30, 2025
46f2124
Merge branch 'main' into me/joining-fetch
ianswett Jan 31, 2025
6076f68
Merge branch 'main' into me/joining-fetch
ianswett Feb 3, 2025
df48071
Merge branch 'main' into me/joining-fetch
ianswett Feb 3, 2025
a70455e
Limit Joining Fetch to Latest Object Subscribes
englishm Feb 3, 2025
411d42e
Clarify resulting FETCH/SUBSCRIBE independence
englishm Feb 4, 2025
c3442de
Remove redundant text
englishm Feb 4, 2025
cc7de8d
Update draft-ietf-moq-transport.md
ianswett Feb 7, 2025
648dbc4
Separate out the IDs of the Joining Fetch and prior subscription
ianswett Feb 11, 2025
801fb4b
Update draft-ietf-moq-transport.md
ianswett Feb 11, 2025
d9e2731
Update draft-ietf-moq-transport.md
ianswett Feb 11, 2025
3bc9c52
Simplify some text based on Suhas suggestions
ianswett Feb 11, 2025
3a45e97
Minor editorial update
ianswett Feb 11, 2025
913c9d7
Update draft-ietf-moq-transport.md
ianswett Feb 11, 2025
5945077
Merge branch 'main' into me/joining-fetch
ianswett Feb 11, 2025
e3fe1a2
Merge branch 'main' into me/joining-fetch
ianswett Feb 11, 2025
2529140
Subtract 1 from EndGroup if EndObject is 0
ianswett Feb 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 76 additions & 17 deletions draft-ietf-moq-transport.md
Original file line number Diff line number Diff line change
Expand Up @@ -1472,6 +1472,27 @@ objects within a track. The publisher responding to a FETCH is responsible for r
all available Objects. If there are gaps between Objects, the publisher omits them from the
fetch response. All omitted objects have status Object Does Not Exist.

**Fetch Types**

There are two types of Fetch messages:

Standalone Fetch (0x1) : A Fetch of Objects performed independently of any Subscribe.

Joining Fetch (0x2) : A Fetch joined together with a Subscribe by specifying
the Subscribe ID of an active subscription. A publisher receiving a
Joining Fetch uses properties of the associated Subscribe to determine the
Track Namespace, Track, StartGroup, StartObject, EndGroup, and EndObject such that
it is contiguous with the associated Subscribe. The Joining Fetch begins the
Preceding Group Offset prior to the associated subscription.

A Subscriber can use a Joining Fetch to, for example, fill a playback buffer with a
certain number of groups prior to the live edge of a track.

A Joining Fetch is only permitted when the associated Subscribe has the Filter
Type Latest Object.

A Fetch Type other than 0x1 or 0x2 MUST be treated as an error.

A publisher responds to a FETCH request with either a FETCH_OK or a FETCH_ERROR
message. If it responds with FETCH_OK, the publisher creates a new unidirectional
stream that is used to send the Objects. A relay MAY start sending objects immediately
Expand All @@ -1491,29 +1512,29 @@ FETCH Message {
Type (i) = 0x16,
Length (i),
Subscribe ID (i),
Track Namespace (tuple),
Track Name Length (i),
Track Name (..),
Subscriber Priority (8),
Group Order (8),
StartGroup (i),
StartObject (i),
EndGroup (i),
EndObject (i),
Fetch Type (i),
[Track Namespace (tuple),
Track Name Length (i),
Track Name (..),
StartGroup (i),
StartObject (i),
EndGroup (i),
EndObject (i),]
[Joining Subscribe ID (i),
Preceding Group Offset (i),]
Number of Parameters (i),
Parameters (..) ...
}
~~~
{: #moq-transport-fetch-format title="MOQT FETCH Message"}

Fields common to all Fetch Types:

* Subscribe ID: The Subscribe ID identifies a given fetch request. Subscribe ID
is a variable length integer that MUST be unique and monotonically increasing
within a session.

* Track Namespace: Identifies the namespace of the track as defined in
({{track-name}}).

* Track Name: Identifies the track name as defined in ({{track-name}}).
within a session.

* Subscriber Priority: Specifies the priority of a fetch request relative to
other subscriptions or fetches in the same session. Lower numbers get higher
Expand All @@ -1524,6 +1545,17 @@ Ascending (0x1) or Descending (0x2) order by group. See {{priorities}}.
A value of 0x0 indicates the original publisher's Group Order SHOULD be
used. Values larger than 0x2 are a protocol error.

* Fetch Type: Identifies the type of Fetch, whether joining or standalone.

* Parameters: The parameters are defined in {{version-specific-params}}.

Fields present only for Standalone Fetch (0x1):

* Track Namespace: Identifies the namespace of the track as defined in
({{track-name}}).

* Track Name: Identifies the track name as defined in ({{track-name}}).

* StartGroup: The start Group ID.

* StartObject: The start Object ID.
Expand All @@ -1533,8 +1565,15 @@ used. Values larger than 0x2 are a protocol error.
* EndObject: The end Object ID, plus 1. A value of 0 means the entire group is
requested.

* Parameters: The parameters are defined in {{version-specific-params}}.
Fields present only for Joining Fetch (0x2):

* Joining Subscribe ID: The Subscribe ID of the existing subscription to be
joined. If a publisher receives a Joining Fetch with a Subscribe ID that does
not correspond to an existing Subscribe, it MUST respond with a Fetch Error.

* Preceding Group Offset: The group offset for the Fetch prior and relative
to the Current Group of the corresponding Subscribe. A value of 0 indicates
the Fetch starts at the beginning of the Current Group.

Objects that are not yet published will not be retrieved by a FETCH.
The latest available Object is indicated in the FETCH_OK, and is the last
Expand All @@ -1548,9 +1587,29 @@ subgroup ID is not used for ordering.
If StartGroup/StartObject is greater than the latest published Object group,
the publisher MUST return FETCH_ERROR with error code 'No Objects'.

A publisher MUST send fetched groups in group order, either ascending or
descending. Within each group, objects are sent in Object ID order;
subgroup ID is not used for ordering.
### Calculating the Range of a Joining Fetch

A publisher that receives a Fetch of type Type 0x2 treats it
as a Fetch with a range dynamically determined by the Preceding Group Offset
and field values derived from the corresponding subscription.

The Largest Group ID and Largest Object ID values from the corresponding
subscription are used to calculate the end of a Joining Fetch so the Objects
retrieved by the FETCH and SUBSCRIBE are contiguous and non-overlapping.
If no Objects have been published for the track, and the SUBSCRIBE_OK has a
ContentExists value of 0, the publisher responds with a FETCH_ERROR with
error code 'No Objects'.

The publisher receiving a Joining Fetch computes the range as follows:

* Fetch StartGroup: Subscribe Largest Group - Preceding Group Offset
* Fetch StartObject: 0
* Fetch EndGroup: Subscribe Largest Group
* Fetch EndObject: Subscribe Largest Object

A Fetch EndObject of 0 requests the entire group, but Fetch will not
retrieve Objects that have not yet been published, so 1 is subtracted from
the Fetch EndGroup if Fetch EndObject is 0.

## FETCH_CANCEL {#message-fetch-cancel}

Expand Down