parser.add_argument('-u', '--uuid', type=str, default="", help="Filter events on object_uuid")
parser.add_argument('-f', '--filters', type=str, default="", help="Arvados query filter to apply to log events (JSON encoded)")
parser.add_argument('-s', '--start-time', type=str, default="", help="Arvados query filter to fetch log events created at or after this time. This will be server time in UTC. Allowed format: YYYY-MM-DD or YYYY-MM-DD hh:mm:ss")
+ parser.add_argument('-i', '--id', type=int, default="", help="Start from given log id.")
group = parser.add_mutually_exclusive_group()
group.add_argument('--poll-interval', default=15, type=int, help="If websockets is not available, specify the polling interval, default is every 15 seconds")
else:
last_log_id = None
+ if args.id:
+ last_log_id = args.id-1
+
def on_message(ev):
global filters
global ws
# push_events call if there are more log rows to send.
def push_events ws, notify_id
begin
- if !notify_id.nil? and !ws.last_log_id.nil? and notify_id <= ws.last_log_id
- # This notify is for a row we've handled already.
- return
- end
-
# Must have at least one filter set up to receive events
if ws.filters.length > 0
# Start with log rows readable by user, sorted in ascending order
param_out = []
if !ws.last_log_id.nil?
- # Client is only interested in log rows that are newer than the
- # last log row seen by the client.
+ # We are catching up from some starting point.
cond_id = "logs.id > ?"
param_out << ws.last_log_id
elsif !notify_id.nil?
- # No last log id, so look at rows starting with notify id
- cond_id = "logs.id >= ?"
+ # Get new row being notified.
+ cond_id = "logs.id = ?"
param_out << notify_id
else
# No log id to start from, nothing to do, return
count = 0
limit = 10
+ lastid = nil
logs.limit(limit).each do |l|
ws.send(l.as_api_response.to_json)
- ws.last_log_id = l.id
+ lastid = l.id
count += 1
end
# Number of rows returned was capped by limit(), we need to schedule
# another query to get more logs (will start from last_log_id
# reported by current query)
+ ws.last_log_id = lastid
EventMachine::next_tick do
- push_events ws, nil
+ push_events ws, notify_id
end
- elsif !notify_id.nil? and (ws.last_log_id.nil? or notify_id > ws.last_log_id)
- # Number of rows returned was less than cap, but the notify id is
- # higher than the last id visible to the client, so update last_log_id
- ws.last_log_id = notify_id
+ elsif !ws.last_log_id.nil?
+ # Done catching up
+ ws.last_log_id = nil
end
elsif !notify_id.nil?
# No filters set up, so just record the sequence number