pampa 2.0.27 → 2.0.29
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.
- checksums.yaml +4 -4
- data/lib/pampa.rb +124 -53
- metadata +2 -22
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '095438d108ee4f3cd1cf5d329fb1a0d29c38d6647a130c811e75ed2d73105d81'
|
|
4
|
+
data.tar.gz: 45dd332d64c86e75d7e0b0f8e4575e3884a9cf486eabb959371af3b1da2c674c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e76a96906f54dafa73f37c4109581f1779c77f086788a98e8278960bf2086228a1fd09851b3e37b94c72920495d009567d1f96699c63b87567925c84b8a1af2c
|
|
7
|
+
data.tar.gz: a4869784e7f39a12eb3ef8327584ab773a0a0eac2b22c997cde5dd008e34f13fcdc5e9c0b05b5db86392e3fe8ffa4f8fdd5699052c5e5781d9a9990cae0546d9
|
data/lib/pampa.rb
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
require 'sequel'
|
|
2
2
|
require 'blackstack-core'
|
|
3
3
|
require 'blackstack-nodes'
|
|
4
|
-
require 'blackstack-deployer'
|
|
5
4
|
require 'simple_command_line_parser'
|
|
6
5
|
require 'simple_cloud_logging'
|
|
7
6
|
|
|
8
7
|
module BlackStack
|
|
9
8
|
module Pampa
|
|
10
|
-
# activate this flag if you want to add pampa nodes to blackstack-deployer.
|
|
11
|
-
@@integrate_with_blackstack_deployer = false
|
|
12
9
|
# setup custom locations for config and worker files.
|
|
13
10
|
@@config_filename = "config.rb"
|
|
14
11
|
@@worker_filename = "worker.rb"
|
|
@@ -28,15 +25,6 @@ module BlackStack
|
|
|
28
25
|
DB["SELECT current_timestamp at TIME ZONE '#{tz}' AS now"].first[:now]
|
|
29
26
|
end
|
|
30
27
|
|
|
31
|
-
# @@integrate_with_blackstack_deployer
|
|
32
|
-
def self.integrate_with_blackstack_deployer()
|
|
33
|
-
@@integrate_with_blackstack_deployer
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def self.set_integrate_with_blackstack_deployer(b)
|
|
37
|
-
@@integrate_with_blackstack_deployer = b
|
|
38
|
-
end
|
|
39
|
-
|
|
40
28
|
# @@config_filename
|
|
41
29
|
def self.config_filename()
|
|
42
30
|
@@config_filename
|
|
@@ -97,8 +85,6 @@ module BlackStack
|
|
|
97
85
|
# add a node to the cluster.
|
|
98
86
|
def self.add_node(h)
|
|
99
87
|
@@nodes << BlackStack::Pampa::Node.new(h)
|
|
100
|
-
# add to deployer
|
|
101
|
-
BlackStack::Deployer.add_node(h) if @@integrate_with_blackstack_deployer
|
|
102
88
|
end # def self.add_node(h)
|
|
103
89
|
|
|
104
90
|
# add an array of nodes to the cluster.
|
|
@@ -177,8 +163,8 @@ module BlackStack
|
|
|
177
163
|
assigned = BlackStack::Pampa.workers.select { |worker| worker.attached && worker.assigned_job.to_s == job.name.to_s }
|
|
178
164
|
l.logf("done (#{assigned.size.to_s})")
|
|
179
165
|
|
|
180
|
-
l.logs("Getting total pending (
|
|
181
|
-
pendings = job.
|
|
166
|
+
l.logs("Getting total pending (pending) tasks... ")
|
|
167
|
+
pendings = job.pending
|
|
182
168
|
l.logf("done (#{pendings.to_s})")
|
|
183
169
|
|
|
184
170
|
l.logs("0 pending tasks?.... ")
|
|
@@ -632,6 +618,9 @@ module BlackStack
|
|
|
632
618
|
# max number of times that a record can start to process & fail (:start_time field is not nil,
|
|
633
619
|
# but :end_time field is still nil after :max_job_duration_minutes)
|
|
634
620
|
attr_accessor :max_try_times
|
|
621
|
+
|
|
622
|
+
# CUSTOM DISPATCHING FUNCTIONS
|
|
623
|
+
#
|
|
635
624
|
# additional function to returns an array of tasks pending to be processed by a worker.
|
|
636
625
|
# it should returns an array
|
|
637
626
|
# keep it nil if you want to run the default function
|
|
@@ -661,9 +650,23 @@ module BlackStack
|
|
|
661
650
|
attr_accessor :finisher_function
|
|
662
651
|
# Function to execute for each task.
|
|
663
652
|
attr_accessor :processing_function
|
|
653
|
+
|
|
654
|
+
# CUSTOM REPORTING FUNCTIONS
|
|
655
|
+
#
|
|
656
|
+
# additional function to returns the number of total tasks.
|
|
657
|
+
# it should returns an array
|
|
658
|
+
# keep it nil if you want to run the default function
|
|
659
|
+
attr_accessor :total_function
|
|
660
|
+
attr_accessor :completed_function
|
|
661
|
+
attr_accessor :pending_function
|
|
662
|
+
attr_accessor :failed_function
|
|
663
|
+
|
|
664
|
+
# ELASTIC WORKERS ASSIGNATION
|
|
665
|
+
#
|
|
664
666
|
# stretch assignation/unassignation of workers
|
|
665
667
|
attr_accessor :max_pending_tasks
|
|
666
668
|
attr_accessor :max_assigned_workers
|
|
669
|
+
|
|
667
670
|
# choose workers to assign tasks
|
|
668
671
|
attr_accessor :filter_worker_id
|
|
669
672
|
|
|
@@ -683,6 +686,8 @@ module BlackStack
|
|
|
683
686
|
:queue_size => self.queue_size,
|
|
684
687
|
:max_job_duration_minutes => self.max_job_duration_minutes,
|
|
685
688
|
:max_try_times => self.max_try_times,
|
|
689
|
+
|
|
690
|
+
# dispatching custom functions
|
|
686
691
|
:occupied_function => self.occupied_function.to_s,
|
|
687
692
|
:allowing_function => self.allowing_function.to_s,
|
|
688
693
|
:selecting_function => self.selecting_function.to_s,
|
|
@@ -693,7 +698,13 @@ module BlackStack
|
|
|
693
698
|
:processing_function => self.processing_function.to_s,
|
|
694
699
|
:max_pending_tasks => self.max_pending_tasks,
|
|
695
700
|
:max_assigned_workers => self.max_assigned_workers,
|
|
696
|
-
:filter_worker_id => self.filter_worker_id
|
|
701
|
+
:filter_worker_id => self.filter_worker_id,
|
|
702
|
+
|
|
703
|
+
# reporting custom functions
|
|
704
|
+
:total_function => self.total_function.to_s,
|
|
705
|
+
:completed_function => self.completed_function.to_s,
|
|
706
|
+
:pending_function => self.pending_function.to_s,
|
|
707
|
+
:failed_function => self.failed_function.to_s,
|
|
697
708
|
}
|
|
698
709
|
end
|
|
699
710
|
|
|
@@ -721,12 +732,22 @@ module BlackStack
|
|
|
721
732
|
self.queue_size = h[:queue_size]
|
|
722
733
|
self.max_job_duration_minutes = h[:max_job_duration_minutes]
|
|
723
734
|
self.max_try_times = h[:max_try_times]
|
|
735
|
+
|
|
736
|
+
# dispatching custom functions
|
|
724
737
|
self.occupied_function = h[:occupied_function]
|
|
725
738
|
self.allowing_function = h[:allowing_function]
|
|
726
739
|
self.selecting_function = h[:selecting_function]
|
|
727
740
|
self.relaunching_function = h[:relaunching_function]
|
|
728
741
|
self.relauncher_function = h[:relauncher_function]
|
|
729
742
|
self.processing_function = h[:processing_function]
|
|
743
|
+
|
|
744
|
+
# reporting custom functions
|
|
745
|
+
self.total_function = h[:total_function]
|
|
746
|
+
self.completed_function = h[:completed_function]
|
|
747
|
+
self.pending_function = h[:pending_function]
|
|
748
|
+
self.failed_function = h[:failed_function]
|
|
749
|
+
|
|
750
|
+
# elastic workers assignation
|
|
730
751
|
self.max_pending_tasks = h[:max_pending_tasks]
|
|
731
752
|
self.max_assigned_workers = h[:max_assigned_workers]
|
|
732
753
|
self.filter_worker_id = h[:filter_worker_id]
|
|
@@ -914,62 +935,112 @@ module BlackStack
|
|
|
914
935
|
return i
|
|
915
936
|
end
|
|
916
937
|
|
|
917
|
-
# reporting methods
|
|
918
|
-
#
|
|
938
|
+
# reporting methods
|
|
939
|
+
#
|
|
919
940
|
|
|
920
|
-
# reporting method:
|
|
921
|
-
# reutrn the number of
|
|
922
|
-
# if the numbr if
|
|
941
|
+
# reporting method: total
|
|
942
|
+
# reutrn the number of total tasks.
|
|
943
|
+
# if the numbr if total tasks is higher than `max_tasks_to_show` then it returns `max_tasks_to_show`+.
|
|
923
944
|
def total
|
|
924
945
|
j = self
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
946
|
+
if self.total_function.nil?
|
|
947
|
+
q = "
|
|
948
|
+
SELECT COUNT(*) AS n
|
|
949
|
+
FROM #{j.table.to_s}
|
|
950
|
+
"
|
|
951
|
+
return DB[q].first[:n].to_i
|
|
952
|
+
else
|
|
953
|
+
return self.total_function.call
|
|
954
|
+
end
|
|
930
955
|
end # def total
|
|
931
956
|
|
|
932
957
|
|
|
933
|
-
# reporting method:
|
|
934
|
-
# reutrn the number of
|
|
935
|
-
# if the numbr if
|
|
958
|
+
# reporting method: completed
|
|
959
|
+
# reutrn the number of completed tasks.
|
|
960
|
+
# if the numbr if completed tasks is higher than `max_tasks_to_show` then it returns `max_tasks_to_show`+.
|
|
936
961
|
def completed
|
|
937
962
|
j = self
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
963
|
+
if self.completed_function.nil?
|
|
964
|
+
q = "
|
|
965
|
+
SELECT COUNT(*) AS n
|
|
966
|
+
FROM #{j.table.to_s}
|
|
967
|
+
WHERE COALESCE(#{j.field_success.to_s},false)=true
|
|
968
|
+
"
|
|
969
|
+
return DB[q].first[:n].to_i
|
|
970
|
+
else
|
|
971
|
+
return self.completed_function.call
|
|
972
|
+
end
|
|
944
973
|
end # def completed
|
|
945
974
|
|
|
946
|
-
# reporting method:
|
|
947
|
-
# reutrn the number of
|
|
948
|
-
# if the numbr if
|
|
949
|
-
def
|
|
975
|
+
# reporting method: pending
|
|
976
|
+
# reutrn the number of pending tasks.
|
|
977
|
+
# if the numbr if pending tasks is higher than `max_tasks_to_show` then it returns `max_tasks_to_show`+.
|
|
978
|
+
def pending
|
|
950
979
|
j = self
|
|
980
|
+
if self.pending_function.nil?
|
|
981
|
+
q = "
|
|
982
|
+
SELECT COUNT(*) AS n
|
|
983
|
+
FROM #{j.table.to_s}
|
|
984
|
+
WHERE COALESCE(#{j.field_success.to_s},false)=false
|
|
985
|
+
AND COALESCE(#{j.field_times.to_s},0) < #{j.max_try_times.to_i}
|
|
986
|
+
"
|
|
987
|
+
return DB[q].first[:n].to_i
|
|
988
|
+
else
|
|
989
|
+
return self.pending_function.call
|
|
990
|
+
end
|
|
991
|
+
end # def pending
|
|
992
|
+
|
|
993
|
+
# reporting method: running
|
|
994
|
+
# return the number of running tasks.
|
|
995
|
+
# if the number if running tasks is higher than `max_tasks_to_show` then it returns `max_tasks_to_show`+.
|
|
996
|
+
def failed
|
|
997
|
+
j = self
|
|
998
|
+
if self.failed_function.nil?
|
|
951
999
|
q = "
|
|
952
1000
|
SELECT COUNT(*) AS n
|
|
953
1001
|
FROM #{j.table.to_s}
|
|
954
1002
|
WHERE COALESCE(#{j.field_success.to_s},false)=false
|
|
955
|
-
AND COALESCE(#{j.field_times.to_s},0)
|
|
1003
|
+
AND COALESCE(#{j.field_times.to_s},0) >= #{j.max_try_times.to_i}
|
|
956
1004
|
"
|
|
957
|
-
DB[q].first[:n].to_i
|
|
958
|
-
|
|
1005
|
+
return DB[q].first[:n].to_i
|
|
1006
|
+
else
|
|
1007
|
+
return self.failed_function.call
|
|
1008
|
+
end
|
|
1009
|
+
end # def falsed
|
|
959
1010
|
|
|
960
|
-
# reporting method:
|
|
961
|
-
#
|
|
1011
|
+
# reporting method: timeline
|
|
1012
|
+
# Return an array of hashes with the number of successfull processed taasks in the last period.
|
|
1013
|
+
# The period is defined by the `scale_unit` and `scale_points` parameters.
|
|
1014
|
+
# The `scale_unit` can be `minutes`, `hours`, `days`, `weeks`, `months`, `years`.
|
|
1015
|
+
# The `scale_points` is the number of `scale_unit` to be reported, and it must be an integer higer than 0.
|
|
962
1016
|
# if the numbr if running tasks is higher than `max_tasks_to_show` then it returns `max_tasks_to_show`+.
|
|
963
|
-
def
|
|
1017
|
+
def timeline(scale_unit='minutes', scale_points=60)
|
|
964
1018
|
j = self
|
|
965
|
-
|
|
1019
|
+
a = []
|
|
1020
|
+
# validate: The period is defined by the `scale_unit` and `scale_points` parameters.
|
|
1021
|
+
if !['minutes', 'hours', 'days', 'weeks', 'months', 'years'].include?(scale_unit)
|
|
1022
|
+
raise "Invalid scale_unit: #{scale_unit}"
|
|
1023
|
+
end
|
|
1024
|
+
# validate: The `scale_points` is the number of `scale_unit` to be reported, and it must be an integer higer than 0.
|
|
1025
|
+
if !scale_points.is_a?(Integer) || scale_points<=0
|
|
1026
|
+
raise "Invalid scale_points: #{scale_points}"
|
|
1027
|
+
end
|
|
1028
|
+
# generate report
|
|
1029
|
+
point = 0
|
|
1030
|
+
while point<scale_points
|
|
1031
|
+
point += 1
|
|
1032
|
+
q = "
|
|
966
1033
|
SELECT COUNT(*) AS n
|
|
967
|
-
FROM #{j.table.to_s}
|
|
968
|
-
WHERE COALESCE(#{j.field_success.to_s},false)=
|
|
969
|
-
AND
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
1034
|
+
FROM #{j.table.to_s}
|
|
1035
|
+
WHERE COALESCE(#{j.field_success.to_s},false)=true
|
|
1036
|
+
AND #{j.field_time.to_s} >= CAST('#{BlackStack::Pampa.now - point.send(scale_unit)}' AS TIMESTAMP)
|
|
1037
|
+
AND #{j.field_time.to_s} < CAST('#{BlackStack::Pampa.now - (point-1).send(scale_unit)}' AS TIMESTAMP)
|
|
1038
|
+
"
|
|
1039
|
+
a << { :time => BlackStack::Pampa.now - (point-1).send(scale_unit), :n => DB[q].first[:n].to_i }
|
|
1040
|
+
end # while point<scale_points
|
|
1041
|
+
# return
|
|
1042
|
+
a
|
|
1043
|
+
end # def timeline
|
|
973
1044
|
|
|
974
1045
|
# reporting method: error_descriptions
|
|
975
1046
|
# return an array of hashes { :id, :error_description } with the tasks that have an the success flag in false, error description.
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pampa
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.29
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Leandro Daniel Sardi
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-08-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: sequel
|
|
@@ -70,26 +70,6 @@ dependencies:
|
|
|
70
70
|
- - ">="
|
|
71
71
|
- !ruby/object:Gem::Version
|
|
72
72
|
version: 1.2.11
|
|
73
|
-
- !ruby/object:Gem::Dependency
|
|
74
|
-
name: blackstack-deployer
|
|
75
|
-
requirement: !ruby/object:Gem::Requirement
|
|
76
|
-
requirements:
|
|
77
|
-
- - "~>"
|
|
78
|
-
- !ruby/object:Gem::Version
|
|
79
|
-
version: 1.2.24
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: 1.2.24
|
|
83
|
-
type: :runtime
|
|
84
|
-
prerelease: false
|
|
85
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - "~>"
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: 1.2.24
|
|
90
|
-
- - ">="
|
|
91
|
-
- !ruby/object:Gem::Version
|
|
92
|
-
version: 1.2.24
|
|
93
73
|
- !ruby/object:Gem::Dependency
|
|
94
74
|
name: simple_command_line_parser
|
|
95
75
|
requirement: !ruby/object:Gem::Requirement
|