42
42
Name : "cortex_ingester_received_files" ,
43
43
Help : "The total number of files received by this ingester whilst joining" ,
44
44
})
45
+ receivedBytes = prometheus .NewCounter (prometheus.CounterOpts {
46
+ Name : "cortex_ingester_received_bytes_total" ,
47
+ Help : "The total number of bytes received by this ingester whilst joining" ,
48
+ })
49
+ sentBytes = prometheus .NewCounter (prometheus.CounterOpts {
50
+ Name : "cortex_ingester_sent_bytes_total" ,
51
+ Help : "The total number of bytes sent by this ingester whilst leaving" ,
52
+ })
45
53
46
54
once * sync.Once
47
55
)
@@ -51,7 +59,9 @@ func init() {
51
59
prometheus .MustRegister (sentChunks )
52
60
prometheus .MustRegister (receivedChunks )
53
61
prometheus .MustRegister (sentFiles )
62
+ prometheus .MustRegister (receivedBytes )
54
63
prometheus .MustRegister (receivedFiles )
64
+ prometheus .MustRegister (sentBytes )
55
65
}
56
66
57
67
// TransferChunks receives all the chunks from another ingester.
@@ -208,6 +218,20 @@ func (i *Ingester) TransferTSDB(stream client.Ingester_TransferTSDBServer) error
208
218
fromIngesterID := ""
209
219
210
220
xfer := func () error {
221
+
222
+ // Validate the final directory is empty, if it exists and is empty delete it so a move can succeed
223
+ err := removeEmptyDir (i .cfg .TSDBConfig .Dir )
224
+ if err != nil {
225
+ return errors .Wrap (err , "remove existing TSDB directory" )
226
+ }
227
+
228
+ tmpDir , err := ioutil .TempDir ("" , "tsdb_xfer" )
229
+ if err != nil {
230
+ return err
231
+ }
232
+ defer os .RemoveAll (tmpDir )
233
+
234
+ bytesXfer := 0
211
235
filesXfer := 0
212
236
213
237
files := make (map [string ]* os.File )
@@ -236,15 +260,14 @@ func (i *Ingester) TransferTSDB(stream client.Ingester_TransferTSDBServer) error
236
260
return errors .Wrap (err , "TransferTSDB: checkFromIngesterIsInLeavingState" )
237
261
}
238
262
}
239
- filesXfer ++
263
+ bytesXfer += len ( f . Data )
240
264
241
- // TODO(thor) To avoid corruption from errors, it's probably best to write to a temp dir, and then move that to the final location
242
265
createfile := func (f * client.TimeSeriesFile ) (* os.File , error ) {
243
- dir := filepath .Join (i . cfg . TSDBConfig . Dir , filepath .Dir (f .Filename ))
266
+ dir := filepath .Join (tmpDir , filepath .Dir (f .Filename ))
244
267
if err := os .MkdirAll (dir , 0777 ); err != nil {
245
268
return nil , errors .Wrap (err , "TransferTSDB: MkdirAll" )
246
269
}
247
- file , err := os .Create (filepath .Join (i . cfg . TSDBConfig . Dir , f .Filename ))
270
+ file , err := os .Create (filepath .Join (tmpDir , f .Filename ))
248
271
if err != nil {
249
272
return nil , errors .Wrap (err , "TransferTSDB: Create" )
250
273
}
@@ -260,7 +283,7 @@ func (i *Ingester) TransferTSDB(stream client.Ingester_TransferTSDBServer) error
260
283
if err != nil {
261
284
return err
262
285
}
263
-
286
+ filesXfer ++
264
287
files [f .Filename ] = file
265
288
} else {
266
289
@@ -275,10 +298,12 @@ func (i *Ingester) TransferTSDB(stream client.Ingester_TransferTSDBServer) error
275
298
return errors .Wrap (err , "TransferTSDB: ClaimTokensFor" )
276
299
}
277
300
301
+ receivedBytes .Add (float64 (bytesXfer ))
278
302
receivedFiles .Add (float64 (filesXfer ))
279
- level .Error (util .Logger ).Log ("msg" , "Total files xfer" , "from_ingester" , fromIngesterID , "num " , filesXfer )
303
+ level .Info (util .Logger ).Log ("msg" , "Total xfer" , "from_ingester" , fromIngesterID , "files " , filesXfer , "bytes" , bytesXfer )
280
304
281
- return nil
305
+ // Move the tmpdir to the final location
306
+ return os .Rename (tmpDir , i .cfg .TSDBConfig .Dir )
282
307
}
283
308
284
309
if err := i .transfer (stream .Context (), xfer ); err != nil {
@@ -644,6 +669,7 @@ func batchSend(batch int, b []byte, stream client.Ingester_TransferTSDBClient, t
644
669
if err != nil {
645
670
return err
646
671
}
672
+ sentBytes .Add (float64 (len (tsfile .Data )))
647
673
}
648
674
649
675
// Send final data
@@ -653,7 +679,19 @@ func batchSend(batch int, b []byte, stream client.Ingester_TransferTSDBClient, t
653
679
if err != nil {
654
680
return err
655
681
}
682
+ sentBytes .Add (float64 (len (tsfile .Data )))
656
683
}
657
684
658
685
return nil
659
686
}
687
+
688
+ func removeEmptyDir (dir string ) error {
689
+ if _ , err := os .Stat (dir ); err != nil {
690
+ if os .IsNotExist (err ) {
691
+ return nil
692
+ }
693
+ return err
694
+ }
695
+
696
+ return os .Remove (dir )
697
+ }
0 commit comments