#ifndef CGROUP_IO_LIMIT_H
#define CGROUP_IO_LIMIT_H

#include "postgres.h"
#include "nodes/pg_list.h"

/* type for linux device id, use libc dev_t now.
 * bdi means backing device info.
 */
typedef dev_t bdi_t;

#define make_bdi(major, minor) makedev(major, minor)
#define bdi_major(bdi) major(bdi)
#define bdi_minor(bdi) minor(bdi)


#define IO_LIMIT_MAX  (0)

/*
 * IOconfig represents the io.max of cgroup v2 io controller.
 * Fields: each field correspond to cgroup v2 io.max file.
 *	rbps: read bytes per second
 *	wbps: write bytes per second
 *	riops: read iops
 *	wiops: write iops
 */
typedef struct IOconifg
{
	// use uint64 for all fields, we can retrieve field by offset easily.
	uint64 rbps;
	uint64 wbps;
	uint64 riops;
	uint64 wiops;
} IOconfig;

/* the order must be same as struct IOconfig */
const extern char	*IOconfigFields[4];
/* the order must be same as struct IOconfigFields */
const extern char	*IOStatFields[4];

typedef struct IOconfigItem
{
	int offset;
	uint64 value;
} IOconfigItem;

/*
 * TblSpcIOLimit connects IOconfig and gpdb tablespace.
 * GPDB tablespace is a directory in filesystem, but the back of this directory
 * is one or multiple disks. Each disk has its own BDI, so there is a bdi_list
 * to save those bdi of disks.
 */
typedef struct TblSpcIOLimit
{
	Oid       tablespace_oid;

	/* for * and some filesystems, there are maybe multi block devices */
	List	  *bdi_list;

	IOconfig  *ioconfig;
} TblSpcIOLimit;

typedef struct IOLimitParserContext
{
	List *result;
	int normal_tablespce_cnt;
	int star_tablespace_cnt;
} IOLimitParserContext;

typedef struct IOLimitScannerState
{
	void *state;
	void *scanner;
} IOLimitScannerState;

typedef struct IOStatItems
{
	uint64 rbytes;
	uint64 wbytes;
	uint64 rios;
	uint64 wios;
} IOStatItems;

typedef struct IOStat
{
	Oid groupid;
	Oid tablespace;
	IOStatItems items;
} IOStat;

typedef struct IOStatHashEntry
{
	bdi_t id;
	IOStatItems items;
} IOStatHashEntry;

extern void io_limit_scanner_begin(IOLimitScannerState *state, const char *limit_str);
extern void io_limit_scanner_finish(IOLimitScannerState *state);

extern char *get_tablespace_path(Oid spcid);
extern bdi_t get_bdi_of_path(const char *ori_path);
extern int fill_bdi_list(TblSpcIOLimit *io_limit);

extern List *io_limit_parse(const char *limit_str);
extern void io_limit_free(List *limit_list);
extern void io_limit_validate(List *limit_list);

extern List  *get_iostat(Oid groupid, List *io_limit);
extern int  compare_iostat(const ListCell *ca, const ListCell *cb);
extern char *io_limit_dump(List *limit_list);

#endif
