复制运行中的沙箱
创建 count 个沙箱,它们从此刻起接着运行,内存、进程和磁盘都与原沙箱相同,各自有自己的 id、主机名和网络。要么全部创建成功,要么一个都不留。副本沿用原沙箱的设置;共享存储卷会随副本一起挂载,非共享存储卷则会导致无法复制。会唤醒沙箱。
如果节点会把磁盘复制到对象存储,副本的磁盘要先完整上传到那里,之后写入副本的内容才算已复制。所需时间等于原沙箱磁盘的数据量除以节点链路分给这类复制的带宽:在一台开发机上测得(对象存储相距 33 毫秒),节点上没有其他写入时,1 GiB 用 2 秒、4 GiB 用 8 秒;旁边有十块磁盘在全速写入时,4 GiB 用 23 秒(其他磁盘有数据要发送时,节点四分之一的连接留给这类复制)。这类复制按所有者 (X-Sandbox-Owner) 轮流进行(在不属于任何控制平面的节点上,所有沙箱的所有者都相同),同一所有者内先创建的先复制:一次调用创建的八个 2 GiB 副本依次完成,第一个用 5 秒,最后一个用 35 秒;而另一个所有者晚一秒创建的 256 MiB 副本 1.3 秒就完成了,不用等它们。在磁盘上传完成之前,副本根本不在对象存储中:宿主机丢失时,副本也随之丢失。在此期间,副本对磁盘的写入要等待,从第一次写入之后 0.9 秒开始;读取以及其他不写磁盘的操作照常进行。
所需权限范围:write。
https://api.glac.ai/v1/sandboxes/{id}/fork授权
路径参数
请求头参数
请求体JSON可选
Returns
201
副本列表,格式与列表调用的响应相同。
400
请求不符合本调用的要求。invalid_json:请求体不是 JSON 对象;unknown_field:请求体中有本调用不接受的字段;unknown_parameter:查询中有本调用不接受的参数;invalid_field:某个字段或查询参数类型错误或超出范围;invalid_idempotency_key:Idempotency-Key 为空或超过 255 个字符。
401
missing_api_key, invalid_api_key, expired_api_key, invalid_token.
403
凭据无权执行此操作。needs_api_key:沙箱令牌不能执行此操作。spend_limit_reached:沙箱因达到支出上限而被冻结;它会连同数据一起休眠,直到上限提高。account_share_reached:账户在本节点数据盘上没有足够的空间容纳这些副本(见 GET /internal/node 的 drive.accounts):它们所依据的快照,或者每个副本的内存外加 1 GB 的写入空间。没有创建任何东西。
404
请求中指定的对象不存在。sandbox_not_found:沙箱不存在。
409
某个对象的状态不允许此操作。exclusive_volume_attached:沙箱挂载了非共享存储卷;sandbox_failed:沙箱处于 failed 状态;idempotency_key_reused:该键已与另一个请求体一起使用过;idempotency_in_progress:使用该键的第一个请求仍在执行;busy:一次没有完成的挂载之后,某个存储卷仍占着沙箱的一个空余磁盘(客户机对它的读取被卡住,是一个数据块迟迟不来的云盘),等读取结束后才会卸下;或者沙箱的客户机在它的某个云盘上有一次读取被卡住(数据块迟迟不来:错误信息会指明是哪个云盘以及卡了多久),直到那次读取结束:稍后再次发起同一调用即可。static_instance:该沙箱是节点按静态配置维护的实例 (GET /internal/static):复制它会让其中运行的服务多出一份。
default
其他任何失败,格式相同。internal (500):节点出错;错误信息不会多说,节点日志中以请求的 id 记录了原因。unavailable(503,可重试):no_capacity,节点的网络槽位都已占用;memory_full,调用需要启动的虚拟机(创建、唤醒、从磁盘启动、恢复、回滚、构建)在宿主机内存中放不下(还要算上已承诺给其上运行的虚拟机的内存),也没有暂停或空闲的虚拟机可以让其休眠来腾出空间(节点的 memory);drive_full,调用需要构建模板,而节点的数据盘没有空间(节点的 drive);unavailable,节点正在关闭、沙箱 10 分钟后仍处于 starting、沙箱没有响应,或者沙箱正在迁到本节点(带 Retry-After: 1);fenced,节点的租约隔离了该沙箱 (Node.lease)。moved (409):沙箱已迁到另一个节点,由 to 指明。