载入中...
搜索中...
未找到
Container.cpp
浏览该文件的文档.
13[[nodiscard]] const MembershipEntry* findEntry(const ContainerSnapshot& snapshot, const MembershipId& id) {
27 if (!entry.membership.object.isValid() || !ids.insert(entry.membership.object).second) return true;
28 if (!entry.membership.slot.isValid() || !slots.insert(entry.membership.slot.value()).second) return true;
36[[nodiscard]] Result<void> validateSnapshot(const ContainerSnapshot& snapshot, const IContainer& container) {
38 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvariantViolation, "container snapshot identity does not match adapter", {}));
40 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Conflict, "container snapshot contains duplicate or invalid membership", {}));
43 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvariantViolation, "container snapshot exceeds capacity", {}));
47 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvariantViolation, "container snapshot contains a slot outside capacity", {}));
63 if (candidate.entries.size() > static_cast<std::size_t>(std::numeric_limits<std::int32_t>::max()))
65 Diagnostic::error(DiagnosticCode::InvariantViolation, "container has too many indexed memberships"));
97 if (snapshot.entries.size() > static_cast<std::size_t>(std::numeric_limits<std::int32_t>::max()))
99 Diagnostic::error(DiagnosticCode::InvariantViolation, "container has too many indexed memberships"));
100 return Result<SlotIndex>::success(SlotIndex(static_cast<std::int32_t>(snapshot.entries.size())));
112 return Result<SlotIndex>::failure(Diagnostic::error(DiagnosticCode::Conflict, "container has no available slot"));
115[[nodiscard]] Result<ContainerSnapshot> insertEntry(ContainerSnapshot base, const ContainerDescriptor& descriptor,
135Result<TransferReceipt> TransferService::transfer(const TransferRequest& request, TransferEventSink eventSink) {
166 if (request.expectedSourceRevision && *request.expectedSourceRevision != sourceSnapshot.revision) {
170 if (request.expectedDestinationRevision && *request.expectedDestinationRevision != destinationSnapshot.revision) {
189 if (!sameContainer && request.source->descriptor().id == request.destination->descriptor().id) {
191 DiagnosticCode::Conflict, "different container adapters must not expose the same container identity"));
196 Diagnostic::error(DiagnosticCode::Conflict, "destination already contains this membership object"));
211 if (sameContainer && request.destinationSlot && sourceEntry->membership.slot == *request.destinationSlot) {
226 auto sourceCandidateResult = removeEntry(sourceSnapshot, request.source->descriptor(), request.object);
227 if (!sourceCandidateResult) return Result<TransferReceipt>::failure(sourceCandidateResult.status());
234 auto candidateResult = insertEntry(std::move(sourceCandidate), request.source->descriptor(), *sourceEntry,
244 Diagnostic::error(DiagnosticCode::InvariantViolation, "same-container candidate lost membership"));
252 insertEntry(destinationSnapshot, request.destination->descriptor(), *sourceEntry, request.destinationSlot);
259 Diagnostic::error(DiagnosticCode::InvariantViolation, "destination candidate lost membership"));
268 if (!sourcePreparedResult) return Result<TransferReceipt>::failure(sourcePreparedResult.status());
274 auto destinationPreparedResult = request.destination->prepare(destinationSnapshot, destinationCandidate);
294 eventSink(TransferEvent{receipt.source, receipt.destination, receipt.object, receipt.sourceSlot,
Low-level container membership, zone and atomic transfer contracts.
static Diagnostic warning(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct a warning diagnostic.
Definition Diagnostic.h:134
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
bool isValid() const noexcept
Return whether this ID is usable by a transfer request.
Definition Container.h:58
Borrowed container implementation owned by a domain adapter.
Definition Container.h:287
virtual const ContainerDescriptor & descriptor() const noexcept=0
Return immutable container metadata.
Strong identity of an object which can have one container membership.
Definition Container.h:68
Explicit slot number; it never implicitly converts to an integer.
Definition Container.h:117
static Result< TransferReceipt > transfer(const TransferRequest &request, TransferEventSink eventSink={})
Preflight and atomically transfer one object.
Definition Container.cpp:135
constexpr std::optional< StrongUint64 > incremented() const noexcept
Returns the next value, or empty instead of unsigned wraparound.
Definition StrongUint64.h:30
Definition Container.cpp:9
std::function< void(const TransferEvent &)> TransferEventSink
Synchronous callback receiving a committed transfer payload.
Definition Container.h:351
@ ExplicitSlots
@ InvalidArgument
@ NotFound
@ CallbackFailure
@ InvariantViolation
@ StaleHandle
@ Conflict
@ NoOp
@ Applied
Static metadata and acceptance policy of a container.
Definition Container.h:197
Lossless snapshot of one container at one revision.
Definition Container.h:190
std::vector< MembershipEntry > entries
Definition Container.h:193
Complete adapter-owned state used to build a candidate replacement.
Definition Container.h:184
Strong event payload emitted only after a transfer is fully committed.
Definition Container.h:334
Observable receipt for one committed or explicit no-op transfer.
Definition Container.h:365
Requested optimistic-concurrency transfer. All pointers are borrowed.
Definition Container.h:354