Commit 12b9882a authored by Vysheng's avatar Vysheng

fixed binlog problems. Set lock on binlog

parent 8bc40adf
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
......@@ -1024,7 +1025,7 @@ void replay_log_event (void) {
rptr = in_ptr;
break;
default:
logprintf ("Unknown logevent [0x%08x] 0x%08x [0x%08x]\n", *(rptr - 1), op, *(rptr + 1));
logprintf ("Unknown logevent [0x%08x] 0x%08x [0x%08x] at %lld\n", *(rptr - 1), op, *(rptr + 1), binlog_pos);
assert (0);
}
......@@ -1075,8 +1076,8 @@ void replay_log (void) {
} else {
int x = wptr - rptr;
memcpy (binlog_buffer, rptr, 4 * x);
wptr -= x;
rptr -= x;
wptr -= (rptr - binlog_buffer);
rptr = binlog_buffer;
}
int l = (binlog_buffer + BINLOG_BUFFER_SIZE - wptr) * 4;
int k = read (fd, wptr, l);
......@@ -1103,7 +1104,12 @@ void write_binlog (void) {
perror ("binlog open");
exit (2);
}
lseek (binlog_fd, 0, SEEK_END);
assert (lseek (binlog_fd, binlog_pos, SEEK_SET) == binlog_pos);
if (flock (binlog_fd, LOCK_EX | LOCK_NB) < 0) {
perror ("get lock");
exit (2);
}
}
void add_log_event (const int *data, int len) {
......
# This is my real config
# Feel free to edit it
# This is an empty config file
# Feel free to put something here
default_profile = "tele2";
default_profile = "binlog";
mts = {
test_dc1 = {
config_directory = ".telegram/test_dc1";
test = true;
msg_num = true;
binlog_enabled = true;
};
binlog = {
config_directory = ".telegram/binlog";
test = false;
config_directory = ".telegram/mts";
msg_num = true;
binlog_enabled = true;
log_level = 2;
};
tele2 = {
binlog_mts = {
config_directory = ".telegram/binlog_mts";
test = false;
msg_num = true;
binlog_enabled = true;
log_level = 2;
};
mega = {
config_directory = ".telegram/mega";
test = false;
msg_num = true;
binlog_enabled = true;
log_level = 2;
};
new = {
config_directory = ".telegram/new";
test = false;
msg_num = true;
};
production = {
config_directory = ".telegram/production";
test = false;
config_directory = ".telegram/tele2";
msg_num = true;
};
test = {
test = true;
config_directory = ".telegram/test";
test = true;
msg_num = true;
};
test1 = {
config_directory = ".telegram/test1";
msg_num = true;
binlog_enabled = true;
};
test2 = {
config_directory = ".telegram/test2";
msg_num = true;
binlog_enabled = true;
};
......@@ -77,6 +77,7 @@ char *config_directory;
char *binlog_file_name;
int binlog_enabled;
extern int log_level;
int sync_from_start;
void set_default_username (const char *s) {
if (default_username) {
......@@ -315,7 +316,7 @@ extern int default_dc_num;
int register_mode;
void args_parse (int argc, char **argv) {
int opt = 0;
while ((opt = getopt (argc, argv, "u:hk:vn:Nc:p:l:R")) != -1) {
while ((opt = getopt (argc, argv, "u:hk:vn:Nc:p:l:Rf")) != -1) {
switch (opt) {
case 'u':
set_default_username (optarg);
......@@ -342,6 +343,9 @@ void args_parse (int argc, char **argv) {
case 'R':
register_mode = 1;
break;
case 'f':
sync_from_start = 1;
break;
case 'h':
default:
usage ();
......
......@@ -64,6 +64,7 @@ long long cur_downloading_bytes;
long long cur_downloaded_bytes;
extern int binlog_enabled;
extern int sync_from_start;
void out_peer_id (peer_id_t id);
#define QUERY_TIMEOUT 6.0
......@@ -2218,6 +2219,14 @@ BN_CTX *ctx;
void do_send_accept_encr_chat (struct secret_chat *E, unsigned char *random) {
int i;
int ok = 0;
for (i = 0; i < 64; i++) {
if (E->key[i]) {
ok = 1;
break;
}
}
if (ok) { return; } // Already generated key for this chat
for (i = 0; i < 64; i++) {
*(((int *)random) + i) ^= mrand48 ();
}
......@@ -2521,7 +2530,10 @@ void do_get_difference (void) {
difference_got = 0;
clear_packet ();
do_insert_header ();
if (seq > 0) {
if (seq > 0 || sync_from_start) {
if (pts == 0) { pts = 1; }
if (qts == 0) { qts = 1; }
if (last_date == 0) { last_date = 1; }
out_int (CODE_updates_get_difference);
out_int (pts);
out_int (last_date);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment