Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ChunkServerImpl::RemoveObsoleteBlocks会删除正在写的文件 #31

Closed
bluebore opened this issue May 28, 2015 · 10 comments
Closed

ChunkServerImpl::RemoveObsoleteBlocks会删除正在写的文件 #31

bluebore opened this issue May 28, 2015 · 10 comments

Comments

@bluebore
Copy link
Collaborator

从日志分析看,16:59:03时,block被ChunkServerImpl::RemoveObsoleteBlocks给删了,具体原因我还没找到:
chunkserver日志:
05/27 16:59:02.873031 30287 [src/chunkserver/chunkserver_impl.cc:685] Writeblock send [bid:10015, seq:427] to next yq01-tera64.yq01.baidu.com:8825
05/27 16:59:02.873835 30253 [src/chunkserver/chunkserver_impl.cc:729] Writeblock send [bid:10015, seq:427] to next done
05/27 16:59:02.873874 30253 [src/chunkserver/chunkserver_impl.cc:752] WriteBlock done [bid:10015, seq:427, offset:28667909, len:49603]
05/27 16:59:02.930921 30285 [src/chunkserver/chunkserver_impl.cc:653] [WriteBlock] [bid:10015, seq:428, offset:28717512, len:0] 1432717142922856
05/27 16:59:02.930941 30285 [src/chunkserver/chunkserver_impl.cc:685] Writeblock send [bid:10015, seq:428] to next yq01-tera64.yq01.baidu.com:8825
05/27 16:59:03.606987 30256 [src/chunkserver/chunkserver_impl.cc:729] Writeblock send [bid:10015, seq:428] to next done
05/27 16:59:03.615835 30286 [src/chunkserver/chunkserver_impl.cc:487] Remove meta info done: 10015
05/27 16:59:03.621214 30286 [src/chunkserver/chunkserver_impl.cc:104] Block 10015 deleted
05/27 16:59:03.730070 30256 [src/chunkserver/chunkserver_impl.cc:203] Write block 10015 offset[28717512] block_size[0] not in sliding window
05/27 16:59:03.735733 30285 [src/chunkserver/chunkserver_impl.cc:653] [WriteBlock] [bid:10015, seq:428, offset:28717512, len:0] 1432717142922856

@bluebore bluebore added bug and removed bug labels May 28, 2015
@bluebore
Copy link
Collaborator Author

问题应该在sdk,在还有BackgroundWrite运行时,就close成功了,导致文件被删除后还在写。

@yvxiang
Copy link
Collaborator

yvxiang commented May 28, 2015

我下午复现一下这个问题。

@yvxiang
Copy link
Collaborator

yvxiang commented May 28, 2015

我初步的认为情况可能是这样的:
当前每个block接收Buffer的sliding window大小为100。如果文件在写的时候被删除,那么会将该block的信息在chunkserver的block_map中删除,同时减少这个block的引用记数。在写完一个packet之后,也会减少这个block的引用,这时很有可能引用记数达到0(如果当前没有读者的话),从而引起block结构的析构,继而销毁sliding window。而写者对此并不感知,继续写。当下一个packet到达chunkserver时,WriteNextBlockCallback中FindBlock处设置的为create_if_missing = true,则会新建一个这个block的信息。但是放到sliding window中时还是使用原来的seq。这样,重复若干次之后,seq超过100,从而引起Block::Write中的assert(0)
在我的机器上这个场景是可以复现的,只要要写的文件大小能够使seq超过100,并且写文件过程中,文件被删除即可。

@yvxiang
Copy link
Collaborator

yvxiang commented May 28, 2015

解决方案很简单,只要在WritNextCallBack中FindBlock前判断一下seq是否为0即可。
但问题是,为什么文件在写的时候被删除呢?还是说tera中的确有这种场景?
至于还在BackgroudWrite写时,文件就close成功我还没有复现出来。

@bluebore
Copy link
Collaborator Author

这里有两种场景

  1. 你模拟出来的那种,文件在写的时候,就被删除了,会出问题,这个是我们设计没考虑到的。
  2. tera中每个文件都是由单一机器中的单一线程操作的,在写的过程中不会被删除,我遇到的场景是写完了,close成功后,删除,但还有后台写操作在。这应该是一个bug。

@yvxiang
Copy link
Collaborator

yvxiang commented May 29, 2015

从发起文件删除命令,到block被真正在chunkserver上删除,至少要经过一次block report的时间,也就是60s。chunkserver上的block是在16:59被删除的,16:58附近nameserver上的LOG有吗?以及SDK部分的LOG

@yvxiang
Copy link
Collaborator

yvxiang commented May 29, 2015

seq为428的packet长度为0,说明之前的所有包都已经被写完了,调用close时发送了一个空的包。在这个时间点附近应该可以找到bfs_wrapper中close file的LOG

@yvxiang
Copy link
Collaborator

yvxiang commented May 30, 2015

seq为427的packet长度为49603,不是256 * 1024的整数倍,而且后面seq为428的packet长度为0,说明文件是在sync之后紧接着被close的。
先sync再close再删除,我测试了大概50GB的数据,没有复现出log中的情况……所以我感觉只能进一步分析更完整的日志来排查原因了。

@bluebore
Copy link
Collaborator Author

bluebore commented Jun 1, 2015

这个周末我出去了,今天我继续跟进下这个问题。
现在怀疑是用户close返回之前,就将文件删除了。

@bluebore
Copy link
Collaborator Author

bluebore commented Jun 5, 2015

上层应用在Close返回之前,就删除了文件,导致还未完成的写操作失败。当前解决方法是针对写操作中的失败,设置后台错误标志,在用户进行下次close或者sync时返回失败。
6956a5e

@bluebore bluebore closed this as completed Jun 5, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants