-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathcou.c
More file actions
159 lines (147 loc) · 4.85 KB
/
Copy pathcou.c
File metadata and controls
159 lines (147 loc) · 4.85 KB
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
#include"system.h"
#include"cou.h"
extern db_server DBServer;
void db_cou_lock(int index)
{
unsigned char expected = 0;
while(!__atomic_compare_exchange_1(DBServer.couInfo.db_cou_access + index,&expected,
1,0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST)){
expected = 0;
}
}
void db_cou_unlock(int index)
{
__atomic_store_n(DBServer.couInfo.db_cou_access+index,0,__ATOMIC_SEQ_CST);
}
int db_cou_init(void *cou_info, size_t db_size)
{
db_cou_infomation *info;
info = cou_info;
info->db_size = db_size;
if (NULL == (info->db_cou_primary =
(char *) numa_alloc_onnode(DBServer.unitSize * db_size , 1))) {
perror("db_cou_primary malloc error");
return -1;
}
memset(info->db_cou_primary, 'S', DBServer.unitSize * db_size);
if (NULL == (info->db_cou_shandow =
(char *) numa_alloc_onnode(DBServer.unitSize * db_size , 1))) {
perror("db_cou_shandow malloc error");
return -1;
}
memset(info->db_cou_shandow, 'S', DBServer.unitSize * db_size);
if (NULL == (info->db_cou_curBA =
(unsigned char *) numa_alloc_onnode(db_size , 1))) {
perror("db_cou_bitarray malloc error");
return -1;
}
if (NULL == (info->db_cou_chgBA =
(unsigned char *) numa_alloc_onnode(db_size , 1))) {
perror("db_cou_bitarray malloc error");
return -1;
}
if (NULL == (info->db_cou_preBA =
(unsigned char *) numa_alloc_onnode(db_size , 1))) {
perror("db_cou_bitarray malloc error");
return -1;
}
memset(info->db_cou_curBA, 0, db_size);
memset(info->db_cou_preBA, 0, db_size);
memset(info->db_cou_chgBA, 0, db_size);
info->db_cou_access = numa_alloc_onnode(db_size , 1);
memset(info->db_cou_access,0,db_size);
info->db_cou_lock = UNLOCK;
return 0;
}
void* cou_read(size_t index)
{
void *result;
if (index > DBServer.dbSize)
index = index % DBServer.dbSize;
result = (DBServer.couInfo).db_cou_primary + index * DBServer.unitSize;
return result;
}
int cou_write(size_t index, void *value)
{
index = index % DBServer.dbSize;
db_lock( &(DBServer.couInfo.db_cou_lock));
if ( !DBServer.couInfo.db_cou_curBA[index]){
db_cou_lock(index);
if ( DBServer.couInfo.db_cou_chgBA[index])
memcpy(DBServer.couInfo.db_cou_shandow + index * DBServer.unitSize,value,4);
DBServer.couInfo.db_cou_curBA[index] = 1;
db_cou_unlock(index);
}
memcpy(DBServer.couInfo.db_cou_primary + index * DBServer.unitSize,value,4);
db_unlock( &(DBServer.couInfo.db_cou_lock));
return 0;
}
void ckp_cou(int ckp_order, void *cou_info)
{
int ckp_fd;
char ckp_name[32];
size_t i;
size_t db_size;
db_cou_infomation *info;
long long timeStart;
long long timeEnd;
static int times = 0;
info = cou_info;
sprintf(ckp_name, "./ckp_backup/dump_%d", ckp_order);
if (-1 == (ckp_fd = open(ckp_name, O_WRONLY | O_TRUNC | O_SYNC | O_CREAT, 666))) {
perror("checkpoint file open error,checkout if the ckp_backup directory is exist");
return;
}
db_size = info->db_size;
//pthread_spin_lock( &(DBServer.presync) );
db_lock(&(DBServer.pre_lock));
timeStart = get_ntime();
db_lock( &(DBServer.couInfo.db_cou_lock));
for (i = 0; i < db_size; i++) {
info->db_cou_chgBA[i] = info->db_cou_curBA[i] | info->db_cou_preBA[i];
info->db_cou_preBA[i] = info->db_cou_curBA[i];
info->db_cou_curBA[i] = 1;
}
db_unlock( &(DBServer.couInfo.db_cou_lock));
timeEnd = get_ntime();
//pthread_spin_unlock( &(DBServer.presync) );
db_unlock(&(DBServer.pre_lock));
add_prepare_log(&DBServer,timeEnd - timeStart);
#ifndef OFF_DUMP
timeStart = get_utime();
if ( !times){
writeLarge(ckp_fd, info->db_cou_shandow, (size_t)DBServer.unitSize * db_size , (size_t)DBServer.unitSize);
times++;
}else{
for (i = 0;i < db_size; i ++){
if (info->db_cou_chgBA[i]){
db_cou_lock(i);
if (info->db_cou_curBA[i]){
write(ckp_fd, info->db_cou_shandow + (size_t)i * DBServer.unitSize,(size_t)DBServer.unitSize);
lseek(ckp_fd, 0, SEEK_END);
db_cou_unlock(i);
}else{
write(ckp_fd, info->db_cou_primary + (size_t)i * DBServer.unitSize,(size_t)DBServer.unitSize);
lseek(ckp_fd, 0, SEEK_END);
db_cou_unlock(i);
}
}
}
}
#endif
fsync(ckp_fd);
close(ckp_fd);
timeEnd = get_utime();
add_overhead_log(&DBServer,timeEnd - timeStart);
}
void db_cou_destroy(void *cou_info)
{
db_cou_infomation *info;
info = cou_info;
numa_free(info->db_cou_chgBA , info->db_size);
numa_free(info->db_cou_curBA , info->db_size);
numa_free(info->db_cou_preBA , info->db_size);
numa_free(info->db_cou_shandow , DBServer.unitSize * info->db_size);
numa_free(info->db_cou_primary , DBServer.unitSize * info->db_size);
numa_free(info->db_cou_access , info->db_size);
}