mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-09-09 11:21:50 +02:00
fix(models): let a snapshot race resolve to the version that won
Two sends of the same request can both miss the content-hash lookup and race to insert. The unique index settles it; the loser wants exactly what the winner wrote, not an error that costs its response a version link.
This commit is contained in:
@@ -21,8 +21,8 @@ interface Props {
|
|||||||
* existed have no version and stay quiet forever.
|
* existed have no version and stay quiet forever.
|
||||||
*/
|
*/
|
||||||
export function RequestVersionDropdown({ response }: Props) {
|
export function RequestVersionDropdown({ response }: Props) {
|
||||||
const comparison = useRequestVersion(response.versionId, response.requestId);
|
const { data: comparison } = useRequestVersion(response.versionId, response.requestId);
|
||||||
if (comparison.data == null || !comparison.data.differs) {
|
if (comparison == null || !comparison.differs) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,12 +32,12 @@ export function RequestVersionDropdown({ response }: Props) {
|
|||||||
{
|
{
|
||||||
label: "View Diff",
|
label: "View Diff",
|
||||||
leftSlot: <Icon icon="git_branch" />,
|
leftSlot: <Icon icon="git_branch" />,
|
||||||
onSelect: () => showRequestVersionDiff(comparison.data!),
|
onSelect: () => showRequestVersionDiff(comparison),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Restore This Version",
|
label: "Restore This Version",
|
||||||
leftSlot: <Icon icon="history" />,
|
leftSlot: <Icon icon="history" />,
|
||||||
onSelect: () => restoreRequestVersion(comparison.data!.version),
|
onSelect: () => restoreRequestVersion(comparison.version),
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -50,11 +50,22 @@ impl<'a> ClientDb<'a> {
|
|||||||
workspace_id: request.workspace_id().to_string(),
|
workspace_id: request.workspace_id().to_string(),
|
||||||
model_type: request.model_type().to_string(),
|
model_type: request.model_type().to_string(),
|
||||||
model_id: request.id().to_string(),
|
model_id: request.id().to_string(),
|
||||||
content_hash,
|
content_hash: content_hash.clone(),
|
||||||
document,
|
document,
|
||||||
reason,
|
reason,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})?;
|
});
|
||||||
|
|
||||||
|
let version = match version {
|
||||||
|
Ok(version) => version,
|
||||||
|
// Two sends of the same request can both miss the lookup above and
|
||||||
|
// race to insert. The unique index settles it, and the loser wants
|
||||||
|
// exactly what the winner wrote.
|
||||||
|
Err(err) => match self.find_version_by_hash(request.id(), &content_hash) {
|
||||||
|
Some(existing) => return Ok(existing),
|
||||||
|
None => return Err(err),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
self.prune_model_versions(request.id())?;
|
self.prune_model_versions(request.id())?;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user