content_server 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.")
|