content_server 1.1.0 → 1.2.0
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.
- data/bin/backup_server +8 -20
- data/bin/content_server +8 -20
- data/bin/testing_memory +60 -0
- data/bin/testing_server +57 -0
- data/ext/run_in_background/mkrf_conf.rb +34 -0
- data/lib/content_data/content_data.rb +613 -0
- data/lib/content_data/version.rb +3 -0
- data/lib/content_data.rb +6 -0
- data/lib/content_server/backup_server.rb +65 -86
- data/lib/content_server/content_server.rb +47 -77
- data/lib/content_server/file_streamer.rb +27 -33
- data/lib/content_server/queue_copy.rb +154 -49
- data/lib/content_server/queue_indexer.rb +19 -11
- data/lib/content_server/remote_content.rb +41 -23
- data/lib/content_server/server.rb +91 -0
- data/lib/content_server/version.rb +1 -1
- data/lib/content_server.rb +0 -15
- data/lib/email/email.rb +87 -0
- data/lib/email/version.rb +3 -0
- data/lib/email.rb +4 -0
- data/lib/file_copy/copy.rb +68 -0
- data/lib/file_copy/version.rb +4 -0
- data/lib/file_copy.rb +4 -0
- data/lib/file_indexing/index_agent.rb +170 -0
- data/lib/file_indexing/indexer_patterns.rb +72 -0
- data/lib/file_indexing/version.rb +3 -0
- data/lib/file_indexing.rb +9 -0
- data/lib/file_monitoring/file_monitoring.rb +105 -0
- data/lib/file_monitoring/monitor_path.rb +304 -0
- data/lib/file_monitoring/version.rb +3 -0
- data/lib/file_monitoring.rb +29 -0
- data/lib/file_utils/file_generator/README +97 -0
- data/lib/file_utils/file_generator/file_generator.rb +156 -0
- data/lib/file_utils/file_utils.rb +260 -0
- data/lib/file_utils/version.rb +3 -0
- data/lib/file_utils.rb +4 -0
- data/lib/log/version.rb +3 -0
- data/lib/log.rb +188 -0
- data/lib/networking/tcp.rb +213 -0
- data/lib/networking/version.rb +3 -0
- data/lib/networking.rb +4 -0
- data/lib/params/version.rb +3 -0
- data/lib/params.rb +419 -0
- data/lib/process_monitoring/monitoring.rb +85 -0
- data/lib/process_monitoring/monitoring_info.rb +79 -0
- data/lib/process_monitoring/send_email.rb +40 -0
- data/lib/process_monitoring/thread_safe_hash.rb +77 -0
- data/lib/process_monitoring/version.rb +3 -0
- data/lib/process_monitoring.rb +6 -0
- data/lib/run_in_background/version.rb +3 -0
- data/lib/run_in_background.rb +432 -0
- data/lib/testing_memory/testing_memory.rb +187 -0
- data/lib/testing_server/testing_server.rb +236 -0
- data/lib/testing_server/version.rb +3 -0
- data/lib/testing_server.rb +12 -0
- data/lib/validations/index_validations.rb +106 -0
- data/lib/validations/version.rb +3 -0
- data/lib/validations.rb +4 -0
- data/spec/content_data/validations_spec.rb +113 -0
- data/spec/file_copy/copy_spec.rb +54 -0
- data/spec/file_indexing/index_agent_spec.rb +53 -0
- data/spec/networking/tcp_spec.rb +95 -0
- data/spec/validations/index_validations_spec.rb +77 -0
- data/test/content_data/content_data_test.rb +290 -0
- data/test/file_generator/file_generator_spec.rb +84 -0
- data/test/file_indexing/index_agent_test/New.txt +0 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/bin/libexslt.dll +0 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/bin/libxslt.dll +0 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/bin/xsltproc.exe +0 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libexslt/exslt.h +102 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libexslt/exsltconfig.h +73 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libexslt/exsltexports.h +140 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libexslt/libexslt.h +29 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/attributes.h +38 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/documents.h +93 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/extensions.h +262 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/extra.h +80 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/functions.h +78 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/imports.h +75 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/keys.h +53 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/libxslt.h +30 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/namespaces.h +68 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/numbersInternals.h +69 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/pattern.h +81 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/preproc.h +43 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/security.h +104 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/templates.h +77 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/transform.h +207 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/trio.h +216 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/triodef.h +220 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/variables.h +91 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/win32config.h +101 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/xslt.h +103 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/xsltInternals.h +1967 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/xsltconfig.h +172 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/xsltexports.h +142 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/xsltlocale.h +57 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/xsltutils.h +309 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/include/libxslt/xsltwin32config.h +105 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/lib/libexslt.lib +0 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/lib/libexslt_a.lib +0 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/lib/libxslt.lib +0 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/lib/libxslt_a.lib +0 -0
- data/test/file_indexing/index_agent_test/libxslt-1.1.26.win32/readme.txt +22 -0
- data/test/file_indexing/index_agent_test/patterns.input +3 -0
- data/test/file_indexing/index_agent_test.rb +51 -0
- data/test/file_monitoring/file_monitoring_test/conf.yml +4 -0
- data/test/file_monitoring/file_monitoring_test/conf_win32.yml +5 -0
- data/test/file_monitoring/file_monitoring_test/log +56 -0
- data/test/file_monitoring/file_monitoring_test.rb +0 -0
- data/test/file_monitoring/monitor_path_test/dir1000/test_file.1000 +1000 -0
- data/test/file_monitoring/monitor_path_test/dir1000/test_file.1000.0 +1000 -0
- data/test/file_monitoring/monitor_path_test/dir1000/test_file.1000.1 +1000 -0
- data/test/file_monitoring/monitor_path_test/dir1500/test_file.1500 +1500 -0
- data/test/file_monitoring/monitor_path_test/dir1500/test_file.1500.0 +1500 -0
- data/test/file_monitoring/monitor_path_test/dir1500/test_file.1500.1 +1500 -0
- data/test/file_monitoring/monitor_path_test/test_file.500 +500 -0
- data/test/file_monitoring/monitor_path_test/test_file.500.0 +500 -0
- data/test/file_monitoring/monitor_path_test/test_file.500.1 +500 -0
- data/test/file_monitoring/monitor_path_test.rb +153 -0
- data/test/file_utils/fileutil_mksymlink_test/dir1000/dir1500/test_file.1500 +1500 -0
- data/test/file_utils/fileutil_mksymlink_test/dir1000/dir1500/test_file.1500.0 +1500 -0
- data/test/file_utils/fileutil_mksymlink_test/dir1000/dir1500/test_file.1500.1 +1500 -0
- data/test/file_utils/fileutil_mksymlink_test/dir1000/test_file.1000 +1000 -0
- data/test/file_utils/fileutil_mksymlink_test/dir1000/test_file.1000.0 +1000 -0
- data/test/file_utils/fileutil_mksymlink_test/dir1000/test_file.1000.1 +1000 -0
- data/test/file_utils/fileutil_mksymlink_test/test_file.500 +500 -0
- data/test/file_utils/fileutil_mksymlink_test/test_file.500.0 +500 -0
- data/test/file_utils/fileutil_mksymlink_test/test_file.500.1 +500 -0
- data/test/file_utils/fileutil_mksymlink_test.rb +125 -0
- data/test/file_utils/time_modification_test.rb +132 -0
- data/test/params/params_spec.rb +280 -0
- data/test/params/params_test.rb +43 -0
- data/test/run_in_background/run_in_background_test.rb +122 -0
- data/test/run_in_background/test_app +57 -0
- metadata +272 -132
- data/lib/content_server/globals.rb +0 -10
|
@@ -7,9 +7,9 @@ require 'content_server/content_receiver'
|
|
|
7
7
|
require 'content_server/queue_indexer'
|
|
8
8
|
require 'content_server/queue_copy'
|
|
9
9
|
require 'content_server/remote_content'
|
|
10
|
+
require 'content_server/server'
|
|
10
11
|
require 'file_indexing'
|
|
11
12
|
require 'file_monitoring'
|
|
12
|
-
require 'content_server/globals'
|
|
13
13
|
require 'log'
|
|
14
14
|
require 'networking/tcp'
|
|
15
15
|
require 'params'
|
|
@@ -28,14 +28,6 @@ module ContentServer
|
|
|
28
28
|
[{'path'=>File.expand_path(''), 'scan_period'=>300, 'stable_state'=>1}],
|
|
29
29
|
'Backup server destination folder, default is the relative local folder.')
|
|
30
30
|
|
|
31
|
-
def self.tmp_content_data_file
|
|
32
|
-
@@tmp_content_data_file
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def self.local_dynamic_content_data
|
|
36
|
-
@@local_dynamic_content_data
|
|
37
|
-
end
|
|
38
|
-
|
|
39
31
|
def run_backup_server
|
|
40
32
|
Log.info('Start backup server')
|
|
41
33
|
Thread.abort_on_exception = true
|
|
@@ -44,11 +36,11 @@ module ContentServer
|
|
|
44
36
|
# create general tmp dir
|
|
45
37
|
FileUtils.mkdir_p(Params['tmp_path']) unless File.directory?(Params['tmp_path'])
|
|
46
38
|
# init tmp content data file
|
|
47
|
-
|
|
39
|
+
$tmp_content_data_file = File.join(Params['tmp_path'], 'backup.data')
|
|
48
40
|
|
|
49
41
|
if Params['enable_monitoring']
|
|
50
42
|
Log.info("Initializing monitoring of process params on port:#{Params['process_monitoring_web_port']}")
|
|
51
|
-
|
|
43
|
+
$process_vars.set('server_name', 'backup_server')
|
|
52
44
|
end
|
|
53
45
|
|
|
54
46
|
# # # # # # # # # # # #
|
|
@@ -62,16 +54,27 @@ module ContentServer
|
|
|
62
54
|
Log.info(" Path:'#{path['path']}'")
|
|
63
55
|
}
|
|
64
56
|
|
|
57
|
+
# initial global local content data object
|
|
58
|
+
$local_content_data_lock = Mutex.new
|
|
59
|
+
$local_content_data = ContentData::ContentData.new
|
|
60
|
+
|
|
65
61
|
# Read here for initial content data that exist from previous system run
|
|
66
|
-
initial_content_data = ContentData::ContentData.new
|
|
67
62
|
content_data_path = Params['local_content_data_path']
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
63
|
+
if File.exists?(content_data_path) and !File.directory?(content_data_path)
|
|
64
|
+
Log.info("reading initial content data that exist from previous system run from file:#{content_data_path}")
|
|
65
|
+
$local_content_data.from_file(content_data_path)
|
|
66
|
+
else
|
|
67
|
+
if File.directory?(content_data_path)
|
|
68
|
+
raise("Param:'local_content_data_path':'#{Params['local_content_data_path']}'cannot be a directory name")
|
|
69
|
+
end
|
|
70
|
+
# create directory if needed
|
|
71
|
+
dir = File.dirname(Params['local_content_data_path'])
|
|
72
|
+
FileUtils.mkdir_p(dir) unless File.exists?(dir)
|
|
73
|
+
end
|
|
72
74
|
|
|
75
|
+
Log.info("Init monitoring")
|
|
73
76
|
monitoring_events = Queue.new
|
|
74
|
-
fm = FileMonitoring::FileMonitoring.new(
|
|
77
|
+
fm = FileMonitoring::FileMonitoring.new()
|
|
75
78
|
fm.set_event_queue(monitoring_events)
|
|
76
79
|
# Start monitoring and writing changes to queue
|
|
77
80
|
all_threads << Thread.new do
|
|
@@ -81,36 +84,46 @@ module ContentServer
|
|
|
81
84
|
# # # # # # # # # # # # # #
|
|
82
85
|
# Initialize/Start local indexer
|
|
83
86
|
Log.debug1('Start indexer')
|
|
84
|
-
queue_indexer = QueueIndexer.new(monitoring_events
|
|
87
|
+
queue_indexer = QueueIndexer.new(monitoring_events)
|
|
85
88
|
# Start indexing on demand and write changes to queue
|
|
86
89
|
all_threads << queue_indexer.run
|
|
87
90
|
|
|
88
91
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
|
89
|
-
# Start dump local content data to file
|
|
90
|
-
Log.debug1('
|
|
92
|
+
# thread: Start dump local content data to file
|
|
93
|
+
Log.debug1('Init thread: flush local content data to file')
|
|
91
94
|
all_threads << Thread.new do
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
95
|
+
FileUtils.mkdir_p(Params['tmp_path']) unless File.directory?(Params['tmp_path'])
|
|
96
|
+
last_content_data_id = nil
|
|
97
|
+
loop{
|
|
98
|
+
sleep(Params['data_flush_delay'])
|
|
99
|
+
Log.info('Start flush local content data to file.')
|
|
100
|
+
$testing_memory_log.info('Start flush content data to file') if $testing_memory_log
|
|
101
|
+
written_to_file = false
|
|
102
|
+
$local_content_data_lock.synchronize{
|
|
103
|
+
local_content_data_unique_id = $local_content_data.unique_id
|
|
104
|
+
if (local_content_data_unique_id != last_content_data_id)
|
|
105
|
+
last_content_data_id = local_content_data_unique_id
|
|
106
|
+
$local_content_data.to_file($tmp_content_data_file)
|
|
107
|
+
written_to_file = true
|
|
108
|
+
else
|
|
109
|
+
Log.debug1('no need to flush. content data has not changed')
|
|
110
|
+
end
|
|
111
|
+
}
|
|
112
|
+
File.rename($tmp_content_data_file, Params['local_content_data_path']) if written_to_file
|
|
113
|
+
$testing_memory_log.info("End flush content data to file") if $testing_memory_log
|
|
114
|
+
}
|
|
103
115
|
end
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
116
|
+
|
|
117
|
+
#initialize global - remote content data
|
|
118
|
+
$remote_content_data_lock = Mutex.new
|
|
119
|
+
$remote_content_data = ContentData::ContentData.new
|
|
120
|
+
remote_content = ContentServer::RemoteContentClient.new(Params['content_server_hostname'],
|
|
107
121
|
Params['content_server_data_port'],
|
|
108
122
|
Params['backup_destination_folder'][0]['path'])
|
|
109
123
|
all_threads.concat(remote_content.run())
|
|
110
124
|
|
|
111
125
|
file_copy_client = FileCopyClient.new(Params['content_server_hostname'],
|
|
112
|
-
Params['content_server_files_port']
|
|
113
|
-
@@local_dynamic_content_data)
|
|
126
|
+
Params['content_server_files_port'])
|
|
114
127
|
all_threads.concat(file_copy_client.threads)
|
|
115
128
|
|
|
116
129
|
# Each
|
|
@@ -118,21 +131,21 @@ module ContentServer
|
|
|
118
131
|
all_threads << Thread.new do
|
|
119
132
|
loop do
|
|
120
133
|
sleep(Params['backup_check_delay'])
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
$local_content_data_lock.synchronize{
|
|
135
|
+
$remote_content_data_lock.synchronize{
|
|
136
|
+
diff = ContentData.remove($local_content_data, $remote_content_data)
|
|
137
|
+
unless diff.nil? || diff.empty?
|
|
138
|
+
Log.debug2("Backup content:\n#{$local_content_data}")
|
|
139
|
+
Log.debug2("Remote content:\n#{$remote_content_data}")
|
|
140
|
+
Log.debug2("Missing contents:\n#{diff}")
|
|
141
|
+
Log.info('Start sync check. Backup and remote contents need a sync, requesting copy files:')
|
|
142
|
+
file_copy_client.request_copy(diff)
|
|
143
|
+
else
|
|
144
|
+
Log.info("Start sync check. Local and remote contents are equal. No sync required.")
|
|
145
|
+
end
|
|
146
|
+
diff = ContentData::ContentData.new # to clear the memory
|
|
147
|
+
}
|
|
148
|
+
}
|
|
136
149
|
end
|
|
137
150
|
end
|
|
138
151
|
|
|
@@ -141,41 +154,7 @@ module ContentServer
|
|
|
141
154
|
if Params['enable_monitoring']
|
|
142
155
|
monitoring_info = MonitoringInfo::MonitoringInfo.new()
|
|
143
156
|
all_threads << Thread.new do
|
|
144
|
-
|
|
145
|
-
while true do
|
|
146
|
-
sleep(Params['process_vars_delay'])
|
|
147
|
-
::ContentServer::Globals.process_vars.set('time', Time.now)
|
|
148
|
-
Log.debug3("process_vars:monitoring queue size:#{monitoring_events.size}")
|
|
149
|
-
::ContentServer::Globals.process_vars.set('monitoring queue', monitoring_events.size)
|
|
150
|
-
#enable following line to see full list of object:count
|
|
151
|
-
#obj_array = ''
|
|
152
|
-
total_obj_count = 0
|
|
153
|
-
string_count = 0
|
|
154
|
-
file_count = 0
|
|
155
|
-
dir_count = 0
|
|
156
|
-
content_count = 0
|
|
157
|
-
mutex.synchronize do
|
|
158
|
-
ObjectSpace.each_object(Class) {|obj|
|
|
159
|
-
obj_count_per_class = ObjectSpace.each_object(obj).count
|
|
160
|
-
#enable following line to see full list of object:count
|
|
161
|
-
#obj_array = "#{obj_array} * #{obj.name}:#{obj_count_per_class}"
|
|
162
|
-
total_obj_count = total_obj_count + obj_count_per_class
|
|
163
|
-
}
|
|
164
|
-
string_count = ObjectSpace.each_object(String).count
|
|
165
|
-
file_count = ObjectSpace.each_object(::FileMonitoring::FileStat).count
|
|
166
|
-
dir_count = ObjectSpace.each_object(::FileMonitoring::DirStat).count
|
|
167
|
-
content_count = ObjectSpace.each_object(::ContentData::ContentData).count
|
|
168
|
-
end
|
|
169
|
-
#enable following line to see full list of object:count
|
|
170
|
-
#::ContentServer::Globals.process_vars.set('Live objs full', obj_array)
|
|
171
|
-
Log.debug3("process_vars:Live objs cnt:#{total_obj_count}")
|
|
172
|
-
::ContentServer::Globals.process_vars.set('Live objs cnt', total_obj_count)
|
|
173
|
-
Log.debug3("process_vars:Live String obj cnt:#{string_count}")
|
|
174
|
-
Log.debug3("process_vars:Live File obj cnt:#{file_count}")
|
|
175
|
-
Log.debug3("process_vars:Live Dir obj cnt:#{dir_count}")
|
|
176
|
-
Log.debug3("process_vars:Live Content data obj cnt:#{content_count}")
|
|
177
|
-
::ContentServer::Globals.process_vars.set('Live String obj cnt', string_count)
|
|
178
|
-
end
|
|
157
|
+
ContentServer.monitor_general_process_vars
|
|
179
158
|
end
|
|
180
159
|
end
|
|
181
160
|
|
|
@@ -9,7 +9,7 @@ require 'content_server/queue_copy'
|
|
|
9
9
|
require 'content_server/remote_content'
|
|
10
10
|
require 'file_indexing'
|
|
11
11
|
require 'file_monitoring'
|
|
12
|
-
require 'content_server/
|
|
12
|
+
require 'content_server/server'
|
|
13
13
|
require 'log'
|
|
14
14
|
require 'networking/tcp'
|
|
15
15
|
require 'params'
|
|
@@ -21,16 +21,6 @@ module ContentServer
|
|
|
21
21
|
# Content server specific flags.
|
|
22
22
|
Params.integer('local_files_port', 4444, 'Remote port in backup server to copy files')
|
|
23
23
|
Params.integer('local_content_data_port', 3333, 'Listen to incoming content data requests')
|
|
24
|
-
Params.string('local_server_name', `hostname`.strip, 'local server name')
|
|
25
|
-
Params.path('tmp_path', '~/.bbfs/tmp', 'tmp path for temporary files')
|
|
26
|
-
|
|
27
|
-
def self.tmp_content_data_file
|
|
28
|
-
@@tmp_content_data_file
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def self.local_dynamic_content_data
|
|
32
|
-
@@local_dynamic_content_data
|
|
33
|
-
end
|
|
34
24
|
|
|
35
25
|
def run_content_server
|
|
36
26
|
Log.info('Content server start')
|
|
@@ -39,11 +29,11 @@ module ContentServer
|
|
|
39
29
|
# create general tmp dir
|
|
40
30
|
FileUtils.mkdir_p(Params['tmp_path']) unless File.directory?(Params['tmp_path'])
|
|
41
31
|
# init tmp content data file
|
|
42
|
-
|
|
32
|
+
$tmp_content_data_file = File.join(Params['tmp_path'], 'content.data')
|
|
43
33
|
|
|
44
34
|
if Params['enable_monitoring']
|
|
45
35
|
Log.info("Initializing monitoring of process params on port:#{Params['process_monitoring_web_port']}")
|
|
46
|
-
|
|
36
|
+
$process_vars.set('server_name', 'content_server')
|
|
47
37
|
end
|
|
48
38
|
|
|
49
39
|
# # # # # # # # # # # #
|
|
@@ -54,16 +44,27 @@ module ContentServer
|
|
|
54
44
|
}
|
|
55
45
|
monitoring_events = Queue.new
|
|
56
46
|
|
|
47
|
+
# initial global local content data object
|
|
48
|
+
$local_content_data_lock = Mutex.new
|
|
49
|
+
$local_content_data = ContentData::ContentData.new
|
|
50
|
+
|
|
57
51
|
# Read here for initial content data that exist from previous system run
|
|
58
|
-
initial_content_data = ContentData::ContentData.new
|
|
59
52
|
content_data_path = Params['local_content_data_path']
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
53
|
+
if File.exists?(content_data_path) and !File.directory?(content_data_path)
|
|
54
|
+
Log.info("reading initial content data that exist from previous system run from file:#{content_data_path}")
|
|
55
|
+
$local_content_data.from_file(content_data_path)
|
|
56
|
+
else
|
|
57
|
+
if File.directory?(content_data_path)
|
|
58
|
+
raise("Param:'local_content_data_path':'#{Params['local_content_data_path']}'cannot be a directory name")
|
|
59
|
+
end
|
|
60
|
+
# create directory if needed
|
|
61
|
+
dir = File.dirname(Params['local_content_data_path'])
|
|
62
|
+
FileUtils.mkdir_p(dir) unless File.exists?(dir)
|
|
63
|
+
end
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
Log.info("Init monitoring")
|
|
66
|
+
monitoring_events = Queue.new
|
|
67
|
+
fm = FileMonitoring::FileMonitoring.new()
|
|
67
68
|
fm.set_event_queue(monitoring_events)
|
|
68
69
|
# Start monitoring and writing changes to queue
|
|
69
70
|
all_threads << Thread.new do
|
|
@@ -73,29 +74,38 @@ module ContentServer
|
|
|
73
74
|
# # # # # # # # # # # # # #
|
|
74
75
|
# Initialize/Start local indexer
|
|
75
76
|
Log.debug1('Start indexer')
|
|
76
|
-
queue_indexer = QueueIndexer.new(monitoring_events
|
|
77
|
+
queue_indexer = QueueIndexer.new(monitoring_events)
|
|
77
78
|
# Start indexing on demand and write changes to queue
|
|
78
79
|
all_threads << queue_indexer.run
|
|
79
80
|
|
|
80
81
|
# # # # # # # # # # # # # # # # # # # # # # # #
|
|
81
|
-
# Start dump local content data to file
|
|
82
|
-
Log.debug1('
|
|
82
|
+
# thread: Start dump local content data to file
|
|
83
|
+
Log.debug1('Init thread: flush local content data to file')
|
|
83
84
|
all_threads << Thread.new do
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
85
|
+
FileUtils.mkdir_p(Params['tmp_path']) unless File.directory?(Params['tmp_path'])
|
|
86
|
+
last_content_data_id = nil
|
|
87
|
+
loop{
|
|
88
|
+
sleep(Params['data_flush_delay'])
|
|
89
|
+
Log.info('Start flush local content data to file.')
|
|
90
|
+
$testing_memory_log.info('Start flush content data to file') if $testing_memory_log
|
|
91
|
+
written_to_file = false
|
|
92
|
+
$local_content_data_lock.synchronize{
|
|
93
|
+
local_content_data_unique_id = $local_content_data.unique_id
|
|
94
|
+
if (local_content_data_unique_id != last_content_data_id)
|
|
95
|
+
last_content_data_id = local_content_data_unique_id
|
|
96
|
+
$local_content_data.to_file($tmp_content_data_file)
|
|
97
|
+
written_to_file = true
|
|
98
|
+
else
|
|
99
|
+
Log.debug1('no need to flush. content data has not changed')
|
|
100
|
+
end
|
|
101
|
+
}
|
|
102
|
+
File.rename($tmp_content_data_file, Params['local_content_data_path']) if written_to_file
|
|
103
|
+
$testing_memory_log.info("End flush content data to file") if $testing_memory_log
|
|
104
|
+
}
|
|
95
105
|
end
|
|
96
106
|
|
|
97
|
-
|
|
98
|
-
|
|
107
|
+
# initialize remote connection
|
|
108
|
+
remote_content_client = RemoteContentServer.new(Params['local_content_data_port'])
|
|
99
109
|
all_threads << remote_content_client.tcp_thread
|
|
100
110
|
|
|
101
111
|
# # # # # # # # # # # # # # # #
|
|
@@ -110,47 +120,7 @@ module ContentServer
|
|
|
110
120
|
if Params['enable_monitoring']
|
|
111
121
|
monitoring_info = MonitoringInfo::MonitoringInfo.new()
|
|
112
122
|
all_threads << Thread.new do
|
|
113
|
-
|
|
114
|
-
mutex = Mutex.new
|
|
115
|
-
while true do
|
|
116
|
-
sleep(Params['process_vars_delay'])
|
|
117
|
-
::ContentServer::Globals.process_vars.set('time', Time.now)
|
|
118
|
-
Log.debug3("process_vars:monitoring queue size:#{monitoring_events.size}")
|
|
119
|
-
::ContentServer::Globals.process_vars.set('monitoring queue', monitoring_events.size)
|
|
120
|
-
Log.debug3("process_vars:copy files events queue size:#{copy_files_events.size}")
|
|
121
|
-
::ContentServer::Globals.process_vars.set('copy files events queue', copy_files_events.size)
|
|
122
|
-
#enable following line to see full list of object:count
|
|
123
|
-
#obj_array = ''
|
|
124
|
-
total_obj_count = 0
|
|
125
|
-
string_count = 0
|
|
126
|
-
file_count = 0
|
|
127
|
-
dir_count = 0
|
|
128
|
-
content_count = 0
|
|
129
|
-
mutex.synchronize do
|
|
130
|
-
ObjectSpace.each_object(Class) {|obj|
|
|
131
|
-
obj_count_per_class = ObjectSpace.each_object(obj).count
|
|
132
|
-
#enable following line to see full list of object:count
|
|
133
|
-
#obj_array = "#{obj_array} * #{obj.name}:#{obj_count_per_class}"
|
|
134
|
-
total_obj_count = total_obj_count + obj_count_per_class
|
|
135
|
-
}
|
|
136
|
-
string_count = ObjectSpace.each_object(String).count
|
|
137
|
-
file_count = ObjectSpace.each_object(::FileMonitoring::FileStat).count
|
|
138
|
-
dir_count = ObjectSpace.each_object(::FileMonitoring::DirStat).count
|
|
139
|
-
content_count = ObjectSpace.each_object(::ContentData::ContentData).count
|
|
140
|
-
end
|
|
141
|
-
#enable following line to see full list of object:count
|
|
142
|
-
#process_vars.set('Live objs full', obj_array)
|
|
143
|
-
Log.debug3("process_vars:Live objs cnt:#{total_obj_count}")
|
|
144
|
-
Log.debug3("process_vars:Live String obj cnt:#{string_count}")
|
|
145
|
-
Log.debug3("process_vars:Live File obj cnt:#{file_count}")
|
|
146
|
-
Log.debug3("process_vars:Live Dir obj cnt:#{dir_count}")
|
|
147
|
-
Log.debug3("process_vars:Live Content data obj cnt:#{content_count}")
|
|
148
|
-
::ContentServer::Globals.process_vars.set('Live objs cnt', total_obj_count)
|
|
149
|
-
::ContentServer::Globals.process_vars.set('Live String obj cnt', string_count)
|
|
150
|
-
::ContentServer::Globals.process_vars.set('Live File obj cnt', file_count)
|
|
151
|
-
::ContentServer::Globals.process_vars.set('Live Dir obj cnt', dir_count)
|
|
152
|
-
::ContentServer::Globals.process_vars.set('Live Content data obj cnt', content_count)
|
|
153
|
-
end
|
|
123
|
+
ContentServer.monitor_general_process_vars
|
|
154
124
|
end
|
|
155
125
|
end
|
|
156
126
|
# Finalize server threads.
|
|
@@ -2,7 +2,7 @@ require 'tempfile'
|
|
|
2
2
|
require 'thread'
|
|
3
3
|
|
|
4
4
|
require 'file_indexing/index_agent'
|
|
5
|
-
require 'content_server/
|
|
5
|
+
require 'content_server/server'
|
|
6
6
|
require 'log'
|
|
7
7
|
require 'params'
|
|
8
8
|
|
|
@@ -32,6 +32,7 @@ module ContentServer
|
|
|
32
32
|
" #{e.to_s}")
|
|
33
33
|
end
|
|
34
34
|
streams_hash.delete(checksum)
|
|
35
|
+
$process_vars.set('Streams size', streams_hash.size)
|
|
35
36
|
end
|
|
36
37
|
end
|
|
37
38
|
|
|
@@ -57,39 +58,29 @@ module ContentServer
|
|
|
57
58
|
|
|
58
59
|
def copy_another_chuck(checksum)
|
|
59
60
|
@stream_queue << [:COPY_CHUNK, checksum]
|
|
60
|
-
|
|
61
|
-
::ContentServer::Globals.process_vars.set('File Streamer queue', @stream_queue.size)
|
|
62
|
-
end
|
|
61
|
+
$process_vars.set('File Streamer queue', @stream_queue.size)
|
|
63
62
|
end
|
|
64
63
|
|
|
65
64
|
def start_streaming(checksum, path)
|
|
66
65
|
@stream_queue << [:NEW_STREAM, [checksum, path]]
|
|
67
|
-
|
|
68
|
-
::ContentServer::Globals.process_vars.set('File Streamer queue', @stream_queue.size)
|
|
69
|
-
end
|
|
66
|
+
$process_vars.set('File Streamer queue', @stream_queue.size)
|
|
70
67
|
end
|
|
71
68
|
|
|
72
69
|
def abort_streaming(checksum)
|
|
73
70
|
@stream_queue << [:ABORT_STREAM, checksum]
|
|
74
|
-
|
|
75
|
-
::ContentServer::Globals.process_vars.set('File Streamer queue', @stream_queue.size)
|
|
76
|
-
end
|
|
71
|
+
$process_vars.set('File Streamer queue', @stream_queue.size)
|
|
77
72
|
end
|
|
78
73
|
|
|
79
74
|
def reset_streaming(checksum, new_offset)
|
|
80
75
|
@stream_queue << [:RESET_STREAM, [checksum, new_offset]]
|
|
81
|
-
|
|
82
|
-
::ContentServer::Globals.process_vars.set('File Streamer queue', @stream_queue.size)
|
|
83
|
-
end
|
|
76
|
+
$process_vars.set('File Streamer queue', @stream_queue.size)
|
|
84
77
|
end
|
|
85
78
|
|
|
86
79
|
def run
|
|
87
80
|
return Thread.new do
|
|
88
81
|
loop {
|
|
89
82
|
stream_pop = @stream_queue.pop
|
|
90
|
-
|
|
91
|
-
::ContentServer::Globals.process_vars.set('File Streamer queue', @stream_queue.size)
|
|
92
|
-
end
|
|
83
|
+
$process_vars.set('File Streamer queue', @stream_queue.size)
|
|
93
84
|
checksum = handle(stream_pop)
|
|
94
85
|
}
|
|
95
86
|
end
|
|
@@ -101,9 +92,7 @@ module ContentServer
|
|
|
101
92
|
checksum, path = content
|
|
102
93
|
reset_stream(checksum, path, 0)
|
|
103
94
|
@stream_queue << [:COPY_CHUNK, checksum] if @streams.key?(checksum)
|
|
104
|
-
|
|
105
|
-
::ContentServer::Globals.process_vars.set('File Streamer queue', @stream_queue.size)
|
|
106
|
-
end
|
|
95
|
+
$process_vars.set('File Streamer queue', @stream_queue.size)
|
|
107
96
|
elsif type == :ABORT_STREAM
|
|
108
97
|
checksum = content
|
|
109
98
|
Stream.close_delete_stream(checksum, @streams)
|
|
@@ -111,9 +100,7 @@ module ContentServer
|
|
|
111
100
|
checksum, new_offset = content
|
|
112
101
|
reset_stream(checksum, nil, new_offset)
|
|
113
102
|
@stream_queue << [:COPY_CHUNK, checksum] if @streams.key?(checksum)
|
|
114
|
-
|
|
115
|
-
::ContentServer::Globals.process_vars.set('File Streamer queue', @stream_queue.size)
|
|
116
|
-
end
|
|
103
|
+
$process_vars.set('File Streamer queue', @stream_queue.size)
|
|
117
104
|
elsif type == :COPY_CHUNK
|
|
118
105
|
checksum = content
|
|
119
106
|
if @streams.key?(checksum)
|
|
@@ -143,10 +130,11 @@ module ContentServer
|
|
|
143
130
|
file.seek(offset)
|
|
144
131
|
end
|
|
145
132
|
Log.debug1("File streamer: #{file.to_s}.")
|
|
146
|
-
|
|
133
|
+
@streams[checksum] = Stream.new(checksum, path, file, file.size)
|
|
134
|
+
$process_vars.set('Streams size', @streams.size)
|
|
135
|
+
rescue IOError, Errno::ENOENT => e
|
|
147
136
|
Log.warning("Could not stream local file #{path}. #{e.to_s}")
|
|
148
137
|
end
|
|
149
|
-
@streams[checksum] = Stream.new(checksum, path, file, file.size)
|
|
150
138
|
else
|
|
151
139
|
@streams[checksum].file.seek(offset)
|
|
152
140
|
end
|
|
@@ -197,11 +185,11 @@ module ContentServer
|
|
|
197
185
|
end
|
|
198
186
|
# If last chunk copy.
|
|
199
187
|
elsif content.nil? && content_checksum.nil?
|
|
200
|
-
|
|
188
|
+
Log.debug1('Handle the case of backup empty file or last chunk')
|
|
189
|
+
# Handle the case of backup empty file or last chunk.
|
|
201
190
|
handle_new_stream(file_checksum, 0) if !@streams.key?(file_checksum)
|
|
202
191
|
# Finalize the file copy.
|
|
203
192
|
handle_last_chunk(file_checksum)
|
|
204
|
-
return false
|
|
205
193
|
else
|
|
206
194
|
Log.warning("Unexpected receive chuck message. file_checksum:#{file_checksum}, " \
|
|
207
195
|
"content.nil?:#{content.nil?}, content_checksum:#{content_checksum}")
|
|
@@ -211,7 +199,7 @@ module ContentServer
|
|
|
211
199
|
|
|
212
200
|
# open new stream
|
|
213
201
|
def handle_new_stream(file_checksum, file_size)
|
|
214
|
-
Log.
|
|
202
|
+
Log.debug1("enter handle_new_stream")
|
|
215
203
|
# final destination path
|
|
216
204
|
tmp_path = FileReceiver.destination_filename(
|
|
217
205
|
File.join(Params['backup_destination_folder'][0]['path'], 'tmp'),
|
|
@@ -227,6 +215,7 @@ module ContentServer
|
|
|
227
215
|
FileUtils.makedirs(File.dirname(tmp_path)) unless File.directory?(File.dirname(tmp_path))
|
|
228
216
|
tmp_file = File.new(tmp_path, 'wb')
|
|
229
217
|
@streams[file_checksum] = Stream.new(file_checksum, tmp_path, tmp_file, file_size)
|
|
218
|
+
$process_vars.set('Streams size', @streams.size)
|
|
230
219
|
end
|
|
231
220
|
end
|
|
232
221
|
|
|
@@ -258,7 +247,6 @@ module ContentServer
|
|
|
258
247
|
path = FileReceiver.destination_filename(Params['backup_destination_folder'][0]['path'],
|
|
259
248
|
file_checksum)
|
|
260
249
|
Log.debug1("Moving tmp file #{@streams[file_checksum].path} to #{path}")
|
|
261
|
-
Log.debug1("Creating directory: #{path}")
|
|
262
250
|
file_dir = File.dirname(path)
|
|
263
251
|
FileUtils.makedirs(file_dir) unless File.directory?(file_dir)
|
|
264
252
|
# Move tmp file to permanent location.
|
|
@@ -273,13 +261,19 @@ module ContentServer
|
|
|
273
261
|
File.rename(tmp_file_path, path)
|
|
274
262
|
Log.debug1("End move tmp file to permanent location #{path}.")
|
|
275
263
|
@file_done_clb.call(local_file_checksum, path) unless @file_done_clb.nil?
|
|
276
|
-
rescue
|
|
277
|
-
Log.warning("Could not move tmp file to permanent
|
|
264
|
+
rescue Exception => e
|
|
265
|
+
Log.warning("Could not move tmp file to permanent path #{path}." +
|
|
266
|
+
" Error msg:#{e.message}\nError type:#{e.type}")
|
|
278
267
|
end
|
|
279
268
|
else
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
269
|
+
begin
|
|
270
|
+
Log.error(message)
|
|
271
|
+
Log.debug1("Deleting tmp file: #{tmp_file_path}")
|
|
272
|
+
File.delete(tmp_file_path)
|
|
273
|
+
rescue Exception => e
|
|
274
|
+
Log.warning("Could not delete tmp file from tmp path #{tmp_file_path}." +
|
|
275
|
+
" Error msg:#{e.message}\nError type:#{e.type}")
|
|
276
|
+
end
|
|
283
277
|
end
|
|
284
278
|
else
|
|
285
279
|
Log.error("Handling last chunk and tmp stream does not exists.")
|