-
Notifications
You must be signed in to change notification settings - Fork 535
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
Summary docs #10435
Summary docs #10435
Changes from 9 commits
0c6fff8
dc7ac60
e00da81
d3f438c
36f6b71
4443a59
2d94e94
4de5881
4344526
bddf991
2e667eb
f5ba6d2
c69bb47
0e69979
e0bc62e
d713f17
7411adc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
|
@@ -21,41 +21,89 @@ export interface ISummaryCommitter { | |||||||
date: string; | ||||||||
} | ||||||||
|
||||||||
/** | ||||||||
* Represents a leaf node from the Summary Tree. | ||||||||
andre4i marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
*/ | ||||||||
// eslint-disable-next-line @typescript-eslint/no-namespace | ||||||||
export namespace SummaryType { | ||||||||
export type Tree = 1; | ||||||||
export type Blob = 2; | ||||||||
export type Handle = 3; | ||||||||
export type Attachment = 4; | ||||||||
|
||||||||
export const Tree: Tree = 1 as const; | ||||||||
export const Blob: Blob = 2 as const; | ||||||||
export const Handle: Handle = 3 as const; | ||||||||
export const Attachment: Attachment = 4 as const; | ||||||||
/** | ||||||||
* Another recursive data structure. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should probably say that this represents a sub-tree in the summary. #Resolved |
||||||||
*/ | ||||||||
export const Tree: Tree = 1 as const; | ||||||||
|
||||||||
/** | ||||||||
* Binary data to be uploaded to the server. The data is sent to the drivers | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think we should mention driver or server here. Runtime doesn't really care about any of that. This should probably just say that this represents a blob of data that is added to the summary. Such as the user data that is added to the DDS or metadata added by runtime such as data store / channel attributes. #Resolved |
||||||||
* and each driver will decide how the blob will be uploaded to the server. | ||||||||
*/ | ||||||||
export const Blob: Blob = 2 as const; | ||||||||
/** | ||||||||
andre4i marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
* Path to an already stored tree that hasn't changed since the last summary. | ||||||||
*/ | ||||||||
export const Handle: Handle = 3 as const; | ||||||||
|
||||||||
/** | ||||||||
* Unique identifier to larger blobs uploaded outside of the summary. | ||||||||
* Ex. DDS has large images or video that will be uploaded by the BlobManager and | ||||||||
* receive an Id that can be used in the summary. | ||||||||
*/ | ||||||||
export const Attachment: Attachment = 4 as const; | ||||||||
} | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you happen to know the answer, it would be good to document if there was an explicit choice not to declare SummaryType as an enum? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @anthony-murphy Do you know why ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe because of the reason mentioned in this comment here - #9548 (comment) |
||||||||
export type SummaryType = SummaryType.Attachment | SummaryType.Blob | SummaryType.Handle | SummaryType.Tree; | ||||||||
|
||||||||
export type SummaryTypeNoHandle = SummaryType.Tree | SummaryType.Blob | SummaryType.Attachment; | ||||||||
|
||||||||
/** | ||||||||
* Path to a summary tree object from the last uploaded summary indicating the summary object hasn't | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This isn't very important. I am just trying to differentiate the case where the last uploaded summary was not successfully ack'd by the server. |
||||||||
* changed since it was uploaded. | ||||||||
* To illustrate, if a DataStore did not get any ops since last summary, the framework runtime will use a handle for the | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should say |
||||||||
* entire DataStore instead of re-sending the entire subtree. Same concept will be applied for a DDS. | ||||||||
* If a DDS did not receive any ops since the last summary, the ISummary tree for that DDS will not have changed and | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. From a readability point of view, I don't think this line about DDS is needed. Mentioning that the behavior is same as data store should be sufficient. #Resolved |
||||||||
* the fluid framework will send that DDS' handle so the server can use that previous handle instead of sending the | ||||||||
* entire DDS. An example of handle would be: '/<DataStoreId>/<DDSId>'. | ||||||||
* Notice that handles are optimizations from the Fluid Framework Runtime and the DDS is not aware of the handles. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see two issues with this: Also SharedObject authors have to implement a method that returns a datastructure that can use this type. |
||||||||
* Also, the use of Summary Handles is currently restricted to DataStores and DDS. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You should omit this last line. We are working on adding handles for GC data and we will soon add it in other places too. #Resolved |
||||||||
*/ | ||||||||
export interface ISummaryHandle { | ||||||||
type: SummaryType.Handle; | ||||||||
|
||||||||
// No handles, all other SummaryType are Ok | ||||||||
/** | ||||||||
* Type of Summary Handle all Summary types with the exception of handles (which are NOT supported). | ||||||||
andre4i marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
*/ | ||||||||
handleType: SummaryTypeNoHandle; | ||||||||
|
||||||||
// Stored handle reference | ||||||||
/** | ||||||||
* Unique path that identifies the stored handle reference. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||
*/ | ||||||||
handle: string; | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How do I get one of these? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As a developer, I don't think you need to get it - if I got it right, it is automatically set (id) when we create the fluid file from a summary: Ex. createNewFluidFileFromSummary. @agarwal-navin to confirm. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not really. Currently, every object that wants to use this to send a path to previous summary instead of full summary has to know what the path is. For example, the summarizer node for data store context and channel contexts tracks this path and adds it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe the way it should it be is similar to how summary tree is built. Each node just adds its summary tree when asked for it. It's the responsibility of the caller to add this tree against the correct path. This way by the time the summary tree reaches the root, all paths are fully built w.r.t. root. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's sync up ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. sure There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just as a reference- the only place I found that adds the handle to the tree is when we call encodeSummary (builder.addHandle). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is the main usage of summary handle in our code - FluidFramework/packages/runtime/runtime-utils/src/summarizerNode/summarizerNode.ts Line 100 in aeac6ba
The There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks Navin I had missed it - at the SummarizerNode level, if we are tracking it, it is stored under _latestSummary.fullPath.path |
||||||||
} | ||||||||
|
||||||||
/** | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it would be good to mention here that to reference an already uploaded blob use ISummaryAttachment. Someone looking for how to do that is likley to find themselves here, and not realize they need to look into ISummaryAttachments. #Resolved |
||||||||
* String or Binary data to be uploaded to the server as part of the document's Summary. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: container's summary. We try to avoid using the term document as it is ambiguous. #Resolved |
||||||||
*/ | ||||||||
export interface ISummaryBlob { | ||||||||
type: SummaryType.Blob; | ||||||||
content: string | Uint8Array; | ||||||||
} | ||||||||
|
||||||||
/** | ||||||||
* Handle to blobs uploaded outside of the summary. Attachment Blobs are uploaded and downloaded separately via | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should avoid using the term handle here as it adds confusion with the other handle. This should probably say something to the effect of |
||||||||
* http requests and are not included on the snapshot payload. The ISummaryAttachment are handles to these blobs. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think this should say http requests as it is not just restricted to http. #Resolved There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
nit There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just added - let me know if it helps. |
||||||||
* Additional information can be found here: https://github.com/microsoft/FluidFramework/issues/6374 | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This documentation on ISummaryAttachment is super useful to me even in its current state! #Resolved |
||||||||
*/ | ||||||||
export interface ISummaryAttachment { | ||||||||
type: SummaryType.Attachment; | ||||||||
id: string; | ||||||||
} | ||||||||
Comment on lines
104
to
105
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What format is this in OR how do I get one from a IFluidHandle? Is it the absolute path? A json seralized handle? Something else? #Resolved There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added an example, it is an id returned from the backend. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is not used so I am not really sure. I believe the idea is that There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I added an example that makes it easier to visualize. @navin, are you sure this is not used ? After all, we do write it :) Ex. ".blobs": { |
||||||||
|
||||||||
/** | ||||||||
* Tree Node data structure with children that are nodes of SummaryObject type: | ||||||||
* Blob, Handle, Attachment or another Tree. | ||||||||
*/ | ||||||||
export interface ISummaryTree { | ||||||||
type: SummaryType.Tree; | ||||||||
|
||||||||
|
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
|
@@ -21,13 +21,19 @@ export interface IChannel extends IFluidLoadable { | |||||||
|
||||||||
/** | ||||||||
* Generates summary of the channel synchronously. | ||||||||
* @param fullTree - flag indicating whether the attempt should generate a full | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It may be worth adding that this is called when an attach message for a local channel is generated. In other words, when the channel is being attached to make it visible to other clients. #Resolved There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How important is this "attempt"? Is it a bug or just a perf issue if the implementation returns a summary tree contining a handle for an unchanged subtree? What about a handle for something other than an unchaed subtree (es: a new blob)? Its important for the documenration on this method to make it possible to tell if an imlementation of it is incorrect, and without answering the above, there are cases where I wouldn't know. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The attach summary cannot contain summary handles, i.e., path to sub-trees (or blobs) in the previous summary. It can however contain ISummaryAttachment, i.e., handles to blobs that were uploaded async via the blob manager. I agree with you that its worth calling it out here. |
||||||||
* summary tree without any handles for unchanged subtrees. | ||||||||
* @param trackState - This tells whether we should track state from this summary. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If I'm implementing this interface, how do I "trackState"? What does that mean? How can I tell if code does it correctly or not? Thats what this comment needs to answer. Also from a verbosity standpoint, "This tells whether we should" does not really provide any information, and "we" isn't clear (this is a contract between caller and calee: which is "we"?). I'd prefer something like: "If true, the implementation must ?????" #Resolved There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe that for Summaries ( the same applies for the GC summarization?) , at least when we do the summary of the runtime at a specific sequence number, the default behavior is to always track the state of every object. @agarwal-navin to make sure it is correct. Can you confirm which scenarios we do not track the state and why would we not track it ? I know if it is false we bypass the Summarizer node call and go straight to summarizeInternal. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. State tracking is basically an optimization that we added to track state of objects across summaries. Basically, if the state of an object did not change since last successful summary, we can send an This was mostly internal and the state tracking happens in summarizer node for data store context and channel context. If a DDS wants to track its internal summary state, it is free to do so (but no DDS does this). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There are plans to do this at DDS level - https://dev.azure.com/fluidframework/internal/_workitems/edit/423. When this happens, this option should either be removed or it will make more sense because we would likely expose the previous successful summary. And then we say something like, if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So the requirement here is (and thus a good doc comment would be) - Might be better to rename this "allowHandles"? It would be nice to deduplicate this documentation (as well as There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I will leave this change to a different PR. |
||||||||
* @returns A tree representing the summary of the channel. | ||||||||
*/ | ||||||||
getAttachSummary(fullTree?: boolean, trackState?: boolean): ISummaryTreeWithStats; | ||||||||
|
||||||||
/** | ||||||||
* Generates summary of the channel asynchronously. | ||||||||
* This should not be called where the channel can be modified while summarization is in progress. | ||||||||
* @param fullTree - flag indicating whether the attempt should generate a full | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It may be worth adding that this is called when generating a summary of the entire container. #Resolved |
||||||||
* summary tree without any handles for unchanged subtrees. | ||||||||
* @param trackState - This tells whether we should track state from this summary. | ||||||||
* @returns A tree representing the summary of the channel. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I know you didn't change this, but I think it should be improved. We can remove some verbosity, and be more specific (ideally something more specific that what I said would be good, but I don't know better). From context we already know this returns the summary of the channel (its channel.summarize afterall), so details beyond that are useful.
Suggested change
|
||||||||
*/ | ||||||||
summarize(fullTree?: boolean, trackState?: boolean): Promise<ISummaryTreeWithStats>; | ||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,6 +16,9 @@ import { | |
IGarbageCollectionSummaryDetails, | ||
} from "./garbageCollection"; | ||
|
||
/** | ||
* Contains the aggregation data from a Tree/Subtree. | ||
*/ | ||
export interface ISummaryStats { | ||
treeNodeCount: number; | ||
blobNodeCount: number; | ||
|
@@ -24,8 +27,19 @@ export interface ISummaryStats { | |
unreferencedBlobSize: number; | ||
} | ||
|
||
/** | ||
* The summarization methods are recursively invoked during the summary calculation and will | ||
* compose the Summary Tree. At the same time, each component that is taking part of the summarization | ||
* will populate the tree information aggregation for its subtree through the ISummaryStats interface. | ||
* Any component that implements IChannelContext, IFluidDataStoreChannel or extends SharedObject | ||
* will be taking part of the summarization process. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. IMHO, this description may not be very relevant here. This is essentially describing the summarization process. It should rather say what this interface means. Basically, that this represents the summary tree for a node along with the statistics for that tree. As an example it could mention that for a data store this has the data for the data store along with a subtree for each of its DDS. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Another important piece of information here may be its distinction from There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Its also worth adding a comment for |
||
*/ | ||
export interface ISummaryTreeWithStats { | ||
/** Represents an agreggation of node counts and blob sizes associated to the current summary information */ | ||
stats: ISummaryStats; | ||
/** Summary defines a recursive data structure that will be will be converted to a snapshot tree and uploaded | ||
andre4i marked this conversation as resolved.
Show resolved
Hide resolved
|
||
* to the backend. | ||
*/ | ||
summary: ISummaryTree; | ||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Orthogonal to this PR - Interesting to note that
ISummaryAuthor
andISummaryCommiter
above are never used. We may want to look into removing them. #ResolvedThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tracking by #10456