title GetRange Fallback participantgroup **Client** (NativeAPI.actor.cpp) participant "getRangeFallback" as gRF participant "getKey" as gK participant "getExactRange" as gER participant "getKeyRangeLocations" as gKRL end participantgroup **Storage Server** (storageserver.actor.cpp) participant "serveGetKeyValuesRequests" as sGKVR participant "serveGetKeyRequests" as sGKR end autoactivation off opt Key need resolve gRF -> gK: KeySelector box over gK: Wait for the version note right of gK: //GetKeyAttachID// note right of gK: AfterVersion box over gK: See getKeyLocation in Get note right of gK: Before gK -> sGKR: GetKeyRequest sGKR --> gK: GetKeyReply alt Success note right of gK: After gK --> gRF: Key else Error note right of gK: Error end end box over gRF: Update read version if necessary gRF -> gER: Version, KeyRangeRef loop Loop over keys in the range gER -> gKRL: KeyRange note right of gKRL: Before box over gKRL: Get the locations note right of gKRL: After gKRL --> gER: LocationInfo loop Loop over shards note right of gER: Before gER -> sGKVR: GetKeyValuesRequest note right of sGKVR: --storageserver.getKeyValues.Before-- box over sGKVR: Wait the SS version note right of sGKVR: --storageserver.getKeyValues.AfterVersion-- box over sGKVR: Realign the keys note right of sGKVR: --storageserver.getKeyValues.AfterKeys-- alt No KV pair stored in this server note right of sGKVR: --storageserver.getKeyValues.Send-- sGKVR --> gER: GetKeyValuesReply (empty) else KV pair found note right of sGKVR: --storageserver.getKeyValues.AfterReadRange-- sGKVR --> gER: GetKeyValuesReply end note right of gER: After end end gER --> gRF: RangeResultRef