44
44
#include <errno.h>
45
45
#include <time.h>
46
46
#include <stdlib.h>
47
+ #include <glib/gprintf.h>
47
48
48
49
#include <iv.h>
49
50
50
- static inline const gchar *
51
+ static inline gint G_GNUC_PRINTF (2 , 3 )
52
+ _format_g_va_string (gchar * * strp , const gchar * format , ...)
53
+ {
54
+ va_list args ;
55
+
56
+ va_start (args , format ) ;
57
+ gint result = g_vasprintf (strp , format , args );
58
+ va_end (args );
59
+
60
+ return result ;
61
+ }
62
+
63
+ static const gchar *
51
64
_format_persist_name (const LogPipe * s )
52
65
{
53
66
const FileReader * self = (const FileReader * )s ;
54
67
guint name_hash = g_str_hash (self -> filename -> str );
55
- gchar persist_name [1024 ];
68
+ const gint max_persist_name_len = 1024 ;
69
+ gchar * persist_name = NULL ;
56
70
57
- /* same wildcard file sources even with persist-name defined can be the same
58
- file name hash is added as well to ensure uniquiness
71
+ /* same wildcard file sources even with persist-name defined can be the same, so
72
+ file name hash is added as well to ensure uniquiness always
73
+ also adding now the filename (or at least an end part of it) for debug aid purpose
59
74
*/
75
+ gint used_len ;
60
76
if (self -> owner -> super .super .persist_name )
77
+ used_len = _format_g_va_string (& persist_name , "%s.%s.%u.curpos" , self -> persist_name_prefix ,
78
+ self -> owner -> super .super .persist_name , name_hash );
79
+ else
80
+ used_len = _format_g_va_string (& persist_name , "%s.%u.curpos" , self -> persist_name_prefix , name_hash );
81
+ g_assert (used_len > 0 );
82
+
83
+ if (used_len < max_persist_name_len - 2 - 1 ) /* () and the terminating NUL */
61
84
{
62
- g_snprintf (persist_name , sizeof (persist_name ), "affile_sd.%s.%u.curpos" ,
63
- self -> owner -> super .super .persist_name , name_hash );
85
+ gchar * base_name = persist_name ;
86
+ gint filename_len = strlen (self -> filename -> str );
87
+ gint remaining_len = max_persist_name_len - used_len - 2 - 1 ; /* () and the terminating NUL */
88
+ persist_name = NULL ; /* glib requires the input ptr to be NULL otherwise returning with -1 from g_vasprintf */
89
+ _format_g_va_string (& persist_name , "%s(%s)" , base_name ,
90
+ self -> filename -> str + MAX (0 , filename_len - remaining_len ));
91
+ g_free (base_name );
64
92
}
65
- else
66
- g_snprintf (persist_name , sizeof (persist_name ), "affile_sd.%u.curpos" , name_hash );
67
93
68
- return g_strdup ( persist_name ) ;
94
+ return persist_name ;
69
95
}
70
96
71
- static const gchar *
97
+ static inline const gchar *
72
98
_generate_persist_name (const LogPipe * s )
73
99
{
74
100
FileReader * self = (FileReader * ) s ;
@@ -86,6 +112,40 @@ _generate_persist_name(const LogPipe *s)
86
112
return self -> persist_name ;
87
113
}
88
114
115
+ static inline const gchar *
116
+ _format_legacy_persist_name (const LogPipe * s )
117
+ {
118
+ const FileReader * self = (const FileReader * )s ;
119
+ static gchar persist_name [1024 ];
120
+
121
+ if (self -> owner -> super .super .persist_name )
122
+ g_snprintf (persist_name , sizeof (persist_name ), "affile_sd.%s.curpos" , self -> owner -> super .super .persist_name );
123
+ else
124
+ g_snprintf (persist_name , sizeof (persist_name ), "affile_sd_curpos(%s)" , self -> filename -> str );
125
+
126
+ return persist_name ;
127
+ }
128
+
129
+ static gboolean
130
+ _update_legacy_persist_name (FileReader * self )
131
+ {
132
+ GlobalConfig * cfg = log_pipe_get_config (& self -> super );
133
+
134
+ if (cfg -> state == NULL )
135
+ return TRUE;
136
+
137
+ const gchar * current_persist_name = _generate_persist_name (& self -> super );
138
+ const gchar * legacy_persist_name = _format_legacy_persist_name (& self -> super );
139
+
140
+ if (persist_state_entry_exists (cfg -> state , current_persist_name ))
141
+ return TRUE;
142
+
143
+ if (FALSE == persist_state_entry_exists (cfg -> state , legacy_persist_name ))
144
+ return TRUE;
145
+
146
+ return persist_state_copy_entry (cfg -> state , legacy_persist_name , current_persist_name );
147
+ }
148
+
89
149
static void
90
150
_recover_state (LogPipe * s , GlobalConfig * cfg , LogProtoServer * proto )
91
151
{
@@ -94,7 +154,7 @@ _recover_state(LogPipe *s, GlobalConfig *cfg, LogProtoServer *proto)
94
154
if (!self -> options -> restore_state )
95
155
return ;
96
156
97
- if (!log_proto_server_restart_with_state (proto , cfg -> state , _generate_persist_name (s )))
157
+ if (!log_proto_server_restart_with_state (proto , cfg -> state , log_pipe_get_persist_name (s )))
98
158
{
99
159
msg_error ("Error converting persistent state from on-disk format, losing file position information" ,
100
160
evt_tag_str ("filename" , self -> filename -> str ));
@@ -430,6 +490,8 @@ file_reader_queue_method(LogPipe *s, LogMessage *msg, const LogPathOptions *path
430
490
gboolean
431
491
file_reader_init_method (LogPipe * s )
432
492
{
493
+ _update_legacy_persist_name ((FileReader * )s );
494
+
433
495
return _reader_open_file (s , TRUE);
434
496
}
435
497
456
518
file_reader_remove_persist_state (FileReader * self )
457
519
{
458
520
GlobalConfig * cfg = log_pipe_get_config (& self -> super );
459
- const gchar * old_persist_name = _generate_persist_name (& self -> super );
521
+ const gchar * old_persist_name = log_pipe_get_persist_name (& self -> super );
460
522
gchar * new_persist_name = g_strdup_printf ("%s_REMOVED" , old_persist_name );
461
523
/* This is required to clean the persist entry from file during restart */
462
524
persist_state_remove_entry (cfg -> state , old_persist_name );
@@ -482,7 +544,8 @@ file_reader_cue_buffer_flush(FileReader *self)
482
544
void
483
545
file_reader_init_instance (FileReader * self , const gchar * filename ,
484
546
FileReaderOptions * options , FileOpener * opener ,
485
- LogSrcDriver * owner , GlobalConfig * cfg )
547
+ LogSrcDriver * owner , GlobalConfig * cfg ,
548
+ const gchar * persist_name_prefix )
486
549
{
487
550
log_pipe_init_instance (& self -> super , cfg );
488
551
self -> super .init = file_reader_init_method ;
@@ -491,6 +554,7 @@ file_reader_init_instance (FileReader *self, const gchar *filename,
491
554
self -> super .notify = file_reader_notify_method ;
492
555
self -> super .free_fn = file_reader_free_method ;
493
556
self -> super .generate_persist_name = _generate_persist_name ;
557
+ self -> persist_name_prefix = persist_name_prefix ;
494
558
self -> filename = g_string_new (filename );
495
559
self -> options = options ;
496
560
self -> opener = opener ;
@@ -504,7 +568,7 @@ file_reader_new(const gchar *filename, FileReaderOptions *options, FileOpener *o
504
568
{
505
569
FileReader * self = g_new0 (FileReader , 1 );
506
570
507
- file_reader_init_instance (self , filename , options , opener , owner , cfg );
571
+ file_reader_init_instance (self , filename , options , opener , owner , cfg , "affile_sd" );
508
572
return self ;
509
573
}
510
574
0 commit comments