1 /*
2  * File:   ms_task.h
3  * Author: Mingqiang Zhuang
4  *
5  * Created on February 10, 2009
6  *
7  * (c) Copyright 2009, Schooner Information Technology, Inc.
8  * http://www.schoonerinfotech.com/
9  *
10  */
11 #ifndef MS_TASK_H
12 #define MS_TASK_H
13 
14 #include <sys/types.h>
15 #include <stdint.h>
16 #if !defined(__cplusplus)
17 # include <stdbool.h>
18 #endif
19 #include <time.h>
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 #define UNIT_ITEMS_COUNT     1024               /* each window unit has 1024 items */
26 #define KEY_PREFIX_SIZE      (sizeof(uint64_t)) /* key prefix length: 8 bytes */
27 #define INVALID_OFFSET       (-1)               /* invalid offset in the character table */
28 #define FIXED_EXPIRE_TIME    60                 /* default expire time is 60s */
29 #define EXPIRE_TIME_ERROR    5                  /* default expire time error is 5s */
30 
31 /* information of a task item(object) */
32 typedef struct task_item
33 {
34   uint64_t key_prefix;                  /* prefix of the key, 8 bytes, binary */
35   int key_size;                         /* key size */
36   int key_suffix_offset;                /* suffix offset in the global character table */
37 
38   int value_size;                       /* data size */
39   int value_offset;                     /* data offset in the global character table */
40 
41   time_t client_time;                   /* the current client time */
42   int exp_time;                         /* expire time */
43 } ms_task_item_t;
44 
45 /* task item for multi-get */
46 typedef struct mlget_task_item
47 {
48   ms_task_item_t *item;                 /* task item */
49   bool verify;                          /* whether verify data or not */
50   bool finish_verify;                   /* whether finish data verify or not */
51   bool get_miss;                        /* whether get miss or not */
52 } ms_mlget_task_item_t;
53 
54 /* information of multi-get task */
55 typedef struct mlget_task
56 {
57   ms_mlget_task_item_t *mlget_item;        /* multi-get task array */
58   int mlget_num;                           /* how many tasks in mlget_task array */
59   int value_index;                         /* the nth value received by the connect, for multi-get */
60 } ms_mlget_task_t;
61 
62 /* structure used to store the state of the running task */
63 typedef struct task
64 {
65   int cmd;                              /* command name */
66   bool verify;                          /* whether verify data or not */
67   bool finish_verify;                   /* whether finish data verify or not */
68   bool get_miss;                        /* whether get miss or not */
69   ms_task_item_t *item;                 /* task item */
70 
71   /* counter for command distribution adjustment */
72   uint64_t get_opt;                     /* number of total get operations */
73   uint64_t set_opt;                     /* number of total set operations, no including warmup set count */
74   int cycle_undo_get;                   /* number of undo get in an adjustment cycle */
75   int cycle_undo_set;                   /* number of undo set in an adjustment cycle */
76   uint64_t verified_get;                /* number of total verified get operations */
77   uint64_t overwrite_set;               /* number of total overwrite set operations */
78 } ms_task_t;
79 
80 struct conn;
81 
82 /* the state machine call the function to execute task.*/
83 int ms_exec_task(struct conn *c);
84 
85 
86 /* calculate the difference value of two time points */
87 int64_t ms_time_diff(struct timeval *start_time, struct timeval *end_time);
88 
89 
90 #ifdef __cplusplus
91 }
92 #endif
93 
94 #endif /* end of MS_TASK_H */
95