[Haskell-cafe] Weird and entirely random problem...

2009-06-10 Thread Jeff Heard
The code that causes it is here:

http://hpaste.org/fastcgi/hpaste.fcgi/view?id=5731#a5731

This is the strangest thing.  Occasionally, using nothing but gets and
puts and frees on a non-full Cache will result in this:

Cache {
  store = fromList
[((\icons/addBookmark.png\,False),TextureObject {textureID = 4})
,((\icons/addCircle.png\,False),TextureObject {textureID = 1})
,((\icons/addContent.png\,False),TextureObject {textureID = 2})
,((\icons/addElsewhereLink.png\,False),TextureObject
{textureID = 3})]
, times = fromList
[(61314,(\span font_desc='sans
8'294.0/span\,AlignLeft,Nothing,WrapWholeWords,False,0.0,0.0))

,(61316,(\icons/addBookmark.png\,False)),(61318,(\icons/addCircle.png\,False))

,(61320,(\icons/addContent.png\,False)),(61322,(\icons/addElsewhereLink.png\,False))]

, now = 61323
, maxsize = 1024768000
, size = 4
, decimation = 0
}


Sometimes the problem is self-correcting.  Sometimes it is most
certainly not.  But I don't understand how my code can possibly allow
for this.
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Weird and entirely random problem...

2009-06-10 Thread Neil Brown

Hi,

I'm presuming the problem with your result is that the span... String 
is in the times map, and not in the store map (you weren't clear on the 
exact problem).


I took a look at the code, here's my thoughts on why this occurs.  If 
you start by putting something in the cache with key foo, an entry is 
created in the times map, say: fromList [(0, foo)].  If you then get 
the item from the cache, you add another item to the times map, giving 
you: fromList [(0, foo), (1, foo)].  Another get operation, and 
you'll have fromList [(0, foo), (1, foo), (2, foo)].  If you now 
call free on the cache, it finds the value associated with the minimum 
key: foo.  But it only deletes the minimum key in the times map, 
leaving: fromList [(1, foo), (2, foo)].  Thus you can have entries 
in the times map without them being in the store.  put would clear them 
out (perhaps this was the self-correction you saw), but get adds one 
each item, and free only clears one.  So you either need to fix get, or 
free.


Does that help, or was your question something else entirely? :-)

BTW, IntMap.fromList . filter (f . snd) . IntMap.toList is more 
concisely (and efficiently) written as: IntMap.filter f


Thanks,

Neil.

Jeff Heard wrote:

The code that causes it is here:

http://hpaste.org/fastcgi/hpaste.fcgi/view?id=5731#a5731

This is the strangest thing.  Occasionally, using nothing but gets and
puts and frees on a non-full Cache will result in this:

Cache {
  store = fromList
[((\icons/addBookmark.png\,False),TextureObject {textureID = 4})
,((\icons/addCircle.png\,False),TextureObject {textureID = 1})
,((\icons/addContent.png\,False),TextureObject {textureID = 2})
,((\icons/addElsewhereLink.png\,False),TextureObject
{textureID = 3})]
, times = fromList
[(61314,(\span font_desc='sans
8'294.0/span\,AlignLeft,Nothing,WrapWholeWords,False,0.0,0.0))

,(61316,(\icons/addBookmark.png\,False)),(61318,(\icons/addCircle.png\,False))

,(61320,(\icons/addContent.png\,False)),(61322,(\icons/addElsewhereLink.png\,False))]

, now = 61323
, maxsize = 1024768000
, size = 4
, decimation = 0
}


Sometimes the problem is self-correcting.  Sometimes it is most
certainly not.  But I don't understand how my code can possibly allow
for this.
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
  


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Weird and entirely random problem...

2009-06-10 Thread Jeff Heard
That works, yes...  thanks!

On Wed, Jun 10, 2009 at 12:58 PM, Neil Brownnc...@kent.ac.uk wrote:
 Hi,

 I'm presuming the problem with your result is that the span... String is
 in the times map, and not in the store map (you weren't clear on the exact
 problem).

 I took a look at the code, here's my thoughts on why this occurs.  If you
 start by putting something in the cache with key foo, an entry is created
 in the times map, say: fromList [(0, foo)].  If you then get the item from
 the cache, you add another item to the times map, giving you: fromList [(0,
 foo), (1, foo)].  Another get operation, and you'll have fromList [(0,
 foo), (1, foo), (2, foo)].  If you now call free on the cache, it
 finds the value associated with the minimum key: foo.  But it only deletes
 the minimum key in the times map, leaving: fromList [(1, foo), (2,
 foo)].  Thus you can have entries in the times map without them being in
 the store.  put would clear them out (perhaps this was the self-correction
 you saw), but get adds one each item, and free only clears one.  So you
 either need to fix get, or free.

 Does that help, or was your question something else entirely? :-)

 BTW, IntMap.fromList . filter (f . snd) . IntMap.toList is more concisely
 (and efficiently) written as: IntMap.filter f

 Thanks,

 Neil.

 Jeff Heard wrote:

 The code that causes it is here:

 http://hpaste.org/fastcgi/hpaste.fcgi/view?id=5731#a5731

 This is the strangest thing.  Occasionally, using nothing but gets and
 puts and frees on a non-full Cache will result in this:

 Cache {
      store = fromList
        [((\icons/addBookmark.png\,False),TextureObject {textureID =
 4})
        ,((\icons/addCircle.png\,False),TextureObject {textureID = 1})
        ,((\icons/addContent.png\,False),TextureObject {textureID = 2})
        ,((\icons/addElsewhereLink.png\,False),TextureObject
 {textureID = 3})]
    , times = fromList
        [(61314,(\span font_desc='sans
 8'294.0/span\,AlignLeft,Nothing,WrapWholeWords,False,0.0,0.0))

  ,(61316,(\icons/addBookmark.png\,False)),(61318,(\icons/addCircle.png\,False))

  ,(61320,(\icons/addContent.png\,False)),(61322,(\icons/addElsewhereLink.png\,False))]

    , now = 61323
    , maxsize = 1024768000
    , size = 4
    , decimation = 0
 }


 Sometimes the problem is self-correcting.  Sometimes it is most
 certainly not.  But I don't understand how my code can possibly allow
 for this.
 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe



___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe