blob: 20f32af983bf25cd2041037a7d0ed4d4d4cd8642 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SYNC_NOTIFIER_DROPPED_INVALIDATION_TRACKER_H_
#define SYNC_NOTIFIER_DROPPED_INVALIDATION_TRACKER_H_
#include "google/cacheinvalidation/include/types.h"
#include "sync/base/sync_export.h"
#include "sync/internal_api/public/base/ack_handle.h"
#include "sync/internal_api/public/util/weak_handle.h"
#include "sync/notifier/ack_handler.h"
namespace syncer {
class Invalidation;
// Helps InvalidationHandlers keep track of dropped invalidations for a given
// ObjectId.
//
// The intent of this class is to hide some of the implementation details around
// how the invalidations system manages dropping and drop recovery. Any
// invalidation handler that intends to buffer and occasionally drop
// invalidations should keep one instance of it per registered ObjectId.
//
// When an invalidation handler wishes to drop an invalidation, it must provide
// an instance of this class to that Invalidation's Drop() method. In order to
// indicate recovery from a drop, the handler can call this class'
// RecordRecoveryFromDropEvent().
//
// Copy and assign are allowed for this class so we can use it in STL
// containers.
class SYNC_EXPORT DroppedInvalidationTracker {
public:
explicit DroppedInvalidationTracker(const invalidation::ObjectId& id);
~DroppedInvalidationTracker();
const invalidation::ObjectId& object_id() const;
// Called by Invalidation::Drop() to keep track of a drop event.
//
// Takes ownership of the internals belonging to a soon to be discarded
// dropped invalidation. See also the comment for this class'
// |drop_ack_handler_| member.
void RecordDropEvent(WeakHandle<AckHandler> handler, AckHandle handle);
// Returns true if we're still recovering from a drop event.
bool IsRecoveringFromDropEvent() const;
// Called by the InvalidationHandler when it recovers from the drop event.
void RecordRecoveryFromDropEvent();
private:
invalidation::ObjectId id_;
AckHandle drop_ack_handle_;
// This flag is set to true when we have dropped an invalidation and have not
// yet recovered from this drop event. Note that this may not always coincide
// with drop_ack_handler_ being initialized because a null AckHandler could be
// passed in to RecordDropEvent().
bool recovering_from_drop_;
// A WeakHandle to the enitity responsible for persisting invalidation
// acknowledgement state on disk. We can get away with using a WeakHandle
// because we don't care if our drop recovery message doesn't gets delivered
// in some shutdown cases. If that happens, we'll have to process the
// invalidation state again on the next restart. It would be a waste of time
// and resources, but otherwise not particularly harmful.
WeakHandle<AckHandler> drop_ack_handler_;
};
} // namespace syncer
#endif // SYNC_NOTIFIER_DROPPED_INVALIDATION_TRACKER_H_