sync_raft_inflights.h 2.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 * Copyright (c) 2019 TAOS Data, Inc. <cli@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http: *www.gnu.org/licenses/>.
 */

#ifndef TD_SYNC_RAFT_INFLIGHTS_H
#define TD_SYNC_RAFT_INFLIGHTS_H

#include "sync.h"

21 22 23 24 25
// Inflights limits the number of MsgApp (represented by the largest index
// contained within) sent to followers but not yet acknowledged by them. Callers
// use Full() to check whether more messages can be sent, call Add() whenever
// they are sending a new append, and release "quota" via FreeLE() whenever an
// ack is received.
26
typedef struct SSyncRaftInflights {
27
  // the starting index in the buffer
28 29
  int start;

30
  // number of inflights in the buffer
31 32
  int count;

33
  // the size of the buffer
34 35
  int size;

36 37
	// buffer contains the index of the last entry
	// inside one message.
38 39 40 41 42 43
  SyncIndex* buffer;
} SSyncRaftInflights;

SSyncRaftInflights* syncRaftOpenInflights(int size);
void syncRaftCloseInflights(SSyncRaftInflights*);

44
// reset frees all inflights.
45 46 47 48 49
static FORCE_INLINE void syncRaftInflightReset(SSyncRaftInflights* inflights) {  
  inflights->count = 0;
  inflights->start = 0;
}

50
// Full returns true if no more messages can be sent at the moment.
51 52 53 54
static FORCE_INLINE bool syncRaftInflightFull(SSyncRaftInflights* inflights) {
  return inflights->count == inflights->size;
}

55 56 57 58
// Add notifies the Inflights that a new message with the given index is being
// dispatched. Full() must be called prior to Add() to verify that there is room
// for one more message, and consecutive calls to add Add() must provide a
// monotonic sequence of indexes.
59 60
void syncRaftInflightAdd(SSyncRaftInflights* inflights, SyncIndex inflightIndex);

61
// FreeLE frees the inflights smaller or equal to the given `to` flight.
62 63 64 65 66 67 68 69 70
void syncRaftInflightFreeLE(SSyncRaftInflights* inflights, SyncIndex toIndex);

/** 
 * syncRaftInflightFreeFirstOne releases the first inflight. 
 * This is a no-op if nothing is inflight.
 **/
void syncRaftInflightFreeFirstOne(SSyncRaftInflights* inflights);

#endif /* TD_SYNC_RAFT_INFLIGHTS_H */