forked from alibaba/nginx-tfs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathngx_tfs_common.h
268 lines (192 loc) · 8.72 KB
/
ngx_tfs_common.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
/*
* Copyright (C) 2010-2012 Alibaba Group Holding Limited
*/
#ifndef _NGX_HTTP_TFS_COMMON_H_INCLUDED_
#define _NGX_HTTP_TFS_COMMON_H_INCLUDED_
#include <ngx_core.h>
#include <ngx_http.h>
#define NGX_HTTP_TFS_HEADER 0
#define NGX_HTTP_TFS_BODY 1
#define NGX_HTTP_TFS_METASERVER_COUNT 10240
#define NGX_HTTP_TFS_YES 1
#define NGX_HTTP_TFS_NO 0
#define NGX_HTTP_TFS_AGAIN -20
#define NGX_HTTP_TFS_NGINX_APPKEY "tfs"
#define NGX_HTTP_TFS_DEFAULT_APPID 1
#define NGX_HTTP_TFS_RCS_LOCK_FILE "nginx_rcs.lock"
#define NGX_HTTP_TFS_MD5_RESULT_LEN 16
#define NGX_HTTP_TFS_DUPLICATE_KEY_SIZE (sizeof(uint32_t) + NGX_HTTP_TFS_MD5_RESULT_LEN)
#define NGX_HTTP_TFS_DUPLICATE_VALUE_BASE_SIZE sizeof(int32_t)
#define NGX_HTTP_TFS_DUPLICATE_INITIAL_MAGIC_VERSION 0x0fffffff
#define NGX_HTTP_TFS_SERVER_COUNT 5 /* rcs, ns, ds, rs, ms */
#define NGX_HTTP_TFS_TAIR_SERVER_ADDR_PART_COUNT 3 /* master_conifg_server;slave_config_server;group */
#define NGX_HTTP_TFS_TAIR_CONFIG_SERVER_COUNT 2 /* master && slave */
#define NGX_HTTP_TFS_KEEPALIVE_ACTION "keepalive"
#define NGX_HTTP_TFS_MAX_READ_FILE_SIZE (512 * 1024)
#define NGX_HTTP_TFS_USE_LARGE_FILE_SIZE (15 * 1024 * 1024)
#define NGX_HTTP_TFS_MAX_SIZE (ULLONG_MAX - 1)
#define NGX_HTTP_TFS_ZERO_BUF_SIZE (512 * 1024)
#define NGX_HTTP_TFS_INIT_FILE_HOLE_COUNT 5
#define NGX_HTTP_TFS_APPEND_OFFSET -1
/* tfs file name standard name length */
#define NGX_HTTP_TFS_SMALL_FILE_KEY_CHAR 'T'
#define NGX_HTTP_TFS_LARGE_FILE_KEY_CHAR 'L'
#define NGX_HTTP_TFS_FILE_NAME_LEN 18
#define NGX_HTTP_TFS_FILE_NAME_BUFF_LEN 19
#define NGX_HTTP_TFS_FILE_NAME_EXCEPT_SUFFIX_LEN 12
#define NGX_HTTP_TFS_MAX_FILE_NAME_LEN 256
#define NGX_HTTP_TFS_MAX_SUFFIX_LEN 109 /* 128 - 19 */
#define NGX_HTTP_TFS_MAX_CLUSTER_COUNT 10
#define NGX_HTTP_TFS_MAX_CLUSTER_ID_COUNT 5
#define NGX_HTTP_TFS_CMD_GET_CLUSTER_ID_NS 20
#define NGX_HTTP_TFS_CMD_GET_GROUP_COUNT 22
#define NGX_HTTP_TFS_CMD_GET_GROUP_SEQ 23
#define NGX_HTTP_TFS_GMT_TIME_SIZE (sizeof("Mon, 28 Sep 1970 06:00:00 UTC+0800") - 1)
#define NGX_HTTP_TFS_MAX_FRAGMENT_SIZE (2 * 1024 * 1024)
#define NGX_HTTP_TFS_MAX_SEND_FRAG_COUNT 8
#define NGX_HTTP_TFS_MUR_HASH_SEED 97
#define NGX_HTTP_TFS_CLIENT_VERSION "NGINX"
#define NGX_HTTP_TFS_MIN_TIMER_DELAY 1000
#define NGX_HTTP_TFS_READ_STAT_NORMAL 0
#define NGX_HTTP_TFS_READ_STAT_FORCE 1
#define NGX_BSWAP_64(x) \
((((x) & 0xff00000000000000ull) >> 56) \
| (((x) & 0x00ff000000000000ull) >> 40) \
| (((x) & 0x0000ff0000000000ull) >> 24) \
| (((x) & 0x000000ff00000000ull) >> 8) \
| (((x) & 0x00000000ff000000ull) << 8) \
| (((x) & 0x0000000000ff0000ull) << 24) \
| (((x) & 0x000000000000ff00ull) << 40) \
| (((x) & 0x00000000000000ffull) << 56))
#define ngx_http_tfs_clear_buf(b) \
b->pos = b->start; \
b->last = b->start;
#if (NGX_HAVE_BIG_ENDIAN)
#define ngx_hton64(x) x
#define ngx_ntoh64(x) x
#else
#define ngx_hton64(x) \
NGX_BSWAP_64(x)
#define ngx_ntoh64(x) \
NGX_BSWAP_64(x)
#endif
typedef struct ngx_http_tfs_s ngx_http_tfs_t;
typedef struct ngx_http_tfs_peer_connection_s ngx_http_tfs_peer_connection_t;
typedef struct ngx_http_tfs_inet_s ngx_http_tfs_inet_t;
typedef struct ngx_http_tfs_meta_hh_s ngx_http_tfs_meta_hh_t;
typedef struct ngx_http_tfs_segment_data_s ngx_http_tfs_segment_data_t;
typedef struct {
uint64_t size;
} ngx_http_tfs_stat_info_t;
typedef struct {
uint32_t crc;
uint32_t data_crc;
} ngx_http_tfs_crc_t;
typedef struct {
uint16_t code;
ngx_str_t msg;
} ngx_http_tfs_action_t;
struct ngx_http_tfs_meta_hh_s {
uint64_t app_id;
uint64_t user_id;
};
struct ngx_http_tfs_inet_s {
uint32_t ip;
uint32_t port;
};
typedef struct {
ngx_http_tfs_inet_t table[NGX_HTTP_TFS_METASERVER_COUNT];
uint64_t version;
} ngx_http_tfs_meta_table_t;
typedef enum {
NGX_HTTP_TFS_RC_SERVER = 0,
NGX_HTTP_TFS_NAME_SERVER,
NGX_HTTP_TFS_DATA_SERVER,
NGX_HTTP_TFS_ROOT_SERVER,
NGX_HTTP_TFS_META_SERVER,
} ngx_http_tfs_peer_server_e;
typedef enum {
NGX_HTTP_TFS_STATE_WRITE_START = 0,
NGX_HTTP_TFS_STATE_WRITE_GET_META_TABLE,
NGX_HTTP_TFS_STATE_WRITE_CLUSTER_ID_MS,
NGX_HTTP_TFS_STATE_WRITE_CLUSTER_ID_NS,
NGX_HTTP_TFS_STATE_WRITE_GET_BLK_INFO,
NGX_HTTP_TFS_STATE_WRITE_STAT_DUP_FILE,
NGX_HTTP_TFS_STATE_WRITE_CREATE_FILE_NAME,
NGX_HTTP_TFS_STATE_WRITE_WRITE_DATA,
NGX_HTTP_TFS_STATE_WRITE_CLOSE_FILE,
NGX_HTTP_TFS_STATE_WRITE_WRITE_MS,
NGX_HTTP_TFS_STATE_WRITE_DONE,
} ngx_http_tfs_state_write_e;
typedef enum {
NGX_HTTP_TFS_STATE_READ_START = 0,
NGX_HTTP_TFS_STATE_READ_GET_META_TABLE,
NGX_HTTP_TFS_STATE_READ_GET_FRAG_INFO,
NGX_HTTP_TFS_STATE_READ_GET_BLK_INFO,
NGX_HTTP_TFS_STATE_READ_READ_DATA,
NGX_HTTP_TFS_STATE_READ_DONE,
} ngx_http_tfs_state_read_e;
typedef enum {
NGX_HTTP_TFS_STATE_REMOVE_START = 0,
NGX_HTTP_TFS_STATE_REMOVE_GET_META_TABLE,
NGX_HTTP_TFS_STATE_REMOVE_GET_FRAG_INFO,
NGX_HTTP_TFS_STATE_REMOVE_GET_GROUP_COUNT,
NGX_HTTP_TFS_STATE_REMOVE_GET_GROUP_SEQ,
NGX_HTTP_TFS_STATE_REMOVE_GET_BLK_INFO,
NGX_HTTP_TFS_STATE_REMOVE_STAT_FILE,
NGX_HTTP_TFS_STATE_REMOVE_READ_META_SEGMENT,
NGX_HTTP_TFS_STATE_REMOVE_DELETE_DATA,
NGX_HTTP_TFS_STATE_REMOVE_NOTIFY_MS,
NGX_HTTP_TFS_STATE_REMOVE_DONE,
} ngx_http_tfs_state_remove_e;
typedef enum {
NGX_HTTP_TFS_STATE_STAT_START = 0,
NGX_HTTP_TFS_STATE_STAT_GET_BLK_INFO,
NGX_HTTP_TFS_STATE_STAT_STAT_FILE,
NGX_HTTP_TFS_STATE_STAT_DONE,
} ngx_http_tfs_state_stat_e;
typedef enum {
NGX_HTTP_TFS_STATE_ACTION_START = 0,
NGX_HTTP_TFS_STATE_ACTION_GET_META_TABLE,
NGX_HTTP_TFS_STATE_ACTION_PROCESS,
NGX_HTTP_TFS_STATE_ACTION_DONE,
} ngx_http_tfs_state_action_e;
static inline uint32_t
ngx_http_tfs_crc(uint32_t crc, const char *data, size_t len)
{
size_t i;
for (i = 0; i < len; ++i) {
crc = (crc >> 8) ^ ngx_crc32_table256[(crc ^ *data++) & 0xff];
}
return crc;
}
ngx_chain_t *ngx_http_tfs_alloc_chains(ngx_pool_t *pool, size_t count);
void ngx_http_tfs_free_chains(ngx_chain_t **free, ngx_chain_t **out);
ngx_int_t ngx_http_tfs_test_connect(ngx_connection_t *c);
uint64_t ngx_http_tfs_generate_packet_id(void);
ngx_int_t ngx_http_tfs_parse_headerin(ngx_http_request_t *r,
ngx_str_t *header_name, ngx_str_t *value);
ngx_int_t ngx_http_tfs_compute_buf_crc(ngx_http_tfs_crc_t *t_crc, ngx_buf_t *b,
size_t size, ngx_log_t *log);
ngx_int_t ngx_http_tfs_peer_set_addr(ngx_pool_t *pool,
ngx_http_tfs_peer_connection_t *p, ngx_http_tfs_inet_t *addr);
uint32_t ngx_http_tfs_murmur_hash(u_char *data, size_t len);
ngx_int_t ngx_http_tfs_parse_inet(ngx_str_t *u, ngx_http_tfs_inet_t *addr);
int32_t ngx_http_tfs_raw_fsname_hash(const u_char *str, const int32_t len);
ngx_int_t ngx_http_tfs_get_local_ip(ngx_str_t device, struct sockaddr_in *addr);
ngx_buf_t *ngx_http_tfs_copy_buf_chain(ngx_pool_t *pool, ngx_chain_t *in);
ngx_int_t ngx_http_tfs_sum_md5(ngx_chain_t *body, u_char *md5_final, ssize_t *body_size, ngx_log_t *log);
u_char *ngx_http_tfs_time(u_char *buf, time_t t);
ngx_int_t ngx_http_tfs_status_message(ngx_buf_t *b, ngx_str_t *action, ngx_log_t *log);
ngx_int_t ngx_http_tfs_get_parent_dir(ngx_str_t *file_path, ngx_int_t *dir_level);
ngx_int_t ngx_http_tfs_set_output_file_name(ngx_http_tfs_t *t);
long long ngx_http_tfs_atoll(u_char *line, size_t n);
ngx_int_t ngx_http_tfs_atoull(u_char *line, size_t n, unsigned long long *value);
void *ngx_http_tfs_prealloc(ngx_pool_t *pool, void *p, size_t old_size, size_t new_size);
uint64_t ngx_http_tfs_get_chain_buf_size(ngx_chain_t *data);
void ngx_http_tfs_dump_segment_data(ngx_http_tfs_segment_data_t *segment, ngx_log_t *log);
ngx_http_tfs_t *ngx_http_tfs_alloc_st(ngx_http_tfs_t *t);
#define ngx_http_tfs_free_st(t) \
t->next = t->parent->free_sts; \
t->parent->free_sts = t; \
#endif /* _NGX_HTTP_TFS_COMMON_H_INCLUDED_ */