[Haskell-beginners] Nonsensical behavior with http-conduit, httpLbs
Michael Snoyman
michael at snoyman.com
Thu Apr 10 06:15:03 UTC 2014
I can't say I fully understand your code, but it seems like it's doing the
following:
1. Send request to server to delete data.
2. Send request to server to add data.
3. Request data from server.
You're saying that with a long enough delay between steps 2 and 3, then (3)
works, otherwise it fails. It sounds to me like there's some kind of a race
condition. I don't know anything about createExampleIndex, but are you
certain that it only returns after the data is completely ready for
querying?
On Thu, Apr 10, 2014 at 8:43 AM, Christopher Allen <cma at bitemyapp.com>wrote:
> to add to my question adding a delay made it work:
>
> main :: IO ()
> main = do
> _ <- insertData
> threadDelay 1000000
> myTweet <- queryTweet
> print myTweet
>
>
>
> On Thu, Apr 10, 2014 at 12:41 AM, Christopher Allen <cma at bitemyapp.com>wrote:
>
>> Repro'd on GHC 7.8.1 and 7.6.3
>>
>> Original code is: https://github.com/bitemyapp/bloodhound/
>>
>> The code only works if I manually (out of band) run insertData (in a
>> REPL) and then run main with the insertData invocation stripped out. If I
>> run main with the insertData invocation included, it throws an exception
>> (head) because the search results are empty.
>>
>> The behavior is as if queryTweet was executing after insertData deleted
>> the index, but before it inserted the new data.
>>
>> The following is a stripped down example:
>>
>> insertData :: IO ()
>> insertData = do
>> let encoded = encode exampleTweet
>> _ <- deleteExampleIndex
>> created <- createExampleIndex
>> docCreated <- indexDocument (Server "http://localhost:9200") "twitter"
>> "tweet" exampleTweet "1"
>> print "test"
>> return ()
>> el
>> queryTweet :: IO (Either String Tweet)
>> queryTweet = do
>> let queryFilter = BoolFilter (MustMatch (Term "user" "bitemyapp") False)
>> <||> IdentityFilter
>> let search = Search Nothing (Just queryFilter)
>> reply <- searchByIndex testServer "twitter" search
>> let result = eitherDecode (responseBody reply) :: Either String
>> (SearchResult Tweet)
>> let myTweet = fmap (hitSource . head . hits . searchHits) result
>> return myTweet
>>
>> main :: IO ()
>> main = do
>> _ <- insertData
>> myTweet <- queryTweet
>> print myTweet
>>
>> further up the call chain, the http call is getting dispatched with
>> http-conduit's gear, the result returned with the expression:
>>
>> withManager $ httpLbs req
>>
>> Included this in case it affects the semantics.
>>
>> Can anybody help? This has stumped me for a couple hours and I couldn't
>> get anything clueful on IRC.
>>
>> Thanks to any that help.
>>
>> --- Chris
>>
>>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20140410/f9ac277c/attachment-0001.html>
More information about the Beginners
mailing list