我开始使用我们的自动构建,这是一种奇怪的行为.我有一个非常简单的Windows服务.msi(内置在Visual Studio 2010中),它在我们的中央构建/ repo服务器上编译,上传到我们的开发服务器,然后从构建/ repo服务器远程安装(命令行)在开发服务器上通过ssh使用plink).
这工作很长一段时间,直到最近自动化构建开始100%失败.msi的详细安装日志表明"已安装此产品的较新版本".我远程进入开发服务器,检查了msi,并且在服务器上自己手动安装它没有问题(通过命令行和GUI).然后,我从"程序和功能"窗口中卸载了该服务,验证了文件和条目已被删除,再次尝试从构建服务器远程安装它,并再次得到完全相同的错误.该服务不会远程安装,因为它认为仍然安装了较新的服务(即使我已经卸载它),但我可以自己手动完成.
编辑
添加一些日志文本.
Action start 15:47:16: AppSearch.
MSI (s) (B8:F0) [15:47:16:265]: Doing action: FindRelatedProducts
Action ended 15:47:16: AppSearch. Return value 1.
MSI (s) (B8:F0) [15:47:16:267]: Using cached product context: User non-assigned for product: BA4139E4B48F8264ABFF918A7B583A0B
MSI (s) (B8:F0) [15:47:16:267]: Using cached product context: User non-assigned for product: BA4139E4B48F8264ABFF918A7B583A0B
MSI (s) (B8:F0) [15:47:16:267]: Using cached product context: User non-assigned for product: BA4139E4B48F8264ABFF918A7B583A0B
MSI (s) (B8:F0) [15:47:16:267]: Using cached product context: User non-assigned for product: BA4139E4B48F8264ABFF918A7B583A0B …Run Code Online (Sandbox Code Playgroud) 我们正在使用适用于.NET的AWS开发工具包,但我试图指出我们的使用者应用程序似乎出现同步问题的地方。基本上,我们有一个推式服务,该服务生成更改集文件并上载到S3,我们的客户应用程序应该下载这些文件并应用它们,以便同步到正确的状态,这是没有发生的。
关于正确的日期戳表示什么/在何处存在一些矛盾的观点。我们的消费者写信给s3文件的“ LastModified”字段,以对下载的文件进行排序以进行处理,我不知道该字段代表什么。起初我以为它代表修改/我们上传的,那么(所看到的文件的创建日期在这里),它实际上代表当文件被上传的新日期戳,以及同样在相同的链接似乎暗示,当下载文件后,它恢复为旧的时间戳(但我无法确认)。
我们正在使用此代码片段来提取文件
// Get a list of the latest changesets since the last successful full update.
Amazon.S3.AmazonS3Client client = ...;
List<Amazon.S3.Model.S3Object> listObjects = client.GetFullObjectList(
this.Settings.GetS3ListObjectsRequest(this.Settings.S3ChangesetSubBucket),
Amazon.S3.AmazonS3Client.DateComparisonType.GreaterThan,
lastModifiedDate,
Amazon.S3.AmazonS3Client.StringTokenComparisonType.MustContainAll,
this.Settings.RequiredChangesetPathTokens);
Run Code Online (Sandbox Code Playgroud)
然后按S3Object的LastModified排序(我认为这是我们的假设错误的地方)
foreach (Amazon.S3.Model.S3Object obj in listObjects)
{
if (DateTime.Parse(obj.LastModified) > lastModifiedDate)
{
//it's a new file, so we use insertion sort to put this file in an ordered list
//based on LastModified
}
}
Run Code Online (Sandbox Code Playgroud)
我是否假设我们应该做更多的事情来保留我们自己需要的日期戳,例如使用自定义标头/元数据对象将正确的日期戳放置在所需的文件上,或者甚至将其放置在文件名中?
编辑
也许这个问题可以回答我的问题:如果我的服务有2个文件要上传到S3并经过此过程,我是否保证这些文件按它们上传(通过LastModified)的顺序显示在S3 中?异步处理是否会导致我的文件在S3对象列表中出现乱序?我担心的情况是,例如,我的服务上传了文件A,然后B,B在S3中首先出现,我的使用者获得+进程B,然后出现A,然后我的使用者可能获得或可能不获得A,错误地处理它,以为它不是较新的吗?
编辑2
就像我和下面的人所怀疑的那样,我们在某些赛车条件下试图盲目地依赖S3的日期戳来应用变更集。作为附录,我们最终进行了2个修复,以尝试解决该问题,这对其他人也可能有用:
首先,为了解决我们的上传完成时间与S3报告的修改日期之间的竞争状况,我们决定使所有查询都比从S3中提取的文件中读取的最后修改日期早1秒。在检查此修复程序时,我们看到了S3中另一个以前未发现的问题,即S3不保留时间戳的毫秒数 …