func CreateOrUpdate(zconn zkhelper.Conn, zkPath, value string, flags int, aclv []topo.ACL, recursive bool) (pathCreated string, err error) { if recursive { pathCreated, err = CreateRecursive(zconn, zkPath, value, flags, aclv) } else { pathCreated, err = zconn.Create(zkPath, []byte(value), int32(flags), aclv) } if err != nil && zkhelper.ZkErrorEqual(err, topo.ErrNodeExists) { pathCreated = "" _, err = zconn.Set(zkPath, []byte(value), -1) } return }
// Create a path and any pieces required, think mkdir -p. // Intermediate znodes are always created empty. func CreateRecursive(zconn zkhelper.Conn, zkPath, value string, flags int, aclv []topo.ACL) (pathCreated string, err error) { parts := strings.Split(zkPath, "/") if parts[1] != zkhelper.MagicPrefix { return "", fmt.Errorf("zkutil: non /%v path: %v", zkhelper.MagicPrefix, zkPath) } pathCreated, err = zconn.Create(zkPath, []byte(value), int32(flags), aclv) if zkhelper.ZkErrorEqual(err, topo.ErrNoNode) { // Make sure that nodes are either "file" or "directory" to mirror file system // semantics. dirAclv := make([]topo.ACL, len(aclv)) for i, acl := range aclv { dirAclv[i] = acl dirAclv[i].Perms = zkhelper.PERM_DIRECTORY } _, err = CreateRecursive(zconn, os_path.Dir(zkPath), "", 0, dirAclv) if err != nil && !zkhelper.ZkErrorEqual(err, topo.ErrNodeExists) { return "", err } pathCreated, err = zconn.Create(zkPath, []byte(value), int32(flags), aclv) } return }