Skip to content

Sync integrity: add conditional revisions, ETags and idempotent uploads #35

Description

@joeblack2k

Probleem

De huidige uploadflow kan een lost update accepteren: twee devices kunnen dezelfde cloudrevision lezen, waarna device A een nieuwe revision uploadt en device B vervolgens vanaf de inmiddels verouderde basis eveneens uploadt. Versienummers en hashes bestaan al, maar zijn nog geen write-precondition.

Doel

Introduceer een compatibele revisionlaag vóórdat strict conditional writes verplicht worden voor alle helpers.

Fase 1 — compatibel protocol

  • iedere save/latest success-response bevat revision (de immutable save-ID) en een sterke ETag header;
  • uploads accepteren If-Match en/of multipart baseRevision;
  • een opgegeven basis die niet de actuele logical-save revision is geeft HTTP 412 en retourneert de actuele revision/hash/version;
  • If-None-Match: * ondersteunt create-only gedrag;
  • dezelfde preconditionlogica wordt vóór gewone uploads en projection-/speciale opslagpaden toegepast;
  • responsemetadata maakt duidelijk of conditional writes door de server worden ondersteund.

Fase 2 — strict capability

  • helpers kunnen via schema/capability aangeven dat zij conditional writes ondersteunen;
  • zodra een helper deze capability claimt, ontbrekende precondition op een bestaande logical save geeft HTTP 428;
  • legacy helpers blijven tijdelijk compatibel totdat hun protocol is gemigreerd.

Idempotentie

  • uploads accepteren een idempotency key;
  • retry na een afgebroken response creëert geen extra revision;
  • dezelfde key met andere payload/identity wordt geweigerd.

Tests

  • twee clients lezen dezelfde basis, eerste write slaagt, tweede krijgt 412;
  • juiste If-Match schrijft exact één nieuwe revision;
  • If-None-Match:* faalt wanneer de logical save al bestaat;
  • idempotente retry retourneert hetzelfde resultaat;
  • stale historical payloads kunnen conditional checks niet omzeilen;
  • legacy helper zonder capability blijft tijdens migratiefase werken;
  • helper met conditional capability zonder precondition krijgt 428.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions