openc3 5.1.0 → 5.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of openc3 might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: afcf1342f6607ba15d11c94601916717928eda05dfcb845afabd3e81e77bbdd0
4
- data.tar.gz: 95b2f282fd4253019e42ae0ae785906ade6f4910e6f0860279beef3c967cecbd
3
+ metadata.gz: fa2f9aabf07f0b9c9237f2f44644c8da055ca3069d46399db837b3b9bb22fdb3
4
+ data.tar.gz: 16afda4302a384d554872ff416ba76f3c822cf36f986687256f71e6c2e729370
5
5
  SHA512:
6
- metadata.gz: 8bd2a2fd4f3db741d0de89627ff45910a99c6464e8c9b8308e0c6926af9ac1569680a3456dc50b8163e806938c7707336475754f2219aa6e9b553dcab86870cd
7
- data.tar.gz: 539582ced510f20b5770d99d02a885b9ad19bc923e65fc46c6ed602cb6ddec1b948859ae07389da603a5a9af7fcef001099438428d2cb3265f0be4aec939078e
6
+ metadata.gz: 394108166336ca206f0d56caa9d805e3c694a8c80b47915e3552fab228e8a9418bb61bd616ac897127e01b920d7da28d7e3c2bb0673e3e28e45283f44d0c9eda
7
+ data.tar.gz: ce284cea11dc3bf1c788cb89bfced3ff783b892902ec0f0dcc1922ba6edffda0ef9fe0bc5ef358fec95949e15425f8241e66a36f7a5f9472a39167e0cc4f9b53
@@ -17,11 +17,12 @@
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
- # This file may also be used under the terms of a commercial license
20
+ # This file may also be used under the terms of a commercial license
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  require 'json'
24
24
  require 'date'
25
+ require 'openc3/core_ext/string'
25
26
 
26
27
  class Object
27
28
  def as_json(options = nil) #:nodoc:
@@ -57,10 +58,11 @@ class String
57
58
  NON_ASCII_PRINTABLE = /[^\x21-\x7e\s]/
58
59
 
59
60
  def as_json(options = nil)
60
- if NON_ASCII_PRINTABLE.match?(self)
61
- self.to_json_raw_object
61
+ as_utf8 = self.dup.force_encoding('UTF-8')
62
+ if as_utf8.valid_encoding?
63
+ return as_utf8
62
64
  else
63
- self
65
+ return self.to_json_raw_object
64
66
  end
65
67
  end #:nodoc:
66
68
  end
@@ -45,6 +45,7 @@ module OpenC3
45
45
  cycle_size = 1_000_000_000,
46
46
  cycle_hour = nil,
47
47
  cycle_minute = nil,
48
+ enforce_time_order = true,
48
49
  buffer_depth = 10
49
50
  )
50
51
  super(
@@ -54,7 +55,8 @@ module OpenC3
54
55
  cycle_time,
55
56
  cycle_size,
56
57
  cycle_hour,
57
- cycle_minute
58
+ cycle_minute,
59
+ enforce_time_order
58
60
  )
59
61
  @buffer_depth = Integer(buffer_depth)
60
62
  @buffer = []
@@ -99,7 +99,8 @@ module OpenC3
99
99
  cycle_time = nil,
100
100
  cycle_size = 1000000000,
101
101
  cycle_hour = nil,
102
- cycle_minute = nil
102
+ cycle_minute = nil,
103
+ enforce_time_order = true
103
104
  )
104
105
  @remote_log_directory = remote_log_directory
105
106
  @logging_enabled = ConfigParser.handle_true_false(logging_enabled)
@@ -114,6 +115,7 @@ module OpenC3
114
115
  @cycle_hour = Integer(@cycle_hour) if @cycle_hour
115
116
  @cycle_minute = ConfigParser.handle_nil(cycle_minute)
116
117
  @cycle_minute = Integer(@cycle_minute) if @cycle_minute
118
+ @enforce_time_order = ConfigParser.handle_true_false(enforce_time_order)
117
119
  @mutex = Mutex.new
118
120
  @file = nil
119
121
  @file_size = 0
@@ -284,7 +286,7 @@ module OpenC3
284
286
  elsif @cycle_size and ((@file_size + data_length) > @cycle_size)
285
287
  Logger.debug("Log writer start new file due to cycle size #{@cycle_size}")
