Ejemplo n.º 1
0
func (t *txn) set() {
	if !t.c.waccess {
		t.respondOsError(syscall.EACCES)
		return
	}

	if !t.c.canWrite {
		t.respondErrCode(response_READONLY)
		return
	}

	if t.req.Path == nil || t.req.Rev == nil {
		t.respondErrCode(response_MISSING_ARG)
		return
	}

	go func() {
		ev := consensus.Set(t.c.p, *t.req.Path, t.req.Value, *t.req.Rev)
		if ev.Err != nil {
			t.respondOsError(ev.Err)
			return
		}
		t.resp.Rev = &ev.Seqn
		t.respond()
	}()
}
Ejemplo n.º 2
0
func clearSlot(p consensus.Proposer, g store.Getter, name string) {
	store.Walk(g, calGlob, func(path, body string, rev int64) bool {
		if body == name {
			consensus.Set(p, path, nil, rev)
		}
		return false
	})
}
Ejemplo n.º 3
0
func Pulse(node string, seqns <-chan int64, p consensus.Proposer, sleep int64) {
	path := "/ctl/node/" + node + "/applied"
	for {
		seqn, ok := <-seqns
		if !ok {
			break
		}

		e := consensus.Set(p, path, []byte(strconv.FormatInt(seqn, 10)), store.Clobber)
		if e.Err != nil {
			log.Println(e.Err)
		}

		time.Sleep(time.Duration(sleep))
	}
}
Ejemplo n.º 4
0
func serve(nc net.Conn, st *store.Store, p consensus.Proposer, w bool, rwsk, rosk string, self string) {
	client_addr := strings.Replace(nc.RemoteAddr().String(), ":", "-", 1)
	eph_node := "/ctl/node/" + self + "/client/" + client_addr

	c := &conn{
		c:        nc,
		addr:     nc.RemoteAddr().String(),
		eph_node: eph_node,
		st:       st,
		p:        p,
		canWrite: w,
		rwsk:     rwsk,
		rosk:     rosk,
		self:     self,
	}

	// create the ephemeral node on client connect under this
	// node's tree. the list of all clients connected can be
	// determined by globbing /ctl/node/*/client/*. to set
	// arbitrary value in the ephemeral node for that client,
	// simply call SET('/eph', value), where /eph is a symlink to
	// that client's ephemeral node.
	log.Println("** setting ephemeral node", eph_node)
	ev := consensus.Set(p, eph_node, []byte(""), store.Missing)
	if ev.Err != nil {
		log.Println("** failed to set ephemeral node:", ev.Err)
		nc.Close()
		return
	}

	c.grant("") // start as if the client supplied a blank password
	c.serve()

	// delete the ephemeral node on disconnect
	log.Println("** deleting ephemeral node", eph_node)
	ev = consensus.Del(p, eph_node, store.Clobber)
	if ev.Err != nil {
		log.Println("** failed to delete ephemeral node:", ev.Err)
	}

	nc.Close()

}