Intermittent “Hmm, an empty timeline. That's weird.” Message


#1

Continuing the discussion from Intermittent "Hmmm, an empty timeline. That’s weird." Message:

This is still a problem. Please see this Gist–two identical requests, only minutes apart, one with proper content, and one with the “Hmmm…” message.


Widget not working - Hmm, an empty timeline. That's weird. Check for Tweets
#2

An “empty timeline that’s weird” message is displayed when no Tweets are available for the requested timeline. It may appear when a user timeline specifies an account with protected Tweets or a search request returns zero results.

What type of embedded timeline led to the empty result set? If a search query was specified, are there a high number of expected results in recent history or did the sampling of results drop from 5-10 to 0?


#3

Here’s the fundamental issue:

  • I make a request, and I get 5 results in the timeline.
  • I make another request ten seconds later, and get 0 results ("…empty timeline…")
  • I make another request ten seconds later and get the original 5 results.
  • I make another request ten seconds later and get 0 results again.

The above happens without any new relevant tweeting, and the fact that the same result set disappears and reappears would rule out any expiration-related explanation.

By the way, the actual alternation isn’t as strict as the above example might suggest (sometimes there are several zero-record results in a row, or several five-record results in a row–it’s intermittent).

Included in the original Gist are two identical requests, made close together, demonstrating the problem.

FYI, the widget snippet looks like:

<a class="twitter-timeline" href="https://twitter.com/search?q=%2523hudat50%20from%3A%40HUDGov" data-widget-id="643869437385379841">Tweets about %23hudat50 from:@HUDGov</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p>

#4

Update: I have an easier test case now (in later posts to this thread).


Could someone from Twitter please just try this? It’s an easy test, and it’s pretty easy to reproduce. If you run this command 20 or 30 times, you should see the behavior I’m describing.

$ date && curl -I "https://cdn.syndication.twimg.com/widgets/timelines/643869437385379841?callback=__twttr.callbacks.tl_643869437385379841_i0&dnt=false&domain=stage.hudexchange.info&lang=en&new_html=false&suppress_response_codes=true&t=1618161" -H "Pragma: no-cache" -H "Cache-Control: no-cache" 2>&1 | grep '\(length\|server\)'
Tue, Mar 22, 2016 10:19:35 AM
content-length: 20225
server: tsa_a

$ date && curl -I "https://cdn.syndication.twimg.com/widgets/timelines/643869437385379841?callback=__twttr.callbacks.tl_643869437385379841_i0&dnt=false&domain=stage.hudexchange.info&lang=en&new_html=false&suppress_response_codes=true&t=1618161" -H "Pragma: no-cache" -H "Cache-Control: no-cache" 2>&1 | grep '\(length\|server\)'
Tue, Mar 22, 2016 10:19:37 AM
content-length: 20225
server: tsa_a

$ date && curl -I "https://cdn.syndication.twimg.com/widgets/timelines/643869437385379841?callback=__twttr.callbacks.tl_643869437385379841_i0&dnt=false&domain=stage.hudexchange.info&lang=en&new_html=false&suppress_response_codes=true&t=1618161" -H "Pragma: no-cache" -H "Cache-Control: no-cache" 2>&1 | grep '\(length\|server\)'
Tue, Mar 22, 2016 10:19:46 AM
content-length: 20225
server: tsa_a

$ date && curl -I "https://cdn.syndication.twimg.com/widgets/timelines/643869437385379841?callback=__twttr.callbacks.tl_643869437385379841_i0&dnt=false&domain=stage.hudexchange.info&lang=en&new_html=false&suppress_response_codes=true&t=1618161" -H "Pragma: no-cache" -H "Cache-Control: no-cache" 2>&1 | grep '\(length\|server\)'
Tue, Mar 22, 2016 10:19:53 AM
content-length: 1679
server: tsa_b

$ date && curl -I "https://cdn.syndication.twimg.com/widgets/timelines/643869437385379841?callback=__twttr.callbacks.tl_643869437385379841_i0&dnt=false&domain=stage.hudexchange.info&lang=en&new_html=false&suppress_response_codes=true&t=1618161" -H "Pragma: no-cache" -H "Cache-Control: no-cache" 2>&1 | grep '\(length\|server\)'
Tue, Mar 22, 2016 10:19:56 AM
content-length: 25080
server: tsa_b

$ date && curl -I "https://cdn.syndication.twimg.com/widgets/timelines/643869437385379841?callback=__twttr.callbacks.tl_643869437385379841_i0&dnt=false&domain=stage.hudexchange.info&lang=en&new_html=false&suppress_response_codes=true&t=1618161" -H "Pragma: no-cache" -H "Cache-Control: no-cache" 2>&1 | grep '\(length\|server\)'
Tue, Mar 22, 2016 10:19:59 AM
content-length: 25080
server: tsa_b

$ date && curl -I "https://cdn.syndication.twimg.com/widgets/timelines/643869437385379841?callback=__twttr.callbacks.tl_643869437385379841_i0&dnt=false&domain=stage.hudexchange.info&lang=en&new_html=false&suppress_response_codes=true&t=1618161" -H "Pragma: no-cache" -H "Cache-Control: no-cache" 2>&1 | grep '\(length\|server\)'
Tue, Mar 22, 2016 10:20:10 AM
content-length: 1679
server: tsa_b

Notice how server tsa_a always returns consistent, expected results, whereas server tsa_b is like a slot machine?


#6

Here is a potentially more convenient way to demonstrate the problem. I’m hoping to get some sort of acknowledgement.

# this test/function can be copied/pasted into bash
function doCurlTest {
  echo "----------------------------------------------------"
  curl -sv "https://cdn.syndication.twimg.com/widgets/timelines/643869437385379841?callback=__twttr.callbacks.tl_643869437385379841_i0&dnt=false&domain=stage.hudexchange.info&lang=en&new_html=false&suppress_response_codes=true&t=1618161" -H "Pragma: no-cache" -H "Cache-Control: no-cache" 2>&1 | sed -e 's/.*timeline-EmptyMessage.*/Timeline Results: Empty/' | sed -e 's/.*timeline-NewTweetsNotification.*/Timeline Results: Populated/' | grep '\(length\|< server\|< date\|Timeline Results\)'
  sleep $1
}

# loop test 20 times, with 30s pauses in-between
for i in {1..20}; do doCurlTest 30; done

Here are the results from a recent run:

----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 22:51:45 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 1679
< date: Wed, 23 Mar 2016 22:52:16 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 22:52:46 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 22:53:17 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 22:53:49 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 22:54:20 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 22:54:51 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 1679
< date: Wed, 23 Mar 2016 22:55:22 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 1679
< date: Wed, 23 Mar 2016 22:55:53 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 22:56:24 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 1679
< date: Wed, 23 Mar 2016 22:56:55 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 22:57:26 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 25080
< date: Wed, 23 Mar 2016 22:57:57 GMT
< server: tsa_b
Timeline Results: Populated
----------------------------------------------------
< content-length: 1679
< date: Wed, 23 Mar 2016 22:58:28 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 25080
< date: Wed, 23 Mar 2016 22:58:59 GMT
< server: tsa_b
Timeline Results: Populated
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 22:59:30 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 23:00:01 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 23:00:32 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 1679
< date: Wed, 23 Mar 2016 23:01:04 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 20225
< date: Wed, 23 Mar 2016 23:01:34 GMT
< server: tsa_a
Timeline Results: Populated

Widget not working - Hmm, an empty timeline. That's weird. Check for Tweets
#7

I neglected to reply to @niall before, which might explain the silence.


#8

The problem remains, 3/29:

Test

# this test/function can be copied/pasted into bash
function doCurlTest {
  echo "----------------------------------------------------"
  curl -sv "https://cdn.syndication.twimg.com/widgets/timelines/643869437385379841?callback=__twttr.callbacks.tl_643869437385379841_i0&dnt=false&domain=stage.hudexchange.info&lang=en&new_html=false&suppress_response_codes=true&t=1618161" -H "Pragma: no-cache" -H "Cache-Control: no-cache" 2>&1 | sed -e 's/.*timeline-EmptyMessage.*/Timeline Results: Empty/' | sed -e 's/.*timeline-NewTweetsNotification.*/Timeline Results: Populated/' | grep '\(length\|< server\|< date\|Timeline Results\)'
  sleep $1
}

# loop test 20 times, with 30s pauses in-between
for i in {1..20}; do doCurlTest 30; done

Results

----------------------------------------------------
< content-length: 20225
< date: Tue, 29 Mar 2016 13:07:25 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 1679
< date: Tue, 29 Mar 2016 13:07:56 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 25080
< date: Tue, 29 Mar 2016 13:08:27 GMT
< server: tsa_b
Timeline Results: Populated
----------------------------------------------------
< content-length: 25080
< date: Tue, 29 Mar 2016 13:08:58 GMT
< server: tsa_b
Timeline Results: Populated
----------------------------------------------------
< content-length: 1679
< date: Tue, 29 Mar 2016 13:09:30 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 20225
< date: Tue, 29 Mar 2016 13:10:00 GMT
< server: tsa_a
Timeline Results: Populated

#9

The problem remains, 4/4.

Test

# this test/function can be copied/pasted into bash
function doCurlTest {
  echo "----------------------------------------------------"
  curl -sv "https://cdn.syndication.twimg.com/widgets/timelines/643869437385379841?callback=__twttr.callbacks.tl_643869437385379841_i0&dnt=false&domain=stage.hudexchange.info&lang=en&new_html=false&suppress_response_codes=true&t=1618161" -H "Pragma: no-cache" -H "Cache-Control: no-cache" 2>&1 | sed -e 's/.*timeline-EmptyMessage.*/Timeline Results: Empty/' | sed -e 's/.*timeline-NewTweetsNotification.*/Timeline Results: Populated/' | grep '\(length\|< server\|< date\|Timeline Results\)'
  sleep $1
}

# loop test 20 times, with 30s pauses in-between
for i in {1..20}; do doCurlTest 30; done

Results

----------------------------------------------------
< content-length: 25080
< date: Mon, 04 Apr 2016 19:15:05 GMT
< server: tsa_b
Timeline Results: Populated
----------------------------------------------------
< content-length: 1679
< date: Mon, 04 Apr 2016 19:15:36 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 1679
< date: Mon, 04 Apr 2016 19:16:07 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 25080
< date: Mon, 04 Apr 2016 19:16:37 GMT
< server: tsa_b
Timeline Results: Populated
----------------------------------------------------
< content-length: 20225
< date: Mon, 04 Apr 2016 19:17:08 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 20225
< date: Mon, 04 Apr 2016 19:17:39 GMT
< server: tsa_a
Timeline Results: Populated

#10

I can confirm that this is actually an issue, I can reproduce it as well.
Sometimes tsa_b returns the Tweets fine and suddenly on the next requests decides to return no Tweets at all and just the “Empty timeline” error message.
Maybe @andypiper could look into it or knows the right people to forward this bug report to?


#11

There are several issues on request/query based widget for 2 weeks, since Twitter has a global issue on query based widget.

We crashed every day the widget which is not able to find any results while it works perfectly on Twitter.com.

For example since Saturday the query widget gave no more results with from:RadioKC (and give plenty of on twitter.com of course).

The 2 weeks ago global issue could be found here


#12

Problem still exists 4/6:

Test Results

(Snippet:)

----------------------------------------------------
< content-length: 20225
< date: Wed, 06 Apr 2016 20:42:03 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 25080
< date: Wed, 06 Apr 2016 20:42:34 GMT
< server: tsa_b
Timeline Results: Populated
----------------------------------------------------
< content-length: 1679
< date: Wed, 06 Apr 2016 20:43:05 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 25080
< date: Wed, 06 Apr 2016 20:43:36 GMT
< server: tsa_b
Timeline Results: Populated

#13

Still a problem 4/15:

----------------------------------------------------
< content-length: 20225
< date: Fri, 15 Apr 2016 21:30:01 GMT
< server: tsa_a
Timeline Results: Populated
----------------------------------------------------
< content-length: 1679
< date: Fri, 15 Apr 2016 21:30:32 GMT
< server: tsa_b
Timeline Results: Empty
----------------------------------------------------
< content-length: 25080
< date: Fri, 15 Apr 2016 21:31:03 GMT
< server: tsa_b
Timeline Results: Populated

#14

This is a known issue with search timelines, caused by inconsistent cache invalidation. We’re aware of the issue, and we’re sorry for the inconvenience it’s caused. This is a use case we definitely want to support, and we’re working on a better long-term approach. In the meantime, thanks for your patience and for your feedback.


#15

Thanks for the response!

What’s the best way for me to follow progress on a resolution? (In this post–which unfortunately has an automatic shelf-life? Elsewhere?) I can’t go to production with the widget until it gives consistent results, so I want to stay in the loop somehow.


#16

We administrators can reopen threads. Just follow this thread for updates.


#17

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.