286
288
  start_new_file()
287
- elsif @previous_time_nsec_since_epoch and (@previous_time_nsec_since_epoch > time_nsec_since_epoch)
289
+ elsif @enforce_time_order and @previous_time_nsec_since_epoch and (@previous_time_nsec_since_epoch > time_nsec_since_epoch)
288
290
  Logger.debug("Log writer start new file due to out of order time: #{Time.from_nsec_from_epoch(@previous_time_nsec_since_epoch)} #{Time.from_nsec_from_epoch(time_nsec_since_epoch)}")
289
291
  start_new_file()
290
292
  end
@@ -297,7 +299,7 @@ module OpenC3
297
299
  # to keep a full file's worth of data in the stream. This is what prevents continuous stream growth.
298
300
  # Returns thread that moves log to bucket
299
301
  def close_file(take_mutex = true)
300
- thread = nil
302
+ threads = []
301
303
  @mutex.lock if take_mutex
302
304
  begin
303
305
  if @file
@@ -306,7 +308,7 @@ module OpenC3
306
308
  Logger.debug "Log File Closed : #{@filename}"
307
309
  date = first_timestamp[0..7] # YYYYMMDD
308
310
  bucket_key = File.join(@remote_log_directory, date, bucket_filename())
309
- thread = BucketUtilities.move_log_file_to_bucket(@filename, bucket_key)
311
+ threads << BucketUtilities.move_log_file_to_bucket(@filename, bucket_key)
310
312
  # Now that the file is in storage, trim the Redis stream after a delay
311
313
  @cleanup_offsets << {}
312
314
  @last_offsets.each do |redis_topic, last_offset|
@@ -325,7 +327,7 @@ module OpenC3
325
327
  ensure
326
328
  @mutex.unlock if take_mutex
327
329
  end
328
- return thread
330
+ return threads
329
331
  end
330
332
 
331
333
  def bucket_filename
@@ -53,7 +53,8 @@ module OpenC3
53
53
  cycle_time = nil,
54
54
  cycle_size = 1_000_000_000,
55
55
  cycle_hour = nil,
56
- cycle_minute = nil
56
+ cycle_minute = nil,
57
+ enforce_time_order = true
57
58
  )
58
59
  super(
59
60
  remote_log_directory,
@@ -61,7 +62,8 @@ module OpenC3
61
62
  cycle_time,
62
63
  cycle_size,
63
64
  cycle_hour,
64
- cycle_minute
65
+ cycle_minute,
66
+ enforce_time_order
65
67
  )
66
68
  @label = label
67
69
  @index_file = nil
@@ -148,7 +150,7 @@ module OpenC3
148
150
  write_entry(:OFFSET_MARKER, nil, nil, nil, nil, nil, last_offset + ',' + redis_topic, nil) if @file
149
151
  end
150
152
 
151
- threads << super(false)
153
+ threads.concat(super(false))
152
154
 
153
155
  if @index_file
154
156
  begin
@@ -79,8 +79,8 @@ module OpenC3
79
79
  rt_label = "#{scope}__#{target_name}__ALL__rt__#{type}"
80
80
  stored_label = "#{scope}__#{target_name}__ALL__stored__#{type}"
81
81
  @plws[target_name] ||= {
82
- :RT => BufferedPacketLogWriter.new(remote_log_directory, rt_label, true, @cycle_time, @cycle_size, nil, nil, @buffer_depth),
83
- :STORED => BufferedPacketLogWriter.new(remote_log_directory, stored_label, true, @cycle_time, @cycle_size, nil, nil, @buffer_depth)
82
+ :RT => BufferedPacketLogWriter.new(remote_log_directory, rt_label, true, @cycle_time, @cycle_size, nil, nil, true, @buffer_depth),
83
+ :STORED => BufferedPacketLogWriter.new(remote_log_directory, stored_label, true, @cycle_time, @cycle_size, nil, nil, true, @buffer_depth)
84
84
  }
85
85
  end
86
86
  end
@@ -208,7 +208,7 @@ module OpenC3
208
208
  # 20220101204857274290500__20220101205857276524900__DEFAULT__INST__ALL__rt__reduced_minute.bin
209
209
  remote_log_directory = "#{scope}/reduced_#{type}_logs/tlm/#{target_name}"
210
210
  label = "#{scope}__#{target_name}__ALL__#{rt_or_stored}__reduced_#{type}"
211
- plw = BufferedPacketLogWriter.new(remote_log_directory, label, true, nil, 1_000_000_000, nil, nil, @buffer_depth)
211
+ plw = BufferedPacketLogWriter.new(remote_log_directory, label, true, nil, 1_000_000_000, nil, nil, true, @buffer_depth)
212
212
  @packet_logs["#{scope}__#{target_name}__#{rt_or_stored}__#{type}"] = plw
213
213
  end
214
214
 
@@ -17,7 +17,7 @@
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
- # This file may also be used under the terms of a commercial license
20
+ # This file may also be used under the terms of a commercial license
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  require 'openc3/microservices/microservice'
@@ -44,36 +44,35 @@ module OpenC3
44
44
  end
45
45
 
46
46
  def run
47
- tlws = setup_tlws
47
+ setup_tlws()
48
48
  while true
49
49
  break if @cancel_thread
50
50
 
51
51
  Topic.read_topics(@topics) do |topic, msg_id, msg_hash, redis|
52
52
  break if @cancel_thread
53
53
 
54
- log_data(tlws, topic, msg_id, msg_hash, redis)
54
+ log_data(topic, msg_id, msg_hash, redis)
55
55
  end
56
56
  end
57
57
  end
58
58
 
59
59
  def setup_tlws
60
- tlws = {}
60
+ @tlws = {}
61
61
  @topics.each do |topic|
62
62
  topic_split = topic.gsub(/{|}/, '').split("__") # Remove the redis hashtag curly braces
63
63
  scope = topic_split[0]
64
64
  log_name = topic_split[1]
65
65
  remote_log_directory = "#{scope}/text_logs/#{log_name}"
66
- tlws[topic] = TextLogWriter.new(remote_log_directory, true, @cycle_time, @cycle_size)
66
+ @tlws[topic] = TextLogWriter.new(remote_log_directory, true, @cycle_time, @cycle_size, nil, nil, false)
67
67
  end
68
- return tlws
69
68
  end
70
69
 
71
- def log_data(tlws, topic, msg_id, msg_hash, redis)
70
+ def log_data(topic, msg_id, msg_hash, redis)
72
71
  start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
73
72
  keys = msg_hash.keys
74
73
  keys.delete("time")
75
74
  entry = keys.reduce("") { |data, key| data + "#{key}: #{msg_hash[key]}\t" }
76
- tlws[topic].write(msg_hash["time"].to_i, entry, topic, msg_id)
75
+ @tlws[topic].write(msg_hash["time"].to_i, entry, topic, msg_id)
77
76
  @count += 1
78
77
  diff = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start # seconds as a float
79
78
  @metric.add_sample(name: "log_duration_seconds", value: diff, labels: {})
@@ -81,6 +80,19 @@ module OpenC3
81
80
  @error = err
82
81
  Logger.error("#{@name} error: #{err.formatted}")
83
82
  end
83
+
84
+ def shutdown
85
+ # Make sure all the existing logs are properly closed down
86
+ threads = []
87
+ @tlws.each do |topic, tlw|
88
+ threads.concat(tlw.shutdown)
89
+ end
90
+ # Wait for all the logging threads to move files to buckets
91
+ threads.flatten.compact.each do |thread|
92
+ thread.join
93
+ end
94
+ super()
95
+ end
84
96
  end
85
97
  end
86
98
 
@@ -1,14 +1,14 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- OPENC3_VERSION = '5.1.0'
3
+ OPENC3_VERSION = '5.1.1'
4
4
  module OpenC3
5
5
  module Version
6
6
  MAJOR = '5'
7
7
  MINOR = '1'
8
- PATCH = '0'
8
+ PATCH = '1'
9
9
  OTHER = ''
10
- BUILD = '7bd7fb9fdfa75abefb1b6ef01a55931c7b1d98dd'
10
+ BUILD = 'c94738fcddee73959df8a60ac8746ab38a16c17c'
11
11
  end
12
- VERSION = '5.1.0'
13
- GEM_VERSION = '5.1.0'
12
+ VERSION = '5.1.1'
13
+ GEM_VERSION = '5.1.1'
14
14
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openc3
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Melton
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-11-17 00:00:00.000000000 Z
12
+ date: 2022-11-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler