Skip to content

Dual DHT shortcutting SearchValue for previously published records #692

@aschmahmann

Description

@aschmahmann

The dual DHT uses the parallel router SearchValue:

func (dht *DHT) SearchValue(ctx context.Context, key string, opts ...routing.Option) (<-chan []byte, error) {
p := helper.Parallel{Routers: []routing.Routing{dht.WAN, dht.LAN}, Validator: dht.WAN.Validator}
return p.SearchValue(ctx, key, opts...)
}

The parallel router aborts as soon as any of the routers have completed their search. This is problematic if we first we publish and then search because publishing will store a copy of the record in our datastore during the put

err = dht.putLocal(key, rec)

and then when we do a search we will get that record:

if rec, err := dht.getLocal(key); rec != nil && err == nil {

If the LAN DHT is much smaller than the WAN DHT (e.g. the normal online case) or the WAN DHT is much smaller than the LAN DHT (e.g. an offline case or one using a segregated network like CJDNS) then one of the DHTs will return immediately with a single record (the one previously published) and therefore cause an abort of the other DHT query.

@petar @Stebalien

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions